By:liu guo qing
3.3.1 SOCKET初始化
为了实现TCP 通信,需要对SOCKET进行初始化设置并打开SOCKET。为了打开SOCKET,选择其中的一个SOCKET(被选择的SOCKET称之为SOCKETn), 通过
SOCKETn 模式寄存器(Sn_MR) 和SOCKETn源端口号寄存器(Sn_PORTR)分别设置通信协议和本机端口号(在TCP 服务器模式,称之为侦听端口号),然后执行OPEN 命令。执行完OPEN 命令后,如果Sn_SSR 改变为SOCK_INIT,则SOCKET的初始化设置完成。 3.3.1.1
SOCKETn 模式寄存器设置
SOCKETn模式寄存器(Sn_MR)用于配置SOCKET的协议类型及相关一些选项。
? Sn_MR寄存器地址:0x200(0x240、0x280)
? Sn_MR寄存器配置值:0x0121(队列对齐、允许无延时响应、TCP模式) 下表2.3.1.1-1为SOCKETn模式寄存器(Sn_MR)的配置位说明:
表3.3.1.1-1 Sn_MR寄存器
位 Sn_MR[15:9] Sn_MR[8] 符号 - ALIGN 保留 队列对齐 0:不使用对齐 1:使用对齐 说明 只有在TCP 模式下有效,在TCP 通信过程中,当每次收到的数据包的字节数为偶数且该位置为?1?时,接收数据可直接删去附在接收数据包中的PACKET-INFO(数据的字节数),使读取数据的操作大大增强。 Sn_MR[7] MULTI 多播 0:禁止多播 1:允许多播 只有在UDP模式下有效 Sn_MR[6] MF MAC地址过滤 0:禁止MAC地址过滤 1:允许MAC地址过滤 只有在MACRAW模式下有效 Sn_MR[5] ND 使用无延时的ACK 0:禁止延时ACK选项 1:允许延时ACK选项 只有在TCP 模式下有效,当该位置?1?,收到对端的数据包后立即发送ACK数据包响应。建议将该位置?1?,以提高TCP 通信的性能。 Sn_MR[4] Sn_MR[3:0] - P[3:0] 保留 协议类型。 它用于配置每个SOCKET的通信协议(TCP、UDP、IPRAW,MACRAW等)或PPPoE SOCKET与PPPoE服务器之间的操作。 4?b0000 : SOCKET Closed; 4?b0001 : TCP; 4?bxxx0 :其它 11 / 27
By:liu guo qing
3.3.1.2 SOCKETn中断屏蔽寄存器设置
SOCKETn中断屏蔽寄存器(Sn_IMR)配置SOCKETn 向主机产生的中断,Sn_IMR的中断屏蔽位与SOCKETn中断寄存器(Sn_IR)是对应的。参考2.2.3主机中断设置。
? Sn_IMR寄存器地址:0x204(0x244、0x284)
? Sn_IMR寄存器配置值:0x001B(send_OK、timeout、discon、con)
下表3.3.1.2-1为Sn_IR寄存器的位说明,可以根据Sn_IR寄存器对Sn_IMR寄存器进行配置:
表3.3.1.2-1 IR寄存器
位 Sn_IR[7] Sn_IR[6] Sn_IR[5] Sn_IR[4] Sn_IR [3] Sn_IR [2] Sn_IR [1] Sn_IR[0] 符号 PRECV PFAIL PNEXT SENDOK TIMEOUT RECV DISCON CON PPP接收中断 说明 接收到不支持的可选数据(Option Data)时,该位置位。 PPP失败中断 PAP认证失败时该位置位 PPP下一过程中断 在PPPoE连接过程中,该过程改变时置位 发送完成中断 SEND 命令完成后置位 超时中断 在ARP和TCP 过程中超时置位 接收数据中断 端口从对端接收到数据时置位 断开连接中断 接收到从对端来的FIN或FIN/ACK 数据包时置位 连接中断 与对端成功建立连接时置位 3.3.1.3 SOCKETn目的IP 地址寄存器
在TCP 客户端模式下,运行CONNECT 命令之前,必须将SOCKETn目的IP 地址寄存器(Sn_DIPR)设置为TCP 服务器的IP 地址。而在TCP 服务器模式,当成功建立连接以后,它被W5300自动配置为TCP 客户端的IP 地址。
? Sn_DIPR 0寄存器地址:0x214(0x254、0x294) ? Sn_DIPR 0寄存器配置值:DIPR [31:16]
? Sn_DIPR 1寄存器地址:0x216(0x256、0x296) ? Sn_DIPR 1寄存器配置值:DIPR [15:0] 3.3.1.4
端口号寄存器设置
端口号寄存器设置包括对SOCKETn源端口号寄存器(Sn_PORTR)和SOCKETn目的端口号寄存器(Sn_DPORTR)的配置。
1) SOCKETn源端口号寄存器(Sn_PORTR)用于配置源端口的端口号,必须在OPEN
12 / 27
By:liu guo qing
命令之前设置。
? Sn_PORTR寄存器地址: 0x20A(0x24A、0x28A) ? Sn_PORTR寄存器配置值: 2) SOCKETn目的端口号寄存器(Sn_DPORTR)用于设置SOCKETn 的目的端口号。
在TCP 客户端模式下运行CONNECT 命令之前,需要将它设置为处于TCP 服务器模式下的侦听端口的端口号。而在TCP 服务器模式,当成功建立连接以后,它被W5300自动配置为TCP 客户端的端口号。
? Sn_DPORTR寄存器地址:0x212(0x252、0x252) ? Sn_DPORTR寄存器配置值:
3.3.2 SOCKET建链
基于TCP模式的SOCKET建链,建链过程中需要配置及查询SOCKETn命令寄存器(Sn_CR)、SOCKETn中断寄存器(Sn_IR)和SOCKETn 状态寄存器(Sn_SSR)。
? SOCKETn命令寄存器地址:0x202(0x242、0x282) ? SOCKETn中断寄存器地址:0x206(0x246、0x286) ? SOCKETn 状态寄存器地址:0x208(0x248、0x288) 下表3.3.2-1为SOCKETn命令寄存器说明:
表3.3.2-1 SOCKETn命令寄存器
值 0x01 0x02 命令 OPEN 侦听 LISTEN 说明 打开端口 它根据Sn_MR(P3~P0)所定义的协议类型初始化端口并打开端口 只有在TCP 模式下有效(Sn_MR(P3:P0)=Sn_MR _TCP) 它将SOCKETn 设置为TCP 服务器模式。 它将改变Sn_SSR 寄存器的SOCK_INIT为SOCK_LISTEN,以等待其它TCP 客户端的连接请求(SYN数据包) 当Sn_SSR 为SOCK_LISTEN 且成功处理了其它TCP 客户端的连接请求时,Sn_IR(0)将置?1 ?,而Sn_SSR 变为SOCK_ESTABLISHED。如果没有处理连接请求(SYN/ACK 传输失败),TCP 产生超时(Sn_IR(3)=1)且Sn_SSR 变为SOCK_CLOSED 0x04 连接 CONNECT 它将端口设置为TCP 客户端模式 它发送连接请求到由Sn_DIPR和Sn_DPORTR 指定的TCP 服务器。 当连接请求被成功处理(收到SYN/ACK数据包),Sn_IR(0) 置?1?,且Sn_SSR的状态变为SOCK_ESTABLISHED 。 如果连接失败,可能有三种情况 1. ARP 产生超时,因为目标硬件地址无法获得 2. 没有收到SYN/ACK数据包而产生超时(Sn_IR(3)=1) 3. 收到RST 数据包而不是SYN/ACK数据包 以上三种情况Sn_SSR 都将变为SOCK_CLOSED状态 0x08 断开连接 不论是TCP 服务器还是客户端,它都将执行断开连接的处理。 DISCON 1. 主动关闭:它发送断开连接的请求(FIN 数据包)到连接的对端 2. 被动关闭:当收到对端的断开连接请求(FIN 数据包)时,它发送FIN数据包。 如果断开连接成功( 收到对端的FIN/ACK 数据包) ,Sn_SSR 的状态将变为SOCK_CLOSED。 13 / 27
By:liu guo qing
如果断开连接失败,产生TCP 超时(Sn_IR(3)=1) 且Sn_SSR 的状态变为 SOCK_CLOSED。 另外,如果直接使用CLOSE命令而不是DISCON 命令,只有Sn_SSR 的状态变为SOCK_CLOSED,不产生断开连接的处理(断开连接的请求)。如果在通信过程中收到对端发送来的RST 数据包,Sn_SSR 无条件变为SOCK_CLOSED状态。 0x10 0x20 端口关闭 关闭端口,Sn_SSR 的状态变为SOCK_CLOSED。 CLOSE 发送数据 启动数据发送,发送的字节长度由Sn_TX_WRSR确定。 SEND 当发送过程结束,Sn_IR(SENDOK)将置1,主机检测到Sn_IR(SENDOK)=1 后,可以进行下一次的传输。 如果通过SEND 命令数据包成功传输到对端(当收到对端的DATA/ACK数据包),Sn_TX_FSR根据传输的数据长度自动增加。如果没有传输成功(没有收到DATA/ACK 的数据包),将产生超时(Sn_IR(3)=1),且Sn_SSR 进入SOCK_CLOSED状态。 另外,主机在使用SEND 命令发送数据之前,首先通过Sn_TX_FIFOR寄存器将数据写入到TX存储器,然后写入要发送数据的字节数到Sn_TX_WRSR。 0x40 接收数据 它表示主机接收到SOCKETn 的数据 在使用RECV 命令前,主机需要RECV 通过Sn_RX_FIFOR 寄存器从RX存储器读取接收的数据。
下表3.3.2-2为SOCKETn状态寄存器中与TCP模式相关的说明:
表3.3.2-2 SOCKETn状态寄存器
值 0x00 符号 SOCK_CLOSED SOCKETn 端口资源释放状态 说明 当执行DISCON 或CLOSE命令,或产生ARP、TCP 超时,不管以前是什么状态,此时它都变为SOCK_CLOSED状态 0x13 SOCK_INIT SOCKETn 以TCP 模式打开时的状态 当Sn_MR(P3~P0)为Sn_MR_TCP 且执行OPEN 命令时,它变为SOCK_INIT状态。它是建立TCP 连接的第一步。 这时可以使用LISTEN命令设置TCP 服务器模式,或CONNECT 命令设置TCP客户端模式 0x14 SOCK_LISTEN 它是SOCKETn 在TCP 服务器状态 等待TCP 客户端的连接请求(SYN 数据包)当运行LISTEN命令时,它改变为SOCK_LISTEN 状态。 当成功处理了TCP 客户端的连接请求(SYN 数据包) ,SOCK_LISTEN 变为SOCK_ESTABLISHED。如果失败,将产生超时中断(Sn_IR(TIMEOUT)= 1) ,且状态改变为SOCK_CLOSED 0x17 SOCK_ESTABLISHED 它是TCP 建立连接的状态 在SOCK_LISTEN 状态,收到TCP 客户端SYN数据包并成功处理,它将变成SOCK_ESTABLISHED,或CONNECT命令成功运行。在这种状态,可以进行数据传输,即可以运行SEND 或RECV 命令。 0x1C SOCK_CLOSE_WAIT 该状态是收到对端断开连接请求(FIN 数据包) 由于TCP 连接处于半关闭状态,但可以进行数据传输。为了彻底断开TCP 连接,必须执行DISCON 命令。如果关闭SOCKEn而没有断开连 14 / 27
By:liu guo qing
接的处理,可以只运行CLOSE命令 0x15 SOCK_SYNSENT 该状态表示连接请求(SYN 数据包)发送到TCP 服务器 该状态显示CONNECT 命令从SOCK_INIT到SOCK_ESTABLISHED的状态改变过程 在这种状态,如果收到TCP服务器允许连接信息(SYN/ACK 数据包) ,状态自动转换为SOCK_ESTABLISHED 。如果在产生TCP 超时 (Sn_IR(TIMEOUT)=1)之前没有收到TCP 服务器的SYN/ACK数据包,那么它自动转变为SOCK_CLOSED 0x16 SOCK_SYNRECV 该状态表示收到TCP 客户端的连接请求(SYN 数据包) 当W5300向TCP 客户端发出允许连接(SYN/ACK 数据包)信息后,它自动变换为SOCK_ESTABLISHED。如果失败,将产生超时 (Sn_IR(TIMEOUT)=1),且改变为SOCK_CLOSED 0x18 0X1B 0X1D SOCK_FIN_WAIT SOCK_TIME _WAIT SOCK_LAST_ACK SOCKETn 被关闭的状态 当SOCKET完成主动关闭或被动关闭的断开连接处理时出现这种状态。当成断开连接处理或TCP 超时(Sn_IR (TIMEOUT)=1),它的状态将改变为SOCK_CLOSED 3.3.2.1 SOCKET打开
运行OPEN命令将所操作的SOCKET打开。
1) 打开设置
向SOCKETn命令寄存器(Sn_CR)写入OPEN命令:0x01; 2) 打开状态查询
读取SOCKETn 状态寄存器(Sn_SSR),如果寄存器值为0x13(SOCK_LISTEN), SOCKET即处于打开状态。 3.3.2.2
SOCKET侦听
运行LISTEN命令将W5300设置为TCP 服务器模式。 1) 侦听设置
向SOCKETn命令寄存器(Sn_CR)写入LISTEN命令:0x02; 2) 侦听状态查询
读取SOCKETn 状态寄存器(Sn_SSR),如果寄存器值为0x14(SOCK_LISTEN),SOCKET即处于侦听状态。 3.3.2.3
SOCKET链接
运行CONNECT命令将W5300设置为TCP 服务器模式。 1) 链接设置
向SOCKETn命令寄存器(Sn_CR)写入CONNECT命令:0x03; 2) 链接状态查询
读取SOCKETn 状态寄存器(Sn_SSR),如果寄存器值为
0x17(SOCK_ESTABLISHED),或者检测到SOCKETn中断寄存器Sn_IR[0]被置为?1?,则SOCKET即处于链接状态。链接成功后,需要将Sn_IR[0]的中断标识清除。
15 / 27