新闻中心

EEPW首页 > 嵌入式系统 > 设计应用 > 单片机以太网控制芯片W7100A数据手册(四)

单片机以太网控制芯片W7100A数据手册(四)

作者: 时间:2016-11-26 来源:网络 收藏

例1:SOCKET 0 : 8KB, SOCKET 1 : 2KB

0xFE401E0xFE411E
0x080x02

例2:SOCKET 2 : 1KB, SOCKET 3 : 1KB

0xFE421E0xFE431E
0x010x01

例3: SOCKET 4 : 1KB, SOCKET 5 : 1KB

0xFE441E0xFE451E
0x010x01

例4: SOCKET 6 : 1KB, SOCKET 7 : 1KB

0xFE461E0xFE471E
0x010x01

从上面的例1~例4可以看出,8个SOCKET的RX存储器之和为16K字节。

Sn_TXMEM_SIZE (SOCKET n发送存储器大小寄存器)[R/W][0xFE401F + 0x100n][0x02]

它配置SOCKET的内部TX存储器。每个SOCKET的TX存储器可配置的大小为1、2、4、8、16K字节。复位后默认为2K字节。8个SOCKET的TX存储器之和为16K字节。

例5:SOCKET 0 : 4KB, SOCKET 1 : 1KB

0xFE401F0xFE411F
0x040x01

例6: SOCKET 2 : 2KB, SOCKET 3 : 1KB

0xFE421F0xFE431F
0x020x01

例7:SOCKET 4 : 2KB, SOCKET 5 : 2KB

0xFE441F0xFE451F
0x020x02

例8:SOCKET 6 : 2KB, SOCKET 7 : 2KB

0xFE461F0xFE471F
0x020x02

从上面例5~例8所示,8个SOCKET的TX存储器之和为16K字节。

Sn_TX_FSR (SOCKET n发送存储器剩余空间大小寄存器)[R][(0xFE4020 + 0x100n) – (0xFE4021 + 100n)][0x0000]

它指示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),

0xFE40200xFE4021
0x080x00

Sn_TX_RD (SOCKET n发送存储器读指针寄存器)[R][(0xFE4022 + 0x100n) – (0xFE4023 + 0x100n)][0x0000]

该寄存器显示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发送存储器写指针寄存器)[R/W][(0xFE4024 + 0x100n) – (0xFE4025 + 0x100n)][0x0000]

该寄存器提供定位信息,指示数据应该写入到什么位置。读取该寄存器时,先读取高字节(0xFE4024,0xFE4124,0xFE4224,0xFE4324,0xFE4424,0xFE4524,0xFE4624,0xFE4724),然后再读取低字节(0xFE4025,0xFE4125,0xFE4225,0xFE4325,0xFE4425,0xFE4525,0xFE4625, 0xFE4725),这样读取的数据才正确。

例:S0_TX_WR的值为2048(0x0800)。

0xFE40240xFE4025
0x080x00

但这个值本身不是可以直接访问的物理地址。实际访问的物理地址计算如下:(请参考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接收数据长度寄存器)[R][(0xFE4026 + 0x100n) – (0xFE4027 + 0x100n)][0x0000]

它指示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)

0xFE40260xFE4027
0x080x00

这个值的总长度是由RX存储器大小寄存器决定的。

Sn_RX_RD (SOCKET n RX接收存储器读指针寄存器)[R/W][(0xFE4028 + 0x100n) – (0xFE4029 + 0x100n)][0x0000]

该寄存器确定接收数据的读取地址信息。当读取该寄存器时先读高字节 (0xFE4028,0xFE4128,0xFE4228,0xFE4328,0xFE4428,0xFE4528,0xFE4628,0xFE4728),然后再读低字节(0xFE4029,0xFE4129,0xFE4229,0xFE4329,0xFE4429,0xFE4529,0xFE4629, 0xFE4729),这样读取的信息才正确。

例:S0_RX_RD02048的值为(0x0800)

0x04280x0429
0x080x00

但这个值不是实际要读取的物理地址。实际的物理地址需要由下面的关系计算获得:

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接收存储器写指针寄存器)[R/W][(0xFE402A + 0x100n) – (0xFE402B + 0x100n)][0x0000]

它指示端口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)

0xFE402A0xFE402B
0x080x00

Sn_FRAG(SOCKET n分段寄存器)[R/W][(0xFE402D + 0x100n) – (0xFE402E + 0x100n)][0x4000]

该它设置IP层的IP包头中的分段字段。W7100不支持IP层的分段。即使配置了Sn_FRAG,IP数据包也不能够分段。它需要在OPEN命令之前设置该寄存器。

例:Sn_FRAG0 = 0x4000(不分段)

0xFE402D0xFE402E
0x400x00

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):确定串口通信的定时器/计数器模式。

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

  • 步骤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字节。(TXMAX=16KB,RXMAX=16KB)

图9.1 SOCKET n内部TX/RX存储器的分配

完成W7100A的这三步初始化,W7100A就可以通过以太网进行数据传输。此时,W7100A可以响应来自于网络的Ping请求。

9.2数据通信

初始化过程完成以后,W7100A就可以以TCP、UDP、IPRAW或MACRAW的模式打开SOCKET,并发送和接收数据。W7100A支持8个端口以不同的方式同时进行工作。在这一节将介绍每一种方式的通信方法。

9.2.1TCP

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)的数据包,则不推荐使用这种方法。



评论


技术专区

关闭