tag 标签: 功能描述

相关博文
  • 热度 18
    2013-2-7 10:41
    952 次阅读|
    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)
相关资源