继续给大家介绍W7100A功能描述,电气特性,IR回流焊温度简介(无铅封装)和封装说明的内容。
因为W7100A内部嵌入一个8051兼容的CPU内核和硬件的TCP/IP内核,它可以不需要其它
器件而独立工作。在这一节,将通过一些软件源代码,讲解7100A的初始化和每一种协议(TCP、UDP、IP raw、MACRAW)的通信方法。
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):确定串口通信的定时器/计数器模式。
SM2: 在模式2和模式3时使用。假设这位为’1’,如果接收到的第9位为’1’,则接收该数据,如果第9位为’0’,则忽略该数据。
REN:接收允许(‘1’允许接收)。
TB8: 在模式2和模式3,发送的第8位数据位。
RB8: 在模式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
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(重发次数寄存器)
每一个可配置的TX/RX存储器的最大长度为16K字节。在16K字节的范围内,用户可以将存储器给8个SOCKET任意分配为1K、2K、4K、8K、16K字节。但是TX和RX存储器的设置的总和不能超过16K字节。(TXMAX=16KB,RXMAX=16KB)
图9.1 SOCKET n内部TX/RX存储器的分配
完成W7100A的这三步初始化,W7100A就可以通过以太网进行数据传输。此时,W7100A可以响应来自于网络的Ping请求。
初始化过程完成以后,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服务器”操作流程
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服务器”。当制造 “连接端口”到服务器时,可能会发生像ARPTO、TCPTO这样的超时现象。
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:222.98.173.123,子网掩码:255.255.255.0,则广播IP地址则为:222.98.173.255
对要实现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。
从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数据有部分丢失,这个问题就可以解决。
解决办法如下:
用户想发送的数据的大小不能超过内部TX存储器的大小和默认MTU。主机产生与”接收过程”的数据包一样格式的MACRAW数据,然后发送它。这个时候,如果产生的数据小于60字节,发送的以太网包在内部会以“0填充”的方式扩充到60字节,然后发送。
参考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)
文章评论(0条评论)
登录后参与讨论