tag 标签: tcpip内核

相关博文
  • 热度 23
    2013-2-7 15:05
    1381 次阅读|
    0 个评论
    继续给大家介绍W7100A功能描述,电气特性,IR回流焊温度简介(无铅封装)和封装说明的内容。 9.   功能描述 因为W7100A内部嵌入一个8051兼容的CPU内核和硬件的TCP/IP内核,它可以不需要其它 器件而独立工作。在这一节,将通过一些软件源代码,讲解7100A的初始化和每一种协议(TCP、UDP、IP raw、MACRAW)的通信方法。 9.1         初始化 W7100A的初始化分三个步骤:设置8051单片机,网络信息和内部TX/RX存储器。 l  步骤1:初始化MCU 1.中断设置 允许或禁止8051的中断。详细信息参考第3节”中断”。 2.存储器访问时序设置 通过CKCON(0x8E)和WTST(0x92)寄存器来设置存储器的访问时序。CKCON(0x8E)控制数据存储器的访问时序,而WTSR(0x92)控制程序存储器的访问时序,设置值为0~7之间。但W7100A的CKCON可以设置的值为1~7,而WTST(0x92)的值只能是4~7,其它值都无效。如果用户设置的值是一个无效值,W7100将不能够正常工作。详细信息请参考2.4节“SFR的定义”。 例:禁止中断,访问数据存储器2个时钟周期,访问程序存储器7个时钟周期,设置如下: 3.串口通信波特率,寄存器和中断的设置 1)设置W7100A串口通信的相关寄存器。 与串口相关的寄存器有:TMOD、PCON和SCON。  ①    TMOD(89H):确定串口通信的定时器/计数器模式。 SM 2 :       在模式2和模式3时使用。假设这位为’1’,如果接收到的第9位为’1’,则接收该数据,如果第9位为’0’,则忽略该数据。 REN:接收允许(‘1’允许接收)。 TB 8 : 在模式2和模式3,发送的第8位数据位。 RB 8 : 在模式2和模式3,接收的第8位数据位。 TI:   发送完成中断。 RI:   接收完成中断 2)初始化串口通信时必须设置中断状态。 因为串口通信使用中断,因此在初始化串口通信时用户必须禁止其它相关的中断。 3)设置用户使用的波特率。请参考6.6节’波特率设置的实例’了解W7100用于产生波特率的定时器。定时器的波特率计算如下: ①    timer1计算公式 TH1 = 256 – ((K * 88.4736MHz) / (384 * 波特率)) K = ‘1’ at SMOD = ‘0’, K = ‘2’ at SMOD = ‘1’ ②    timer2计算公式 (RCAP2H, RCAP2L) = 65536 – (88.4736MHz / (32 * 波特率)) 例:使用Timer1的模式2,SMOD = 1,时钟频率 = 88.4736MHz,波特率 = 115200 步骤2:设置网络信息 1.网络通信的基本信息 必须设置的网络基本信息有: (1)SHAR(源硬件地址寄存器) 源硬件地址由SHAR设置,必须说明的是在以太网MAC层的物理地址(MAC地址)一定是唯一的。IEEE管理MAC地址的分配。网络设备的制造商给产品分配MAC地址。物理地址分配到详细信息请参考下面网址: http://www.ieee.org/,http://standards.ieee.org/regauth/oui/index.shtml (2)GAR(网关地址寄存器) (3)SUBR(子网掩码寄存器) (4)SIPR(源IP地址寄存器) 2.数据包发送失败时,设置重发时间和次数 为了设置重发时间,寄存器需要设置如下: (1)RTR(重发时间寄存器),RTR的’1’代表’100us’。 (2)RCR(重发次数寄存器) 步骤3:分配SOCKET n的内部TX/RX存储器 每一个可配置的TX/RX存储器的最大长度为16K字节。在16K字节的范围内,用户可以将存储器给8个SOCKET任意分配为1K、2K、4K、8K、16K字节。但是TX和RX存储器的设置的总和不能超过16K字节。(TX MAX =16KB,RX MAX =16KB) 图9.1 SOCKET n内部TX/RX存储器的分配 完成W7100A的这三步初始化,W7100A就可以通过以太网进行数据传输。此时,W7100A可以响应来自于网络的Ping请求。     9.2         数据通信 初始化过程完成以后,W7100A就可以以TCP、UDP、IPRAW或MACRAW的模式打开SOCKET,并发送和接收数据。W7100A支持8个端口以不同的方式同时进行工作。在这一节将介绍每一种方式的通信方法。 9.2.1   TCP TCP是一种面向连接的协议。TCP使用本机IP地址/端口号和目的IP地址/端口号产生连接。发送和接收数据都是通过这个连接的端SOCKET。 建立到SOCKET连接的方法是TCP服务器和TCP客户端。它们的区别是谁主动发出连接请求(SYN数据包)。 TCP服务器监听来自TCP客户端的连接请求,接收发送的连接请求(被动打开),并产生连接。 TCP客户端发出连接请求到TCP服务器(主动打开),并产生连接。 图9.2 TCP服务器和TCP客户端 9.2.1.1       服务器   图9.3 “TCP服务器”操作流程 SOCKET初始化 TCP数据通信需要对SOCKET进行初始化设置。初始化过程首先选择W7100A的一个SOCKET(从W7100A的8个SOCKET中),设置协议模式(Sn_MR(P3:P0))和设置源端口号Sn_PORT0(TCP服务器的监听端口号)。然后运行OPEN指令。执行OPEN命令后如果端口的状态Sn_SR改变为SOCK_INIT,那么端口的初始化就完成了。 TCP服务器和TCP客户端的端口初始化是完全相同的端口初始化为TCP模式的操作如下: 建立连接 当SOCKET的状态Sn_SR为SOCK_LISTEN时,如果它收到SYN数据包,Sn_SR的状态将改变为SOCK_SYNRECV,并发送一个SYN/ACK数据包,然后SOCKET n建立连接。SOCKET n建立连接以后才允许进行数据通信。有两种方法可以验证SOCKET n是否建立连接。 第一种方法:当收到数据包时,Sn_IR(RECV)置为1,如果主机在接收下一个数据包之前没有置上一个Sn_IR(RECV)为’1’,那么W7100将不能够识别下一个数据包的Sn_I(RECV),这是由于上一个Sn_IR(RECV)和后面的Sn_IR(RECV)重叠所致。因此,如果主机不能完全处理每一个Sn_IR(RECV)的数据包,则不推荐使用这种方法。 建立连接 : 接收过程 在这个过程中,它处理内部RX存储器接收的数据。在TCP模式下,如果接收的数据的字节长度超过端口当前RX存储器的剩余空间,W7100A不能接收数据。如果发生这种情况,W7100A将保持连接(暂停),并等待RX的剩余空间大于需要接收的数据字节长度。 在W7100A驱动程序中wiznetmemcpy.c文件中定义的wizmemecpy函数,使用Receive/Send过程来进行存储器数据的快速复制。更多详细信息请参考第13章,参考’W7100A性能提升’以了解其性能表现,参考’W7100A驱动指南’以了解其使用方法。如果用户不想使用wizmemcpy函数,那么使用普通的存储器复制函数即可。 由于W7100A内部同时具有数据存储器和TCPIP内核内部存储器,用户应该根据地址进行分类。所以用户必须在TCPIP内核内部存储器的最高级地址前加上’0xFE’,或者在从TCPIP内核存储器到数据存储器进行复制操作时,将DPX0寄存器设置为’0xFE’。关于wizmemcpy的更多详细信息请参考’W7100A驱动指南’。 建立连接 : 检查发送数据/发送过程 发送数据的字节长度不能超过SOCKET n TX存储器的大小。如果要传输的数据长度大于设置的MSS,它将按照MSS分段传输。 为了下一次数据的传输,用户必须检查上一次的SEND命令是否执行完成。如果上一次的SEND命令还没有执行完成又开始下一次的SEND命令,将会产生错误。数据越多,执行SEND命令所花费的时间越长。因此用户可以适当地将数据分段发送。 在发送过程中,用户必须将’0xFE’加到地址的最高地址,以指向TCPIP内核的存储器。 建立连接 : 超时 超时可能会发生在连接请求(SYN数据包)或其响应(SYN/ACK数据包)、数据通信或其响应(DATA/ACK数据包)、断开连接请求(FIN数据包)或其响应(FIN/ACK数据包),以及所有其它TCP数据包的传输。如果不能在RTR定义的时间和RCR定义的重发次数范围内完成上述数据包的传输,都将产生TCP的超时,Sn_SR的状态变为SOCK_CLOSED。确定TCP超时的方法如下: 9.2.1.2       客户端 除了”CONNECT”状态外,与TCP服务器完全一样。用户可参考9.2.1.1”TCP服务器”。 图9.4 “TCP客户端”操作流程 连接 发送连接请求(SYN数据包)到”TCP服务器”。当制造 “连接端口”到服务器时,可能会发生像ARP TO 、TCP TO 这样的超时现象。 9.2.2   UDP UDP是无连接的协议,它的通信是不需要SOCKET建立连接。TCP是一种面向连接的、可以保证可靠性的通信协议,但UDP采用数据报文的通信方式,数据传输的可靠性没有保障。但是,因为UDP不使用连接的SOCKET,因此它可以与多个已知IP地址的多个端口进行数据交换。这是它的优势。使用一个端口与其它端口通信也会带来很多问题,比如丢失传输的数据、或接收到其它端口来的不需要的数据等。在UDP模式下,为了避免出现这些问题,保证数据通信的可靠性,主机需要重发被损坏的数据或丢掉那些不需要的数据。UDP协议支持单播、广播和多播等通信方式。它遵循以下通信流程。 二进制 11011110.01100010.10101101.01111011 00000000.00000000.00000000.11111111 - 11011110.01100010.10101101.11111111 图9.5 UDP操作流程 9.2.2.1       单播和广播方式 单播是UDP的一种通信方式。它一次只能将数据传输给一个目的站点。而广播通信则使用广播地址(255.255.255.255),将数据发送给所有的可接收的目的站点。例如,假设用户将数据传输给目的站点A、B和C。单播是每一次将数据单独传输给A、B或C。在这种情况下,在获得目的站点A、B或C的物理地址时可能产生ARP超时。在产生ARP超时的时候是不能够将数据传输到目的地的。 广播则使用广播地址(255.255.255.255),可以一次同时将数据发送到目的站点A、B和C。这时不需要得到目的站点A、B或C的物理地址,因此不会产生ARP超时。 怎样建立广播IP? 广播IP地址可以通过子网掩码按位补码和主机IP地址的按位的逻辑或运算得到。 例:本机IP:222.98.173.123,子网掩码:255.255.255.0,则广播IP地址则为:222.98.173.255 SOCKET初始化 对要实现UDP通信,SOCKET必须进行初始化设置。打开SOCKET的操作过程如下:首先在W7100A的8个SOCKET中选择一个SOCKET为UDP的工作,并设置为UDP模式(Sn_MR(P3:P0)),然后设置本机端口号(Sn_PORT0),最后运行OPEN命令。执行OPEN命令后,如果Sn_SR状态改变为SOCK_UDP,则完成了端口的初始化设置。 图9.6 接收UDP数据的格式 接收的UDP数据包含8个字节的数据包信息和有效数据。数据包信息包括两个部分:发送者的信息(IP地址和端口号)和数据包的长度。UDP可以接收其它的很多UDP数据,用户可以通过发送者的信息区分UDP数据来源。它也接收以”255.255.255.255”的广播地址发送的信息。因此主机可以通过分析发送者的信息,丢掉那些不需要的数据。 如果要接收的数据长度大于SOCKET的RX存储器的剩余空间,用户将无法接收到数据,也不能够接收分段的数据。 检查发送数据/发送过程 用户想发送的数据的大小不能超过内部TX缓冲器能容纳的范围。如果比MTU大的话,会自动以MTU为单位进行划分然后发送。当用户想用广播方式时,Sn_DIPR0应被设置成”255.255.255.255” 检查发送完毕/超时 在继续发送数据之前,用户必须检查先前的SEND命令是不是已经完成了。发送的数据越多,发送需要的时间就越长。因此用户必须合理地将其要发送的数据进行划分。当用户发送UDP数据时可能发生ARP超时。如果ARP超时发生了,传输UDP数据失败。 9.2.2.2       多播 广播是与所有的、不确定的目的站点进行通信。但多播是与多个、但在多播组注册的目的站点进行通信。假如A、B和C是在一个特定的多播组里注册的站点。如果用户将数据传送到多播组(包含站点A),站点B和C也能够从站点A得到数据。为了使用多播通信,使用IGMP协议将目的站点列表注册到多播组。多播组包括:分组硬件地址、分组IP地址和分组端口号。用户不能够更改”分组硬件地址”和”分组IP地址”。但用户可以更改”分组端口号”。 分组硬件地址的选择范围在”01:00:5e:00:00:00”到”01:00:5e:7f:ff:ff”之间,而分组IP地址则使用D类地址, 范围从“224.0.0.0”到“239.255.255.255”。详细内容请参考官方网站: http://www.iana.org/assignments/multicast-addresses. 在选择时,6个字节的”分组硬件地址”的高23位硬件地址和4个字节的”分组IP地址”必须相同。例如,如果用户选择的分组IP地址为”244.1.1.11”,那么分组硬件地址为”01:00:5e:01:01:0b”。详细信息请参考RFC1112:http://www.ietf.org/rfc.html 在W7100A内部,IGMP处理多播注册是由内部(自动)完成的。当用户以多播的模式打开端口时,”Join”信息将在内部自动传送。如果用户关闭端口,”Leave”信息将在内部自动传送。端口打开以后,”Report”信息将在数据传输过程中每隔一定的时间传送。 W7100A支持IGMP v1和v2版本。如果用户想使用一个升级的版本,主机可以使用IPRAW模式直接处理IGMP。 SOCKET初始化 从W7100A的8个端口中选择一个以进行多播。将”多播分组MAC地址”设为Sn_DHAR0,将”多播分组IP地址”设为Sn_DIPR0。然后将”多播分组端口号”设为Sn_PORT0和Sn_DPORT0。设置Sn_MR(P3:P0)成为UDP模式,将Sn_MR(MULT1)设置为1。最后执行OPEN(打开)命令。如果Sn_SR的状态在OPEN命令之后被改为SOCK_UDP,端口初始化就完成了。 检查接收到的数据 请参考9.2.2.1”单播方式和广播方式” 接收过程 请参考9.2.2.1”单播方式和广播方式” 检查发送数据/发送过程 因为用户在端口初始化中设置了多播分组的信息,因此用户不必再设置目的设备的IP地址和端口号。因此,复制要传送的数据到内部TX缓冲区,执行SEND命令就可以了。 l  检查完成/SOCKET关闭 参考9.2.2.1”单播广播”9.2.3   IPRAW IPRAW属于IP层的数据通信,它是比TCP、UDP低一层协议。IPRAW支持IP层的协议,如ICMP(0x01)和IGMP(0x02),由协议号决定。ICMP的’ping’功能和IGMP v1/v2已经在W7100A中由硬件实现。如果用户需要,主机可以将SOCKET n以IPRAW的模式打开,直接处理IPRAW的数据。在使用IPRAW模式时,用户必须设置IP包头中用户所使用的协议号。协议号由IANA定义,请参考官方网站: http://www.iana.org/assignments/protocol-numbers。 在打开SOCKET之前,必须由Sn_PROTO先定义协议号。W7100A在IPRAW模式下不支持TCP(0x06)和UDP(0x11)。IPRAW模式的SOCKET通信只支持设定的协议号通信。ICMP的SOCKET不能接收非设定的协议数据,如IGMP。  图9.7 IPRAW操作流程 端口初始化 选择端口,设置协议号,然后设置Sn_MR(P3:P0)到IPRAW模式,执行”OPEN”命令。如果Sn_SR在”OPEN”命令之后转化到了SOCK_IPRAW,端口初始化就完成了。 检查接收数据 参考9.2.2.1”单播和广播模式” 接收过程 处理内部RX存储器的IPRAW数据。接收到的IPRAW数据的结构如下: 图9.10 接收MACRAW数据格式 MACRAW数据包含”包信息”,”数据包”和4字节的循环校验码。”包信息”是数据包的长度,”数据包”包括6字节的”目的MAC地址”,6字节的”源MAC地址”和2字节的”类型”,46-1500字节的实际传输数据。”实际传输数据”包括网络协议,如根据”类型”而定的ARP,IP。关于详细的”类型”信息,清参考下面网站:(Uhttp://www.iana.org/assignments/ethernet-numbersU) 注意 如果内部RX存储器的剩余空间比MACRAW数据小的话,存于内部RX缓存中的一些包信息和数据包会偶然性地出现一些问题。因为这样的问题是出于包信息的分析错误,所用它不能正确地处理MACRAW数据。越接近RX存储器大小,错误发生率越高。如果用户可以允许MACRAW数据有部分丢失,这个问题就可以解决。 解决办法如下: 尽快地处理内部RX存储器中的数据以避免它接近缓存的最大限。 在样例代码中对SOCKET进行初始化的部分,通过设置S0_MR的MF位(MAC过滤器)以实现对MACRAW数据的选择性接收,从而减少接收负载。 如果内部RX存储器的剩余空间小于’1528-默认MTU(1514)+包信息(2)+数据包(8)+CRC(4)’,关闭端口,然后处理收到的所有数据。再重新打开端口。关闭端口之后,从关闭开始起接收到的MACRAW数据将会丢失。 检查发送数据/发送过程 用户想发送的数据的大小不能超过内部TX存储器的大小和默认MTU。主机产生与”接收过程”的数据包一样格式的MACRAW数据,然后发送它。这个时候,如果产生的数据小于60字节,发送的以太网包在内部会以“0填充”的方式扩充到60字节,然后发送。 检查结束/SOCKET关闭 参考9.2.2.1”单播和广播” 感谢阅读! 相关内容请查看: 单片机以太网控制芯片W7100A数据手册(一)(http://blog.iwiznet.cn/?p=4157) 单片机以太网控制芯片W7100A数据手册(二)(http://blog.iwiznet.cn/?p=4160) 单片机以太网控制芯片W7100A数据手册(三)(http://blog.iwiznet.cn/?p=4210) 单片机以太网控制芯片W7100A数据手册(四)(http://blog.iwiznet.cn/?p=4254)  
  • 热度 13
    2013-2-7 14:56
    1219 次阅读|
    0 个评论
    继续给大家介绍W7100A功能描述,电气特性,IR回流焊温度简介(无铅封装)和封装说明的内容。 9.   功能描述 因为W7100A内部嵌入一个8051兼容的CPU内核和硬件的TCP/IP内核,它可以不需要其它 器件而独立工作。在这一节,将通过一些软件源代码,讲解7100A的初始化和每一种协议(TCP、UDP、IP raw、MACRAW)的通信方法。 9.1         初始化 W7100A的初始化分三个步骤:设置8051单片机,网络信息和内部TX/RX存储器。 l  步骤1:初始化MCU 1.中断设置 允许或禁止8051的中断。详细信息参考第3节”中断”。 2.存储器访问时序设置 通过CKCON(0x8E)和WTST(0x92)寄存器来设置存储器的访问时序。CKCON(0x8E)控制数据存储器的访问时序,而WTSR(0x92)控制程序存储器的访问时序,设置值为0~7之间。但W7100A的CKCON可以设置的值为1~7,而WTST(0x92)的值只能是4~7,其它值都无效。如果用户设置的值是一个无效值,W7100将不能够正常工作。详细信息请参考2.4节“SFR的定义”。 例:禁止中断,访问数据存储器2个时钟周期,访问程序存储器7个时钟周期,设置如下: 3.串口通信波特率,寄存器和中断的设置 1)设置W7100A串口通信的相关寄存器。 与串口相关的寄存器有:TMOD、PCON和SCON。  ①    TMOD(89H):确定串口通信的定时器/计数器模式。 SM 2 :       在模式2和模式3时使用。假设这位为’1’,如果接收到的第9位为’1’,则接收该数据,如果第9位为’0’,则忽略该数据。 REN:接收允许(‘1’允许接收)。 TB 8 : 在模式2和模式3,发送的第8位数据位。 RB 8 : 在模式2和模式3,接收的第8位数据位。 TI:   发送完成中断。 RI:   接收完成中断 2)初始化串口通信时必须设置中断状态。 因为串口通信使用中断,因此在初始化串口通信时用户必须禁止其它相关的中断。 3)设置用户使用的波特率。请参考6.6节’波特率设置的实例’了解W7100用于产生波特率的定时器。定时器的波特率计算如下: ①    timer1计算公式 TH1 = 256 – ((K * 88.4736MHz) / (384 * 波特率)) K = ‘1’ at SMOD = ‘0’, K = ‘2’ at SMOD = ‘1’ ②    timer2计算公式 (RCAP2H, RCAP2L) = 65536 – (88.4736MHz / (32 * 波特率)) 例:使用Timer1的模式2,SMOD = 1,时钟频率 = 88.4736MHz,波特率 = 115200 步骤2:设置网络信息 1.网络通信的基本信息 必须设置的网络基本信息有: (1)SHAR(源硬件地址寄存器) 源硬件地址由SHAR设置,必须说明的是在以太网MAC层的物理地址(MAC地址)一定是唯一的。IEEE管理MAC地址的分配。网络设备的制造商给产品分配MAC地址。物理地址分配到详细信息请参考下面网址: http://www.ieee.org/,http://standards.ieee.org/regauth/oui/index.shtml (2)GAR(网关地址寄存器) (3)SUBR(子网掩码寄存器) (4)SIPR(源IP地址寄存器) 2.数据包发送失败时,设置重发时间和次数 为了设置重发时间,寄存器需要设置如下: (1)RTR(重发时间寄存器),RTR的’1’代表’100us’。 (2)RCR(重发次数寄存器) 步骤3:分配SOCKET n的内部TX/RX存储器 每一个可配置的TX/RX存储器的最大长度为16K字节。在16K字节的范围内,用户可以将存储器给8个SOCKET任意分配为1K、2K、4K、8K、16K字节。但是TX和RX存储器的设置的总和不能超过16K字节。(TX MAX =16KB,RX MAX =16KB) 图9.1 SOCKET n内部TX/RX存储器的分配 完成W7100A的这三步初始化,W7100A就可以通过以太网进行数据传输。此时,W7100A可以响应来自于网络的Ping请求。     9.2         数据通信 初始化过程完成以后,W7100A就可以以TCP、UDP、IPRAW或MACRAW的模式打开SOCKET,并发送和接收数据。W7100A支持8个端口以不同的方式同时进行工作。在这一节将介绍每一种方式的通信方法。 9.2.1   TCP TCP是一种面向连接的协议。TCP使用本机IP地址/端口号和目的IP地址/端口号产生连接。发送和接收数据都是通过这个连接的端SOCKET。 建立到SOCKET连接的方法是TCP服务器和TCP客户端。它们的区别是谁主动发出连接请求(SYN数据包)。 TCP服务器监听来自TCP客户端的连接请求,接收发送的连接请求(被动打开),并产生连接。 TCP客户端发出连接请求到TCP服务器(主动打开),并产生连接。 图9.2 TCP服务器和TCP客户端 9.2.1.1       服务器   图9.3 “TCP服务器”操作流程 SOCKET初始化 TCP数据通信需要对SOCKET进行初始化设置。初始化过程首先选择W7100A的一个SOCKET(从W7100A的8个SOCKET中),设置协议模式(Sn_MR(P3:P0))和设置源端口号Sn_PORT0(TCP服务器的监听端口号)。然后运行OPEN指令。执行OPEN命令后如果端口的状态Sn_SR改变为SOCK_INIT,那么端口的初始化就完成了。 TCP服务器和TCP客户端的端口初始化是完全相同的端口初始化为TCP模式的操作如下: 建立连接 当SOCKET的状态Sn_SR为SOCK_LISTEN时,如果它收到SYN数据包,Sn_SR的状态将改变为SOCK_SYNRECV,并发送一个SYN/ACK数据包,然后SOCKET n建立连接。SOCKET n建立连接以后才允许进行数据通信。有两种方法可以验证SOCKET n是否建立连接。 第一种方法:当收到数据包时,Sn_IR(RECV)置为1,如果主机在接收下一个数据包之前没有置上一个Sn_IR(RECV)为’1’,那么W7100将不能够识别下一个数据包的Sn_I(RECV),这是由于上一个Sn_IR(RECV)和后面的Sn_IR(RECV)重叠所致。因此,如果主机不能完全处理每一个Sn_IR(RECV)的数据包,则不推荐使用这种方法。 建立连接 : 接收过程 在这个过程中,它处理内部RX存储器接收的数据。在TCP模式下,如果接收的数据的字节长度超过端口当前RX存储器的剩余空间,W7100A不能接收数据。如果发生这种情况,W7100A将保持连接(暂停),并等待RX的剩余空间大于需要接收的数据字节长度。 在W7100A驱动程序中wiznetmemcpy.c文件中定义的wizmemecpy函数,使用Receive/Send过程来进行存储器数据的快速复制。更多详细信息请参考第13章,参考’W7100A性能提升’以了解其性能表现,参考’W7100A驱动指南’以了解其使用方法。如果用户不想使用wizmemcpy函数,那么使用普通的存储器复制函数即可。 由于W7100A内部同时具有数据存储器和TCPIP内核内部存储器,用户应该根据地址进行分类。所以用户必须在TCPIP内核内部存储器的最高级地址前加上’0xFE’,或者在从TCPIP内核存储器到数据存储器进行复制操作时,将DPX0寄存器设置为’0xFE’。关于wizmemcpy的更多详细信息请参考’W7100A驱动指南’。 建立连接 : 检查发送数据/发送过程 发送数据的字节长度不能超过SOCKET n TX存储器的大小。如果要传输的数据长度大于设置的MSS,它将按照MSS分段传输。 为了下一次数据的传输,用户必须检查上一次的SEND命令是否执行完成。如果上一次的SEND命令还没有执行完成又开始下一次的SEND命令,将会产生错误。数据越多,执行SEND命令所花费的时间越长。因此用户可以适当地将数据分段发送。 在发送过程中,用户必须将’0xFE’加到地址的最高地址,以指向TCPIP内核的存储器。 建立连接 : 超时 超时可能会发生在连接请求(SYN数据包)或其响应(SYN/ACK数据包)、数据通信或其响应(DATA/ACK数据包)、断开连接请求(FIN数据包)或其响应(FIN/ACK数据包),以及所有其它TCP数据包的传输。如果不能在RTR定义的时间和RCR定义的重发次数范围内完成上述数据包的传输,都将产生TCP的超时,Sn_SR的状态变为SOCK_CLOSED。确定TCP超时的方法如下: 9.2.1.2       客户端 除了”CONNECT”状态外,与TCP服务器完全一样。用户可参考9.2.1.1”TCP服务器”。 图9.4 “TCP客户端”操作流程 连接 发送连接请求(SYN数据包)到”TCP服务器”。当制造 “连接端口”到服务器时,可能会发生像ARP TO 、TCP TO 这样的超时现象。 9.2.2   UDP UDP是无连接的协议,它的通信是不需要SOCKET建立连接。TCP是一种面向连接的、可以保证可靠性的通信协议,但UDP采用数据报文的通信方式,数据传输的可靠性没有保障。但是,因为UDP不使用连接的SOCKET,因此它可以与多个已知IP地址的多个端口进行数据交换。这是它的优势。使用一个端口与其它端口通信也会带来很多问题,比如丢失传输的数据、或接收到其它端口来的不需要的数据等。在UDP模式下,为了避免出现这些问题,保证数据通信的可靠性,主机需要重发被损坏的数据或丢掉那些不需要的数据。UDP协议支持单播、广播和多播等通信方式。它遵循以下通信流程。 二进制 11011110.01100010.10101101.01111011 00000000.00000000.00000000.11111111 - 11011110.01100010.10101101.11111111 图9.5 UDP操作流程 9.2.2.1       单播和广播方式 单播是UDP的一种通信方式。它一次只能将数据传输给一个目的站点。而广播通信则使用广播地址(255.255.255.255),将数据发送给所有的可接收的目的站点。例如,假设用户将数据传输给目的站点A、B和C。单播是每一次将数据单独传输给A、B或C。在这种情况下,在获得目的站点A、B或C的物理地址时可能产生ARP超时。在产生ARP超时的时候是不能够将数据传输到目的地的。 广播则使用广播地址(255.255.255.255),可以一次同时将数据发送到目的站点A、B和C。这时不需要得到目的站点A、B或C的物理地址,因此不会产生ARP超时。 怎样建立广播IP? 广播IP地址可以通过子网掩码按位补码和主机IP地址的按位的逻辑或运算得到。 例:本机IP:222.98.173.123,子网掩码:255.255.255.0,则广播IP地址则为:222.98.173.255 SOCKET初始化 对要实现UDP通信,SOCKET必须进行初始化设置。打开SOCKET的操作过程如下:首先在W7100A的8个SOCKET中选择一个SOCKET为UDP的工作,并设置为UDP模式(Sn_MR(P3:P0)),然后设置本机端口号(Sn_PORT0),最后运行OPEN命令。执行OPEN命令后,如果Sn_SR状态改变为SOCK_UDP,则完成了端口的初始化设置。 图9.6 接收UDP数据的格式 接收的UDP数据包含8个字节的数据包信息和有效数据。数据包信息包括两个部分:发送者的信息(IP地址和端口号)和数据包的长度。UDP可以接收其它的很多UDP数据,用户可以通过发送者的信息区分UDP数据来源。它也接收以”255.255.255.255”的广播地址发送的信息。因此主机可以通过分析发送者的信息,丢掉那些不需要的数据。 如果要接收的数据长度大于SOCKET的RX存储器的剩余空间,用户将无法接收到数据,也不能够接收分段的数据。 检查发送数据/发送过程 用户想发送的数据的大小不能超过内部TX缓冲器能容纳的范围。如果比MTU大的话,会自动以MTU为单位进行划分然后发送。当用户想用广播方式时,Sn_DIPR0应被设置成”255.255.255.255” 检查发送完毕/超时 在继续发送数据之前,用户必须检查先前的SEND命令是不是已经完成了。发送的数据越多,发送需要的时间就越长。因此用户必须合理地将其要发送的数据进行划分。当用户发送UDP数据时可能发生ARP超时。如果ARP超时发生了,传输UDP数据失败。 9.2.2.2       多播 广播是与所有的、不确定的目的站点进行通信。但多播是与多个、但在多播组注册的目的站点进行通信。假如A、B和C是在一个特定的多播组里注册的站点。如果用户将数据传送到多播组(包含站点A),站点B和C也能够从站点A得到数据。为了使用多播通信,使用IGMP协议将目的站点列表注册到多播组。多播组包括:分组硬件地址、分组IP地址和分组端口号。用户不能够更改”分组硬件地址”和”分组IP地址”。但用户可以更改”分组端口号”。 分组硬件地址的选择范围在”01:00:5e:00:00:00”到”01:00:5e:7f:ff:ff”之间,而分组IP地址则使用D类地址, 范围从“224.0.0.0”到“239.255.255.255”。详细内容请参考官方网站: http://www.iana.org/assignments/multicast-addresses. 在选择时,6个字节的”分组硬件地址”的高23位硬件地址和4个字节的”分组IP地址”必须相同。例如,如果用户选择的分组IP地址为”244.1.1.11”,那么分组硬件地址为”01:00:5e:01:01:0b”。详细信息请参考RFC1112:http://www.ietf.org/rfc.html 在W7100A内部,IGMP处理多播注册是由内部(自动)完成的。当用户以多播的模式打开端口时,”Join”信息将在内部自动传送。如果用户关闭端口,”Leave”信息将在内部自动传送。端口打开以后,”Report”信息将在数据传输过程中每隔一定的时间传送。 W7100A支持IGMP v1和v2版本。如果用户想使用一个升级的版本,主机可以使用IPRAW模式直接处理IGMP。 SOCKET初始化 从W7100A的8个端口中选择一个以进行多播。将”多播分组MAC地址”设为Sn_DHAR0,将”多播分组IP地址”设为Sn_DIPR0。然后将”多播分组端口号”设为Sn_PORT0和Sn_DPORT0。设置Sn_MR(P3:P0)成为UDP模式,将Sn_MR(MULT1)设置为1。最后执行OPEN(打开)命令。如果Sn_SR的状态在OPEN命令之后被改为SOCK_UDP,端口初始化就完成了。 检查接收到的数据 请参考9.2.2.1”单播方式和广播方式” 接收过程 请参考9.2.2.1”单播方式和广播方式” 检查发送数据/发送过程 因为用户在端口初始化中设置了多播分组的信息,因此用户不必再设置目的设备的IP地址和端口号。因此,复制要传送的数据到内部TX缓冲区,执行SEND命令就可以了。 l  检查完成/SOCKET关闭 参考9.2.2.1”单播广播”9.2.3   IPRAW IPRAW属于IP层的数据通信,它是比TCP、UDP低一层协议。IPRAW支持IP层的协议,如ICMP(0x01)和IGMP(0x02),由协议号决定。ICMP的’ping’功能和IGMP v1/v2已经在W7100A中由硬件实现。如果用户需要,主机可以将SOCKET n以IPRAW的模式打开,直接处理IPRAW的数据。在使用IPRAW模式时,用户必须设置IP包头中用户所使用的协议号。协议号由IANA定义,请参考官方网站: http://www.iana.org/assignments/protocol-numbers。 在打开SOCKET之前,必须由Sn_PROTO先定义协议号。W7100A在IPRAW模式下不支持TCP(0x06)和UDP(0x11)。IPRAW模式的SOCKET通信只支持设定的协议号通信。ICMP的SOCKET不能接收非设定的协议数据,如IGMP。  图9.7 IPRAW操作流程 端口初始化 选择端口,设置协议号,然后设置Sn_MR(P3:P0)到IPRAW模式,执行”OPEN”命令。如果Sn_SR在”OPEN”命令之后转化到了SOCK_IPRAW,端口初始化就完成了。 检查接收数据 参考9.2.2.1”单播和广播模式” 接收过程 处理内部RX存储器的IPRAW数据。接收到的IPRAW数据的结构如下: 图9.10 接收MACRAW数据格式 MACRAW数据包含”包信息”,”数据包”和4字节的循环校验码。”包信息”是数据包的长度,”数据包”包括6字节的”目的MAC地址”,6字节的”源MAC地址”和2字节的”类型”,46-1500字节的实际传输数据。”实际传输数据”包括网络协议,如根据”类型”而定的ARP,IP。关于详细的”类型”信息,清参考下面网站:(Uhttp://www.iana.org/assignments/ethernet-numbersU) 注意 如果内部RX存储器的剩余空间比MACRAW数据小的话,存于内部RX缓存中的一些包信息和数据包会偶然性地出现一些问题。因为这样的问题是出于包信息的分析错误,所用它不能正确地处理MACRAW数据。越接近RX存储器大小,错误发生率越高。如果用户可以允许MACRAW数据有部分丢失,这个问题就可以解决。 解决办法如下: 尽快地处理内部RX存储器中的数据以避免它接近缓存的最大限。 在样例代码中对SOCKET进行初始化的部分,通过设置S0_MR的MF位(MAC过滤器)以实现对MACRAW数据的选择性接收,从而减少接收负载。 如果内部RX存储器的剩余空间小于’1528-默认MTU(1514)+包信息(2)+数据包(8)+CRC(4)’,关闭端口,然后处理收到的所有数据。再重新打开端口。关闭端口之后,从关闭开始起接收到的MACRAW数据将会丢失。 检查发送数据/发送过程 用户想发送的数据的大小不能超过内部TX存储器的大小和默认MTU。主机产生与”接收过程”的数据包一样格式的MACRAW数据,然后发送它。这个时候,如果产生的数据小于60字节,发送的以太网包在内部会以“0填充”的方式扩充到60字节,然后发送。 检查结束/SOCKET关闭 参考9.2.2.1”单播和广播” 感谢阅读! 相关内容请查看: 单片机以太网控制芯片W7100A数据手册(一)(http://blog.iwiznet.cn/?p=4157) 单片机以太网控制芯片W7100A数据手册(二)(http://blog.iwiznet.cn/?p=4160) 单片机以太网控制芯片W7100A数据手册(三)(http://blog.iwiznet.cn/?p=4210) 单片机以太网控制芯片W7100A数据手册(四)(http://blog.iwiznet.cn/?p=4254)
  • 热度 31
    2013-2-7 10:44
    900 次阅读|
    0 个评论
    昨天讲解了如何通过异步收发以及看门狗定时器TCP/IP内核,今天继续给大家介绍TCP/IP内核的内容。 8.3.2   SOCKET寄存器 Sn_MR(SOCKET n模式寄存器) 该寄存器配置SOCKET n的协议或其他选项. Sn_CR (SOCKET n 命令寄存器) 该寄存器用于设置SOCKET n的命令,诸如:打开、连接、监听、发送、接收等操作。当W7100A 确认该命令之后, Sn_CR寄存器自动清零。即使Sn_CR清零,指令仍然在处理中。为了验证命令是否执行完成,可以检查Sn_IR寄存器或Sn_SR寄存器。 下面的命令只用于SOCKET 0且S0_MR(P3:P0) = S0_MR_PPPoE。 详细信息请参考W5100应用笔记”How to use ADSL”。 Sn_IR (SOCKET n 中断寄存器) Sn_IR寄存器提供SOCKET n的中断类型信息(比如建立连接、中断连接、收到数据、超时等)。当产生一个中断且中断屏蔽器Sn_IMR对应位为’1’,那么Sn_IR的中断位将置’1’。为了清除Sn_IR位,主机需要向该位写入’1’。当Sn_IR所有位都清除,IR(n)将自动清除。这时它将向MCU发出INT5信号(nINT5:TCPIP内核中断)。 Sn_IMR (SOCKET n中断屏蔽寄存器) 它配置SOCKET n的中断类型,以指示给主机。端口的中断屏蔽寄存器Sn_IMR与Sn_IR相对应。如果SOCKET产生中断,Sn_IR相对应的位置’1’,如果Sn_IMR与Sn_IR相对应的位都置’1’,IR(n)置’1’。这时如果IMR(n)也置’1’,将产生中断(‘/INT’引脚电平变低) Sn_SR (SOCKET n状态寄存器) 该寄存器提供SOCKET n的状态。在对Sn_CR寄存器进行操作或数据包的收发过程中,SOCKET n 的状态将发生改变。 下表描述了SOCKET n的不同状态 下面是Sn_SR在改变过程中的临时状态。 Sn_PORT(SOCKET n源端口号) 设置源端口号。 端口号只有SOCKET n工作在TCP、UDP模式下有效,在其它模式下无效。 端口号必须在OPEN命令之前设置。 例:设置SOCKET 0的端口号为5000(0x1388),配置如下: 0xFE4004 0xFE4005 0x13 0x88 Sn_DHAR (SOCKET n目的物理地址寄存器) 它设置、或被设置为SOCKET n的目的端物理地址。如果SOCKET 0用于PPPoE模式,S0_DHAR则设置为PPPoE服务器的物理地址,这个物理地址是已经知道的。 在UDP或IPRAW模式使用SEND_MAC命令时,需要将它设置为SOCKET n的目的物理地址。在TCP、UDP、IPRAW模式,使用CONNECT命令或SEND命令时,Sn_DHAR是通过ARP过程获得目的物理地址。在成功运行CONNECT或SEND命令后,主机可以通过Sn_DHAR获得目的物理地址。 当使用W7100A的PPPoE时,不需要设置PPPoE服务器的物理地址。 然而,即使不用W7100A的PPPoE处理,而是使用MACRAW模式,为了传输和接收PPPoE数据包,PPPoE服务器的物理地址(通过PPPoE过程获得)、PPPoE服务器的IP地址、PPP会话的ID值都需要设置,MR(PPPoE)也需要设置为’1’。 S0_DHAR在OPEN命令之前就设置为PPPoE服务器的物理地址。由S0_DAHAR设置的PPPoE服务器的物理地址在OPEN命令之后应用于PDHAR。PPPoE的配置信息属于内部信息,即使在CLOSE命令之后仍然有效。 例:SOCKET 0的目的端的物理地址为:00.08.DC.01.02.10,配置如下: 0xFE4006 0xFE4007 0xFE4008 0xFE4009 0xFE400A 0xFE400B 0x00 0x08 0xDC 0x01 0x02 0x10 Sn_DIPR (SOCKET n 目的IP地址寄存器) 它设置、或被设置为SOCKET n的目的IP地址。如果SOCKET 0用于PPPoE模式,S0_DIPR0将设置为已知的PPPoE服务器的IP地址。 只有在TCP、UDP、IPRAW或PPPoE模式下有效,在MACRAW模式下无效。 当SOCKET工作在TCP客户端时,在运行CONNECT命令之前,它必须设置为TCP服务器的IP地址。而当工作在TCP服务器模式时,当成功建立连接以后,它内部自动设置为TCP客户端的IP地址。 在UDP或IPRAW模式,为了传输UDP或IPRAW数据包,在使用SEND或SEND_MAC命令之前,必须将目的端的IP地址设置到Sn_DIPR中。 在PPPoE模式,S0_DIPR设置为已知的PPPoE服务器的IP地址。 例:SOCKET 0的目的端的IP地址为:192.168.0.11,设置如下: 0xFE400C 0xFE400D 0xFE400E 0xFE400F 192 (0xC0) 168 (0xA8) 0 (0x00) 11 (0x0B) Sn_DPORT (SOCKET n 目的端口号寄存器) SOCKET n的目的端口号由Sn_DPORT设置。如果SOCKET 0工作在PPPoE模式,Sn_DPORT0设置为已知的会话ID。 只有在TCP、UDP和PPPoE模式下有效,其它模式下无效。 在TCP客户端模式时,在运行CONNECT命令之前,必须先将Sn_DPORT设置为TCP服务器的侦听端口。 在UDP模式下,在SEND命令或SEND_MAC命令之前,需要先设置好UDP数据包的目的端口号Sn_DPORT。 在PPPoE模式下,S0_DPORT设置为已知的PPP会话ID。PPP会话ID在OPEN命令之后应用于PSIDR。 例:设置SOCKET 0的目的端口号为5000(0x1388),配置如下: 0xFE4010 0xFE4011 0x13 0x88 Sn_MSSR(SOCKET n 最大分段长度寄存器) 它设置SOCKET n的最大传输单元(MTU),或指示MTU已经设置。它支持TCP或UDP模式。当使用PPPoE(MR(PPPoE)=1),TCP或UDP的最大传输单元(MTU)是由PPPoE的MTU范围确定的。 在IPRAW和MACRAW模式下,MTU不是由内部处理的,但是使用默认的MTU。因此当传输的数据比默认的MTU大,主机需要手动进行分段使其在默认的MTU范围内。 在SOCKET初始化过程中,复位值是0,但是MSSR会变成用户设置值和默认值之间较小的那个。如果没有用户设置值,MSSR则变成默认值。 在TCP和UDP模式下,如果传输的数据字节数比MTU大,W7100会自动将数据分段在MTU范围内。 在TCP模式,MTU就是我们所知道的MSS。通过选择主机写入的值和对端的MSS,在TCP连接过程中MSS自动选择较小的值。 在UDP模式下,没有TCP的连接过程,只使用主机写入的值。当与不同MTU的对端通信时,W7100可以接收到ICMP(分段的MTU)数据包。当IR(FMTU)=1时,无法实现与对端的UDP通信。因此用户必须关闭SOCKET,将Sn_MSSR设置为FMTU,然后再试着用OPEN命令打开端口进行通信。     Sn_PROTO (SOCKET n 协议号寄存器)   这是一个1字节的寄存器,用于设置IP层数据包中IP包头的协议号字段。   只有在IPRAW模式下有效,而在其它模式下都无效。Sn_PROTO必须在OPEN命令之前设置。当SOCKET n以IPRAW模式打开时,它发送和接收的是由Sn_PROTO设置的协议号的数据。Sn_PROTO的赋值范围在0x00 ~ 0xFF之间。但W7100不支持TCP(0x06)和UDP(0x11)的协议号。协议号由IANA(互联网编号分配机构)定义。详细内容请参考在线信息:   http://www.iana.org/assignments/protocol-numbers   例:网络控制信息协议(ICMP)的协议号为0x01,网络分组管理协议的协议号为0x02。   Sn_TOS(SOCKET n服务类型(TOS)寄存器)   它设置服务类型(TOS),这是IP层数据包中IP包头中的一个字段。必须在OPEN命令之前   进行设置。   请参考:http://www.iana.org/assignments/ip-parameters.   Sn_TTL(SOCKET n生存时间(TTL)寄存器)   它设置IP层数据包中IP包头中的生存时间(TTL)字段。必须在OPEN命令之前进行设置。   请参考:http://www.iana.org/assignments/ip-parameters   Sn_RXMEM_SIZE(SOCKET n接收存储器大小寄存器)   它用于配置每一个SOCKET的RX存储器的大小。每个SOCKET的RX存储器大小可配置为1、2、4、8、16K字节。复位后默认为2K字节。8个SOCKET的Sn_RXMEM_SIZE的总和为16K字节。   例1:SOCKET 0 : 8KB, SOCKET 1 : 2KB   0xFE401E 0xFE411E 0x08 0x02   例2:SOCKET 2 : 1KB, SOCKET 3 : 1KB   0xFE421E 0xFE431E 0x01 0x01   例3: SOCKET 4 : 1KB, SOCKET 5 : 1KB   0xFE441E 0xFE451E 0x01 0x01   例4: SOCKET 6 : 1KB, SOCKET 7 : 1KB   0xFE461E 0xFE471E 0x01 0x01   从上面的例1~例4可以看出,8个SOCKET的RX存储器之和为16K字节。   Sn_TXMEM_SIZE (SOCKET n 发送存储器大小寄存器)   它配置SOCKET的内部TX存储器。每个SOCKET的TX存储器可配置的大小为1、2、4、8、16K字节。复位后默认为2K字节。8个SOCKET的TX存储器之和为16K字节。   例5:SOCKET 0 : 4KB, SOCKET 1 : 1KB   0xFE401F 0xFE411F 0x04 0x01   例6: SOCKET 2 : 2KB, SOCKET 3 : 1KB   0xFE421F 0xFE431F 0x02 0x01   例7:SOCKET 4 : 2KB, SOCKET 5 : 2KB   0xFE441F 0xFE451F 0x02 0x02   例8:SOCKET 6 : 2KB, SOCKET 7 : 2KB   0xFE461F 0xFE471F 0x02 0x02   从上面例5~例8所示,8个SOCKET的TX存储器之和为16K字节。   Sn_TX_FSR (SOCKET n发送存储器剩余空间大小寄存器)   它指示SOCKET n的内部TX存储器可使用的空间大小(可写入的传输数据的字节数)。主机不能写入比Sn_TX_FSR更多的数据到TX存储器。因此 , 在向TX存储器写入发送数据前检查Sn_TX_FSR,如果要写入的数据字节数小于或等于Sn_TX_FSR,才可以写入数据到TX存储器然后用SEND或SEND_MAC命令发送。   在TCP模式,如果对端接收到所发送的数据包(如果收到从对端来的DATA/ACK数据包),Sn_TX_FSR将自动增加,增加量就是已发送的字节数。在其它模式,只要Sn_IR(SENDOK)=1,Sn_TX_FSR就自动增加,增加量就是传输的数据长度。   例:S0_TX_FSR0的值为2048(0x0800),   0xFE4020 0xFE4021 0x08 0x00   Sn_TX_RD (SOCKET n发送存储器读指针寄存器)   该寄存器显示TX存储器最后结束传输的地址值。对SOCKET n的命令控制寄存器写入SEND命令,它将从当前的Sn_TX_RD地址开始传输数据,直到Sn_WR_WR地址为止。在传输结束后该寄存器的值自动改变。因此在传输结束后,Sn_TX_RD和Sn_TX_WR的值是相等的。读该寄存器时,先读取它的高字节(0xFE4022,0xFE4122,0xFE4222,0xFE4322,0xFE4422, 0xFE4522,0xFE4622,0xFE4722),然后再读它的低字节(0xFE4023,0xFE4123,0xFE4223, 0xFE4323,0xFE4423,0xFE4523,0xFE4623,0xFE4723),这样读取的数据才正确。   Sn_TX_WR (SOCKET n发送存储器写指针寄存器)   该寄存器提供定位信息,指示数据应该写入到什么位置。读取该寄存器时,先读取高字节(0xFE4024,0xFE4124,0xFE4224,0xFE4324,0xFE4424,0xFE4524,0xFE4624,0xFE4724),然后再读取低字节(0xFE4025,0xFE4125,0xFE4225,0xFE4325,0xFE4425,0xFE4525,0xFE4625, 0xFE4725),这样读取的数据才正确。   例:S0_TX_WR的值为2048(0x0800)。   0xFE4024 0xFE4025 0x08 0x00   但这个值本身不是可以直接访问的物理地址。实际访问的物理地址计算如下:(请参考W7100A驱动程序)   1.从Sn_TXMEM_SIZE(n)计算出端口n TX存储器的基地址(SBIUFBASEADDRES(n))和掩码地址(SMASK(n)),详细内容参看所提供的源代码。   2.将Sn_TX_WR0和SMASK(n)进行’位与’运算,其结果就是在端口n的TX存储器范围内的偏移地址(dst_mask)。   3.将dst_mask和SUBFBASEADDRESS(n)相加得到实际访问的物理地址(dst_ptr)。现在可以将需要传输的数据写到dst_ptr。(*有一种情况需要注意,写入数据时可能会超过端口n的TX存储器的上界。这时将数据写入上边界地址后,再从SBUFBASEADDRESS(n)开始写入剩余的数据,如此循环写入操作。)   操作完成后,Sn_TX_WR的值必须加上当前写入数据的字节数。最后向Sn_CR(端口n的命令寄存器)发出SEND命令。详细信息参考TCP服务器模式下发送数据的源代码。 图8.3 计算物理地址 Sn_RX_RSR (SOCKET n RX接收数据长度寄存器) 它指示SOCKET n内部RX存储器中接收数据的字节数。由于该值是由Sn_Rx_RD和Sn_Rx_WR的在内部计算得出的,对SOCKET n的命令寄存器(Sn_CR)写入RECV命令且接收到远程的数据时,它将自动改变。当读取该寄存器时,用户应该首先读取高字节(0xFE4026,0xFE4126,0xFE4226,0xFE4326,0xFE4426,0xFE4526,0xFE4626,0xFE4726),然后再读低字节(0xFE4027,0xFE4127,0xFE4227,0xFE4327,0xFE4427,0xFE4527,0xFE4627, 0xFE4727),这样才能够得到正确的值。 例:S0_RX_RSR0的值为2048(0x0800) 0xFE4026 0xFE4027 0x08 0x00 这个值的总长度是由RX存储器大小寄存器决定的。 Sn_RX_RD (SOCKET n RX接收存储器读指针寄存器) 该寄存器确定接收数据的读取地址信息。当读取该寄存器时先读高字节 (0xFE4028,0xFE4128,0xFE4228,0xFE4328,0xFE4428,0xFE4528,0xFE4628,0xFE4728),然后再读低字节(0xFE4029,0xFE4129,0xFE4229,0xFE4329,0xFE4429,0xFE4529,0xFE4629, 0xFE4729),这样读取的信息才正确。 例:S0_RX_RD02048的值为(0x0800) 0x0428 0x0429 0x08 0x00 但这个值不是实际要读取的物理地址。实际的物理地址需要由下面的关系计算获得: 1.由Sn_RXMEM_SIZE(n)获得SOCKET n的RX存储器的基地址(RBUFBASEADDRESS(n))和SOCKET n的RX掩码地址(RMASK(n))。 2.将Sn_RX_RD0和RMASK(n)进行’位与’运算,得到SOCKET的RX存储器地址范围内的偏移地址(src_mask)。 3.将src_mask和RBUFBASEADDRESS(n)相加得到实际要访问的物理地址。 现在可以从src_ptr地址读取接收的数据(有一种特殊情况要注意,读取的地址超过了SOCKET的RX存储器的上边界,这时读完上边界地址的数据后,返回到RBUFBASEADDRESS(n)地址读取剩余的数据,如此循环访问)。 完成操作后,Sn_RX_RD的值必须加上当前读取的字节数(一定不能超过你读取的字节数)。最后对Sn_CR命令寄存器写入RECV命令,即完成操作。 更多详细信息请参考TCP服务器模式下接收数据的源代码。 Sn_RX_WR (SOCKET n RX接收存储器写指针寄存器) 它指示端口n内部RX存储器中接收数据的字节数。由于该值是由Sn_Rx_RD和Sn_Rx_WR在内部计算得出的,对SOCKET n的命令寄存器(Sn_CR)写入RECV命令且接收到远程的数据时,它将自动改变。当读取该寄存器时,用户应该首先读取高字节(0xFE4026,0xFE4126,0xFE4226,0xFE4326,0xFE4426,0xFE4526,0xFE4626,0xFE4726),然后再读低字节(0xFE4027,0xFE4127,0xFE4227,0xFE4327,0xFE4427,0xFE4527,0xFE4627, 0xFE4727),这样才能够得到正确的值。 例:S0_RX_WR0的值为2048(0x0800) 0xFE402A 0xFE402B 0x08 0x00 Sn_FRAG(SOCKET n分段寄存器) 该它设置IP层的IP包头中的分段字段。W7100不支持IP层的分段。即使配置了Sn_FRAG,IP数据包也不能够分段。它需要在OPEN命令之前设置该寄存器。 例:Sn_FRAG0 = 0x4000(不分段) 0xFE402D 0xFE402E 0x40 0x00 相关内容请查看: 单片机以太网控制芯片W7100A数据手册(一)(http://blog.iwiznet.cn/?p=4157) 单片机以太网控制芯片W7100A数据手册(二)(http://blog.iwiznet.cn/?p=4160) 单片机以太网控制芯片W7100A数据手册(三)(http://blog.iwiznet.cn/?p=4210)  
  • 热度 25
    2013-2-6 10:42
    997 次阅读|
    0 个评论
           昨天给大家介绍了有关中断、I/O端口及定时器的部分,今天继续讲解W7100A如何通过异步收发以及看门狗定时器TCP/IP内核相关内容。    6.   通过异步收发(UART)        W7100A的UART工作在全双工状态,允许同时接受和发送操作。因为W7100A是双数据缓冲区,接收器在第一个字节没有被读取时,仍然可以接收数据。在读操作时,从接受缓冲区SBUF读取数据。另一方面,在发送过程中,SBUF将数据装载到发送缓冲区。UART有4中不同的工作模式,一种是同步模式,3种异步模式。模式2和模式3的一些特殊的特性主要用于多机通信。通过设置SCON寄存器的SM2位可以使用该特性。主处理器首先发送地址字节以确定目标从属机。地址字节与数据字节在第9位进行区分,第9位为1则表示是地址字节,为0则标志数据字节。当SM2=1,数据字节不会使从属机产生中断,而地址字节则将使所有从属机产生中断。选中的从属机将SM2清零,准备接受即将到来的数据。而没有被选中的从属机SM2仍然为1,忽略所有接受的数据。 引脚的功能描述如下: 表6.1 UART引脚定义 注意: SM2 – 允许多处理器通信 SM1 – 设置波特率 SM0 – 设置波特率 REN – ‘1’ : 使能串行接收 ‘0’ : 禁止串行接收 TB8 – 在模式2和模式3,发送数据的第9位。根据CPU的运行情况启用这一位(奇偶校验,多机通信等) RB8 – 在模式2和模式3,接收数据的第9位。在模式1,如果SM2=0,RB8是停止位,在模式0,该位没有使用。 UART模式如下表所示:   6.1         中断 与UART中断有关的位如下。中断可以由IE寄存器触发,中断优先级可以由IP寄存器配置。 图6.6 UART配置寄存器 注意: TI – 发送中断标志,完成一次发送后由硬件自动置”1”,必须由软件清除 RI – 接收中断标志,接收一个串行数据后由硬件自动置”1”,必须由软件清除 所有可以产生中断的位都可以通过软件设置或清除,与硬件产生的效果相同。也即是说,中断可以由软件产生或清除。 表6.4 UART中断 6.2         模式0,同步模式 TXD输出同步时钟,波特率固定位1/12时钟频率(CLK)。传输的8位数据低位在前,通过设置RI=0和REN=1,即可启动接收。 6.3         模式1,8位UART,波特率可变,Timer1或Timer2作为时钟源 RXD引脚作为串行通信的输入端,TXD引脚作为串行通信的输出端。10位传输的数据顺序是:1个起始位(0)、8位数据位(低位在前)、一个停止位(1)。在接收过程中,通过起始位同步传输过程,下一步即可以通过SBUF读取到8位数据,停止位用于触发特殊功能寄存器SCON(0x98)的RB08位,根据Timer1或Timer2的模式可以改变通信波特率。要使用Timer2作为时钟源,需要设置T2CON(0xC8)寄存器的TCLK和RCLK位。 6.4         模式2,9位UART,固定波特率 模式2与模式1相同,但波特率固定为1/32或1/64时钟频率,传输的数据位11位:一个起始位(0),8位数据位(低位在前),一个可编程的第9位和一个停止位(1)。第9位可用于UART数据的其偶检验。在发送过程中,SCON寄存器的TB08位是作为数据的第9位输出的。在接收过程中,接收的第9位将保存在sCON的RB08位。 6.6         波特率设置 表6.5 波特率设置 注意: 波特率计算公式 使用Timer1 – 波特率 = ( 2 SMOD / 32 ) * ( 时钟频率 / 12( 256 – TH1 ) ) 使用Timer2 – 波特率 = 时钟频率 / ( 32 * ( 65536 – ( RLDH, RLDL ) ) )  7.   看门狗定时器 7.1         概述 看门狗定时器由系统时钟经过一系列的分频器提供时钟信号,如下图所示。分频器输出是可选择的,它决定了定时器超时的间隔。当看门狗定时器产生超时的时候,相应的中断标志将置位。如果允许的话,对系统复位。当中断允许控制位和中断总开关都开启时,中断标志将触发中断。复位和中断是完全不同的两个功能,根据应用系统的要求,可分别得到响应、或单独得到响应、或忽略之。 7.2         中断 与看门狗中断有关的位如下图所示。中断可以由IE(0xA8)和EIE(0xE8)寄存器打开或关闭。由EIP(0xF8)寄存器设置其优先级。IE中的中断总开关EA可打开(1)或关闭(0)所有中断。   7.3         看门狗定时器复位 看门狗定时器复位的操作如下:一旦设定溢出的时间间隔,系统首先通过RWT重新启动看门狗。然后,通过启动看门狗定时器复位(WDCON.1)位,启动复位模式。在定时器到达用户设定的定时值之前,软件可以置复位看门狗定时器(WDCON.0)位为1。如果在定时器时间溢出发生之前设置RWT,定时器将重新启动;如果在RWT置位之前发生了定时器溢出,看门狗将对CPU复位。软件对RWT设置以后,硬件将自动清除RWT。当产生一次复位,WTRF(看门狗定时的复位标志WDCON.2)将自动设置,以指示当前复位的类型。必须由软件手动清零该位。 7.4         简单定时器 看门狗定时器是一个独立运行的定时器。在定时器模式下禁止复位(EWT=0)和禁止中断(EWDI=0),定时器开始向WD 预先设置的时间计数,并将允许看门狗中断标志。对RWT复位,定时器将工作在时间溢出监测模式。WDIF位可以由软件清0或置1。看门狗中断可以用于需要长时间定时的应用系统中,中断由看门狗中断允许启动位(EIE.4)开启。那么当产生时间溢出,看门狗定时器将设置WDIF位(WDCON.3)为1。如果中断总开关开启,那么将产生中断。 注意,在一个可能的看门狗复位之前,WDIF将在512个时钟之后复位。 看门狗中断标志指示中断的来源,必须由软件清除。如果看门狗中断应用得当,看门狗复位将使得中断程序可以监控任何系统错误。 7.5         系统监控 如果WDCON的EWT位置位,W7100A会在一个看门狗时间超时发生后重启。用户可以使用看门狗定时器作为系统监控的功能,例如,系统在看门狗中断之前正在运行错误代码,而且也没有RWT清除进程,因为这种代码不是由用户编写的,这种情况将会导致看门狗超时发生,W7100A将会重启。用户通过这种机制可以避免不想看到的系统状态。 7.6         与看门狗有关的寄存器 看门狗定时器定时器在运行期间与多个特殊功能寄存器的位相关。这些位可用于复位源、中断源、软件检测定时器,也可以是这三者的任意组合。复位和中断都有状态标志。看门狗还有一个位是重启定时器。下表是对这些位的详细介绍。 表7.2 与Watchdog有关的”位”的总结 注意: WTRF – 看门狗定时器复位标志。当该标志由硬件置位时,标志着已经产生了看门狗定时器复位。然而如果由软件对该标志置位,不会触发看门狗定时器复位。在复位期间,该标志会被清除,否则需要软件清除。如果EWT被清除,看门狗定时器对该位不产生影响。 EWT  – 允许看门狗定时器复位。该位控制看门狗定时器对微处理器的复位,而对看门狗中断没有影响。必须使用顺序访问才能对该位经行修改。 0 : 看门狗定时器溢出不对微处理器复位 1 : 看门狗定时器溢出对微处理器复位 RWT  – 复位看门狗定时器。对RWT置”1”将对看门狗定时器复位。在看门狗定时器溢出之前,必须按照顺序访问的过程对该位经行置位操作,否则将产生复位或中断。 未使用的位读出为1或0。 下表总结了控制看门狗的”位”及其功能 表7.3 看门狗的”位”及作用 时钟控制寄存器CKCON(0x8E)包含WD 位,用于选择看门狗定时器溢出时间。看门狗时钟直接来源于CLK引脚输入,看门狗有四种时间溢出选择(基于输入的CLK时钟),如表7.4所示。这是一个预选的时钟数。因此实际的时钟溢出时间与CLK频率是相关的。 *W7100A时钟频率=88.4736MHz 表7.4 Watchdog时间间隔 上表所示的时间间隔是产生中断事件。如果允许产生复位,那么将在512个时钟之后产生复位,而不管中断的出现。因此,实际看门狗溢出时间就是选择的看门狗定时时钟周期再加上512个时钟周期(CLK引脚信号)。 7.1         顺序访问寄存器 因为WDCON是顺序访问寄存器,用户必须用下面的步骤来设置WDCON的值。TA位于特殊功能寄存器的0xC7地址。 MOV TA, #0xAA MOV TA, #0x55 ;任何直接寻址指令对顺序访问寄存器操作 用户在设置WDCON时应该一直使用这个顺序 表7.5 顺序访问寄存器 8.   TCPIP内核 8.1         存储器映射 TCP/IP内核由通用寄存器、SOCKET寄存器、TX存储器和RX存储器组成,如下图所示: 8.2         TCP/IP内核寄存器 8.2.1   通用寄存器 8.2.2   SOCKET寄存器 8.3        寄存器描述 8.3.1   模式寄存器 MR (模式寄存器) 例:设置地址为”192.168.0.2” 0xFE000F 0xFE0010 0xFE0011 0xFE0012 192 (0xC0) 168 (0xA8) 0 (0x00) 2 (0x02) IR (中断寄存器) 该寄存器由主机W7100A设置以确定中断产生的来源。任何中断都可以由中断屏蔽寄存器屏蔽。当寄存器中任意中断位被置位,INT5(nINT5: TCPIP内核中断) 引脚将变低电平,它将一直保持低电平直到中断寄存器中的所有位都清除。 RTR ((重发时间值寄存器) 该寄存器用来设置时间溢出的值。每一单位数值为100us。初始化时值为200ms(0x07D0),即该值设为2000(0xFA0)。 例:设定400ms,其值为4000(0x0FA0) 0xFE0017 0xFE0018 0x0F 0xA0 如果对端没有响应或响应延迟都将产生重传。 RCR (重传计数寄存器) 该寄存器内的数值设定可重发的次数。如果重发的次数超过设定值,将产生超时中断(相关的端口中断寄存器中的Sn_IR超时位(TIMEOUT)置’1’。 在TCP通信模式,Sn_IR的TIMEOUT=’1’时,Sn_SR的状态改变为”SOCK_CLOSED”状态。在其它通信模式,只是Sn_IR的TIMEOUT=’1’。 W7100A超时中断可以通过RTR和RCR进行配置。其中TIMEOUT中断分为ARP超时和TCP重传超时. 对于ARP(参考RFC 826, http://www.ietf.org/rfc.html)重传超时, W7100A自动发送ARP请求到对端IP地址,以获得MAC地址信息。(用于IP,UDP,或TCP通信).在等待对端ARP响应过程中,如果在RTR设置的时间范围内都没有响应,将产生超时并重复发送ARP请求。重发上限为’RCR+1’次。 在ARP重复请求’RCR+1’次后如果没有ARP响应,那么最终将产生超时且Sn_IR(TIMEOUT)置’1’。 ARPTO = ( RTR X 0.1ms ) X ( RCR + 1 ) ARP请求超时的计算如下(ARP TO ): TCP数据包传输超时,W7100A传输TCP数据包(SYN,FIN,RST,DATA数据包)并在RTR和RCR设置的时间范围内等待响应(ACK)。如果对端没有响应将产生超时,并重复发送先前的TCP数据包。重复发送的次数为’RCR+1’。如果TCP数据包经过’RCR+1’次重复发送也没有得到对端的ACK响应,此时将产生最终的超时。在Sn_IR(TIMEOUT)=1时Sn_SR的值为’SOCKET_CLOSED’。 TCP数据包重复传输的最终超时的值计算如下:   例:当RTR = 2000(0x07D0), RCR = 8(0x0008), ARP TO = 2000 X 0.1ms X 9 = 1800ms = 1.8s TCP TO = (0x07D0 + 0x0FA0 + 0x1F40 + 0x3E80 + 0x7D00 + 0xFA00 + 0xFA00 + 0xFA00 + 0xFA00) X 0.1ms = (2000 + 4000 + 8000 + 16000 + 32000 + ((8 - 4) X 64000)) X 0.1ms = 318000 X 0.1ms = 31.8s PATR (PPPoE模式下认证类型) 在与PPPoE服务器连接时该寄存器指示通过的安全认证方法。W7100A只支持两种安全类型:PAP和CHAP。 值 认证类型 0xC023 PAP 0xC223 CHAP PPPALGO (PPPoE模式下认证算法) 该寄存器用于指示PPPoE连接时的认证算法。详细信息请参考PPPOE应用笔记。 PTIMER (PPP连接控制协议请求定时器寄存器) 该寄存器表示发出LCP Echo(响应请求)所需要的时间间隔。每1单位大约25ms。 例:设置PTIMER =200 200 * 25(ms) = 5000(ms) = 5 s PMAGIC (PPP连接控制协议(LPC)幻数寄存器) 该寄存器用于LCP握手时采用的幻数选项。参照 “How to connect ADSL”应用笔记。 VERSIONR (W7100A芯片版本寄存器) 该寄存器存储W7100A的版本信息。 INTLEVEL (中断低电平等待时间寄存器) INTLEVEL设置中断触发等待时间(I AWT )。它配置内部中断INT5在下一个中断发生前的低电平触发等待时间。如果用户想启用TCP/IP内核中断,INTLEVEL寄存器的值必须大于0x2B00。否则TCP/IP内核中断可能被忽略。 a.对于SOCKET 0,如果中断发生(S0_IR(3) = ‘1’)且相应IR2位被置1(IR(S0_IR) = ‘1’),内部中断INT5信号将会被拉低。 b.同样的情况出现在:当socket 1出现连续中断(S1_IR(0)=‘1’)且相应位被置1(IR(S1_IR)=‘1’)。 c.当主机清掉S0_IR(S0_IR = 0x00)位及相应的IR2位(IR(S0_IR) = ‘0’),内部中断INT5信号将会从低电平(启动)重新拉高(禁止)。 d.当S1_IR清除后,因为SOCKET 1中断,对应的IR2并不为0x00,内部INT5信号应该为低电平。 然而,由于INTLEVEL值为0x000F,内部INT5信号还要持续I AWT (16 PLL_CLK)时间。 IR2 (W7100A 端口中断寄存器) IR2寄存器用于通知主机W7100A产生端口中断。当中断产生后,在IR2的相关位置’1’.此时,INT5 (nINT5: TCPIP内核中断)引脚输出低电平信号,直到IR2的所有位都为’0’。一旦通过Sn_IR将IR2所有位都清零,INT5就变回高电平。   感谢阅读! 相关内容请查看: 单片机以太网控制芯片W7100A数据手册(一)(http://blog.iwiznet.cn/?p=4157) 单片机以太网控制芯片W7100A数据手册(二)(http://blog.iwiznet.cn/?p=4160)