W5500之Socket寄存器区介绍
1)、Socket n模式寄存器(Socket n Mode Register,简写Sn_MR)偏移地址为0x0000,可读写,复位值为0x00;
Bit7 | Bit6 | Bit5 | Bit4 | Bit3 | Bit2 | Bit1 | Bit0 |
MULTI/MFEN | BCASTB | ND/MC/MMB | UCASTB/MIP6B | P3 | P2 | P1 | P0 |
MULTI/MFEN占用“Socket n模式寄存器”的bit7:
#define Sn_MR_MULTI 0x80
//Socket n模式寄存器(Socket n Mode Register,简写Sn_MR)bit7(MULTI/MFEN)置1,在UDP模式中,使能“组播”。
/*在将Sn_CR寄存器中的OPEN=1之前,必须先将Sn_DIPR寄存器配置为组播的IP地址“224, 1, 1, 11”,再将Sn_DPORT寄存器配置为组播的端口6000,才可以使用组播。*/
#define Sn_MR_MFEN Sn_MR_MULTI
/*Socket n模式寄存器(Socket n Mode Register,简写Sn_MR)bit7(MULTI/MFEN)置1,在MACRAW模式中,表示使能“MAC滤波器”。*/
BCASTB占用“Socket n模式寄存器”的bit6:
它是“Broadcast Blocking in MACRAW and UDP mode”的简写。BCASTB=1表示使能“UDP广播阻塞模式”或 “MACRAW广播阻塞模式”。
#define Sn_MR_BCASTB 0x40
/*Socket n模式寄存器(Socket n Mode Register,简写Sn_MR)bit6(BCASTB)置1,
在UDP模式中,表示使能阻塞接收“广播数据包”;
在MACRAW模式中,表示使能阻塞接收“广播数据包”;*/
ND/MC/MMB占用“Socket n模式寄存器”的bit5:
#define Sn_MR_ND 0x20
/*Socket n模式寄存器(Socket n Mode Register,简写Sn_MR)bit5(ND/MC/MMB),
在TCP模式中,ND/MC/MMB=1后,W5500一旦收到一个数据包,就会毫不延迟地发送ACK包;在TCP模式中,ND/MC/MMB=0后,W5500会等待“RTR重试定时值寄存器”配置的超时时间后,再发送ACK数据包;*/
#define Sn_MR_MMB Sn_MR_ND
/*Socket n模式寄存器(Socket n Mode Register,简写Sn_MR)bit5(ND/MC/MMB),
在UDP模式中,且MULTI/MFEN=1(使能组播),如果ND/MC/MMB=0,表示IGMP版本2;如果ND/MC/MMB=1,表示IGMP版本1;*/
#define Sn_MR_MC Sn_MR_ND
/*Socket n模式寄存器(Socket n Mode Register,简写Sn_MR)bit5(ND/MC/MMB),
在MACRAW模式中,如果ND/MC/MMB=1,则表示使能阻塞接收“具有组播的MAC地址的数据包”;*/
UCASTB/MIP6B占用“Socket n模式寄存器”的bit4:
#define Sn_MR_UCASTB 0x10
/*Socket n模式寄存器(Socket n Mode Register,简写Sn_MR)bit4(UCASTB/MIP6B),
在UDP模式中,且MULTI/MFEN=1(使能组播),如果UCASTB/MIP6B=1,它会阻止接收“单播数据包”;*/
#define Sn_MR_MIP6B Sn_MR_UCASTB
/*Socket n模式寄存器(Socket n Mode Register,简写Sn_MR)bit4(UCASTB/MIP6B),
在MACRAW模式中,如果UCASTB/MIP6B=1,它会阻止接收IPv6数据包;*/
P[3:0]占用“Socket n模式寄存器”的bit3:0
#define Sn_MR_CLOSE 0x00
/*Socket n模式寄存器(Socket n Mode Register,简写Sn_MR)中的bit3:0(P[3:0])=0000B,表示Socket n没有使用任何协议*/
P[3:0]=0001B,表示Socket n被配置为TCP协议。
#define Sn_MR_TCP 0x01
/*Socket n模式寄存器(Socket n Mode Register,简写Sn_MR)中的bit3:0(P[3:0])=0001B,表示Socket n使用TCP协议*/
P[3:0]=0010B,表示Socket n被配置为UDP协议。
#define Sn_MR_UDP 0x02
/*Socket n模式寄存器(Socket n Mode Register,简写Sn_MR)中的bit3:0(P[3:0])=0010B,表示Socket n使用UDP协议*/
#define Sn_MR_IPRAW 0x03
/*Socket n模式寄存器(Socket n Mode Register,简写Sn_MR)中的bit3:0(P[3:0])=0011B,表示Socket n使用IPRAW协议。IPRAW属于IP层的数据通信,它是比TCP、UDP低一层协议。 IP LAYER RAW SOCK*/
P[3:0]=0100B,表示Socket n被配置为MACRAW协议。
#define Sn_MR_MACRAW 0x04
/*Socket n模式寄存器(Socket n Mode Register,简写Sn_MR)中的bit3:0(P[3:0])=0100B,表示Socket n使用MACRAW协议。MACRAW是一个低于IP层的以太网MAC通信。Socket 0使用MACRAW协议模式*/
地址重定义:
#define Sn_MR(N) (_W5500_IO_BASE_+(0x0000<< 8)+(WIZCHIP_SREG_BLOCK(N)<<3))
//设置“Socket n模式寄存器”在W5500帧中的“第1个字节,第2个字节,第3个字节的高5位和低3位为0”
//WIZCHIP_SREG_BLOCK(N)用来指定位于哪个“Socket n模式寄存器”
//WIZCHIP_SREG_BLOCK(N)左移3位,是因为BSB[4:0]位于控制段的bit7:3
2)、Socket n命令寄存器(Socket n Command Register,简写Sn_CR)偏移地址为0x0001,可读写,复位值为0x00;
“Socket n命令寄存器”用来设置“OPEN,CLOSE,CONNECT,LISTEN,SEND和RECEIVE”命令。W5500接收命令后,就令“Socket n命令寄存器”的Sn_CR=0x00。即使Sn_CR= 0x00,可能该命令还在处理中,为了检查“命令”是否被处理完成,请检查“Socket n中断寄存器(Socket n Interrupt Register,简写Sn_IR)”或“Socket n状态寄存器(Socket n Status Register,简写Sn_SR)”。
#define Sn_CR_OPEN 0x01
/*Socket n命令寄存器(Socket n Command Register,简写Sn_CR)的值为0x01,
根据“Socket n模式寄存器(Socket n Mode Register,简写Sn_MR)”中P[3:0]指定的协议(TCP, UDP和 MACRAW),初始化并打开“Socket n”;
执行后,“Socket n状态寄存器(Socket n Status Register,简写Sn_SR)”的值如下:
在无协议模式中,Sn_SR=0x00,用SOCK_CLOSED表示,Sn_MR中的P[3:0]用Sn_MR_CLOSE表示;
在TCP模式中,Sn_SR=0x13,用SOCK_INIT表示,Sn_MR中的P[3:0]用Sn_MR_TCP表示;
在UDP模式中,Sn_SR=0x22,用SOCK_UDP表示,Sn_MR中的P[3:0]用Sn_MR_UDP表示;
在MACRAW模式中,Sn_SR=0x42,用SOCK_MACRAW表示,Sn_MR中的P[3:0]用Sn_MR_MACRAW表示;*/
#define Sn_CR_LISTEN 0x02
/*Socket n命令寄存器(Socket n Command Register,简写Sn_CR)的值为0x02,只用于TCP服务器模式,等待接收来自“TCP客户端”的连接请求。
当Sn_SR寄存器从SOCK_INIT变成SOCKET_LISTEN时,令“Socket n命令寄存器(Socket n Command Register,简写Sn_CR)的值为0x02”,
当“TCP客户端的连接请求”建立成功后,Sn_SR寄存器从SOCK_LISTEN变成SOCK_ESTABLISHED,且Sn_IR寄存器的bit0=1。
当“TCP客户端的连接请求”建立失败后,Sn_SR寄存器从SOCK_LISTEN变成SOCK_CLOSED,Sn_IR寄存器的bit1=1。*/
#define Sn_CR_CONNECT 0x04
/*Socket n命令寄存器(Socket n Command Register,简写Sn_CR)的值为0x04,只用于TCP客户端模式,“TCP客户端”会发送“SYN包”给“TCP服务端”。如果连接请求成功,Sn_SR寄存器从SOCK_INIT变成SOCK_ESTABLISHED,且Sn_IR寄存器的bit0=1。*/
#define Sn_CR_DISCON 0x08
/*Socket n命令寄存器(Socket n Command Register,简写Sn_CR)的值为0x08,只用于TCP模式。无论是“TCP服务器”,还是“TCP客户端”,DISCON命令用来处理“断开连接进程”(“主动关闭[Active close]”或“被动关闭[Passive close]”);
“主动关闭[Active close]”就是它将断开连接请求(FIN数据包)传输到“所连接的对等端”。
“被动关闭[Passive close]”就是当从“对等端”接收到FIN数据包时,再将FIN数据包回传给“对等端”。
当“断开请求成功”,就是说“FIN数据包”和“ACK数据包”被成功接收了,Sn_SR寄存器变成SOCK_CLOSED,
否则,Sn_IR寄存器的bit3=1,然后再让Sn_SR寄存器变成SOCK_CLOSED。
如果“Socket n关闭”不是由“DISCON命令”引起的,则不用发送“断开请求”,Sn_SR寄存器就会变成SOCK_CLOSED;
如果“Socket n关闭”是采用通讯从“对等端”接收到“RST数据包”,Sn_SR寄存器会无条件变成SOCK_CLOSED;
*/
#define Sn_CR_CLOSE 0x10
/*Socket n命令寄存器(Socket n Command Register,简写Sn_CR)的值为0x10,
执行CLOSE命令,就会关闭“Socket n”,同时,Sn_SR寄存器变成SOCK_CLOSED*/
#define Sn_CR_SEND 0x20
/*Socket n命令寄存器(Socket n Command Register,简写Sn_CR)的值为0x20,
执行SEND命令,将位于“Socket n TX buffer”中的数据发送出去,了解更多详情,
请参考“Socket n的发送缓冲区剩余量大小寄存器(Socket n TX Free Size Register,简写Sn_TX_FSR)”,“Socket n的发送缓冲区写指针寄存器(Socket n TX Write Pointer Register,简写Sn_TX_WR)”和“Socket n的发送缓冲区读指针寄存器(Socket n TX Read Pointer Register,简写Sn_TX_RD)”*/
#define Sn_CR_SEND_MAC 0x21
/*Socket n命令寄存器(Socket n Command Register,简写Sn_CR)的值为0x21,
只用于“UDP模式”,基本操作是与发送“SEND命令”相同的。一般来说,发送“SEND命令数据”通常需要先通过自动ARP(地址解析协议)请求获得“目的地MAC地址”才能进行传输。而“SEND_MAC命令” 却不需要使用自动ARP请求。此时,“目的地MAC地址”使用的是主机Sn_DHAR 的设置,而不是通过ARP过程获取的。*/
#define Sn_CR_SEND_KEEP 0x22
/*Socket n命令寄存器(Socket n Command Register,简写Sn_CR)的值为0x22,
只用于TCP模式,SEND_KEEP命令通过发送“1字节在线心跳包”来检查连接状态。如果“对方”不能在“超时计数期”内反馈“在线心跳包”,这个连接将会被关闭并触发“超时中断”。*/
#define Sn_CR_RECV 0x40
/*Socket n命令寄存器(Socket n Command Register,简写Sn_CR)的值为0x40,
“RECV命令”通过使用“Socket n的接收缓冲区的接收量大小寄存器(Socket n RX Received Size Register,简写Sn_RX_RSR)”来完成在“Socket n接收缓存”中接收数据的过程。了解更多详情,请参考“Socket n的接收缓冲区的接收量大小寄存器(Socket n RX Received Size Register,简写Sn_RX_RSR)”,“Socket n的的接收缓冲区的读指针寄存器(Socket n RX Read Pointer Register,简写Sn_RX_RD)”和“Socket n的接收缓冲区的写指针寄存器(Socket n RX Write Pointer Register,简写Sn_RX_WR)”*/
3)、Socket n中断寄存器(Socket n Interrupt Register,简写Sn_IR)偏移地址为0x0002。只读,复位值为0x00;
Bit7 | Bit6 | Bit5 | Bit4 | Bit3 | Bit2 | Bit1 | Bit0 |
Reserved | Reserved | Reserved | SEND_OK | TIMEOUT | RECV | DISCON | CON |
Sn_IR寄存器的bit7:5为保留。
#define Sn_IR_SENDOK 0x10
/*(Socket n中断寄存器(Socket n Interrupt Register,简写Sn_IR)的bit4为SEND_OK
如果“SEND命令”执行完成,则SEND_OK=1。*/
#define Sn_IR_TIMEOUT 0x08
/*Socket n中断寄存器(Socket n Interrupt Register,简写Sn_IR)的bit3为TIMEOUT
如果“ARP数据包或者TCP数据包”超时,则TIMEOUT=1;*/
#define Sn_IR_RECV 0x04
/*Socket n中断寄存器(Socket n Interrupt Register,简写Sn_IR)的bit2为RECV;
如果接收到“对方的数据”,则RECV=1;*/
#define Sn_IR_DISCON 0x02
/*Socket n中断寄存器(Socket n Interrupt Register,简写Sn_IR)的bit1为DISCON;
如果接收到来自“对方的FIN或FIN/ACK包”,则DISCON=1;*/
#define Sn_IR_CON 0x01
/*Socket n中断寄存器(Socket n Interrupt Register,简写Sn_IR)的bit0为CON;
如果与对方建立连接成功,且Sn_SR寄存器变为“SOCK_ESTABLISHED”,则CON=1;*/
地址重定义:
#define Sn_IR(N) (_W5500_IO_BASE_+(0x0002<< 8) + (WIZCHIP_SREG_BLOCK(N)<< 3))
/*生成“W5500帧”的第1个字节,第2个字节和第3个字节的高5位值,低3位为0,用来访问Socket n中断寄存器(Socket n Interrupt Register,简写Sn_IR)
Socket n中断寄存器(Socket n Interrupt Register,简写Sn_IR)偏移地址为0x0002。
WIZCHIP_SREG_BLOCK(N)用来选择“Socket n寄存器区”*/
4)、Socket n状态寄存器(Socket n Status Register,简写Sn_SR)偏移地址为0x0003。
#define SOCK_CLOSED 0x00
/*如果“Socket n状态寄存器(Socket n Status Register,简写Sn_SR)”的值为0x00,
用SOCK_CLOSED表示,“Socket n”处于关闭状态,资源被释放。
当DICON命令,CLOSE命令被执行,或当触发超时中断时,“Sn_SR寄存器”变为0x00,即SOCK_CLOSED;*/
#define SOCK_INIT 0x13
/*如果“Socket n状态寄存器(Socket n Status Register,简写Sn_SR)”的值为0x13,
用SOCK_INIT表示,表示“Socket n”以TCP模式打开。首先将“Socket n模式寄存器(Socket n Mode Register,简写Sn_MR)”中的bit3:0(P[3:0])=0001B,即设置为“TCP模式”;再将Sn_CR寄存器中的OPEN命令置1,则Sn_SR寄存器的值为0x13,即SOCK_INIT*/
#define SOCK_LISTEN 0x14
/*如果“Socket n状态寄存器(Socket n Status Register,简写Sn_SR)”的值为0x14,
用SOCK_LISTEN表示,表示“Socket n”工作在“TCP服务器模式”,正在等待“来自TCP客户端的连接请求”。当TCP服务器成功接收到“连接请求”时,Sn_SR寄存器的值变成为SOCK_ESTALBLISHED;否则,Sn_IR寄存器中的TIMEOUT置1,并触发TCP超时中断,Sn_SR寄存器的值才会变成为SOCK_CLOSED;*/
#define SOCK_ESTABLISHED 0x17
/*如果“Socket n状态寄存器(Socket n Status Register,简写Sn_SR)”的值为0x17,
用SOCK_ESTABLISHED表示;在Sn_SR寄存器的值为“SOCK_LISTEN”时,如果 “TCP服务器”处理来自“TCP客户端”的SYN数据包,或者是“TCP客户端”设置“CONNECT命令(SYN数据包)”成功,Sn_SR寄存器的值都会变成SOCK_ESTABLISHED。在Sn_SR寄存器的值为“SOCK_ESTABLISHED”时,“数据包”就可以使用“SEND命令”发送,或是通过“RECV命令”执行接收。*/
#define SOCK_CLOSE_WAIT 0x1C
/*如果“Socket n状态寄存器(Socket n Status Register,简写Sn_SR)”的值为0x1C,
用SOCK_CLOSE_WAIT表示“半关闭状态”;这个状态表示“Socket n”接收到来自“对方端”的“FIN数据包(断开请求)”,这是一个“半关闭状态”,可以进行数据传输。若要完全关闭,则要执行“DISCON命令”,如果只是关闭“Socket n”,则要执行“CLOSE命令”。*/
#define SOCK_UDP 0x22
/*如果“Socket n状态寄存器(Socket n Status Register,简写Sn_SR)”的值为0x22,
用SOCK_UDP表示“Socket n”在“UDP模式”下打开的。当Sn_MR寄存器的P[3:0]=0010B,
并且“OPEN命令”被执行了,则Sn_SR的值就会变成“SOCK_UDP”。不像“TCP模式”,它无需“连接处理”,就可以进行数据传输。*/
#define SOCK_MACRAW 0x42
/*如果“Socket n状态寄存器(Socket n Status Register,简写Sn_SR)”的值为0x42,
用SOCK_MACRAW表示“Socket 0”是在“MACRAW模式”下打开的。
当设置Sn_MR寄存器的P[3:0]=0100B,即“MACRAW模式”,并且“OPEN命令”被执行了,则Sn_SR的值就会变成“SOCK_MACRAW”。和“UDP模式的Socket”一样,“SOCK_MACRAW模式”中的“Socket 0”无需连接处理,就可以直接传输“MAC包(Ethernet frame)”*/
#define SOCK_SYNSENT 0x15
/*如果“Socket n状态寄存器(Socket n Status Register,简写Sn_SR)”的值为0x15,
用SOCK_SYNSENT表示,它是一个临时状态,表示“Socket n”发送“SYN数据包(连接请求包)”给对方。它是在发送“CONNECT命令”后, Sn_SR寄存器的值从SOCK_INIT变成SOCK_ESTABLISHED过程中出现的临时数值。当“Sn_SR寄存器的值”为SOCK_SYNSENT那个时刻,接收到来自对方端的“连接接受包(SYN/ACK数据包)”,
然后“Sn_SR寄存器的值”就变成为SOCK_ESTABLISHED。否则,出现TCP超时后,“Sn_SR寄存器的值”会变成SOCK_CLOSED。*/
#define SOCK_SYNRECV 0x16
/*如果“Socket n状态寄存器(Socket n Status Register,简写Sn_SR)”的值为0x16,
用SOCK_SYNRECV表示,它是一个临时状态,表示“Socket n”成功接收来自对方端的“SYN数据包(连接请求包)”。如果“Socket n”成功发送“SYN/ACK应答数据包”给对方端,“Sn_SR寄存器的值”会变成SOCK_ESTABLISHED。如果发送失败,在出现超时(Sn_IR寄存器的TIMEOUT位置1)后,“Sn_SR寄存器的值”会变成SOCK_CLOSED。
*/
#define SOCK_FIN_WAIT 0x18
/*如果“Socket n状态寄存器(Socket n Status Register,简写Sn_SR)”的值为0x18,
用SOCK_FIN_WAIT表示,它是一个临时状态,表示“Socket n”正在关闭。它显示在“断开处理”中,是主动关闭还是被动关闭。当“断开处理”完成,或是超时,“Sn_SR寄存器的值”会变成SOCK_CLOSED。*/
#define SOCK_CLOSING 0x1A
/*如果“Socket n状态寄存器(Socket n Status Register,简写Sn_SR)”的值为0x1A,
用SOCK_CLOSING表示,它是一个临时状态,表示“Socket n”正在关闭。它显示在“断开处理”中,是主动关闭还是被动关闭。当“断开处理”完成,或是超时,“Sn_SR寄存器的值”会变成SOCK_CLOSED。*/
#define SOCK_TIME_WAIT 0x1B
/*如果“Socket n状态寄存器(Socket n Status Register,简写Sn_SR)”的值为0x1B,
用SOCK_TIME_WAIT表示,它是一个临时状态,表示“Socket n”正在关闭。它显示在“断开处理”中,是主动关闭还是被动关闭。当“断开处理”完成,或是超时,“Sn_SR寄存器的值”会变成SOCK_CLOSED。*/
#define SOCK_LAST_ACK 0x1D
/*如果“Socket n状态寄存器(Socket n Status Register,简写Sn_SR)”的值为0x1D,
用SOCK_LAST_ACK表示。它是一个临时状态,表示“Socket n”在被动关闭状态下,正在等待对“断开连接请求(FIN packet)”做出回应的“FIN/ACK数据包”。如果“Socket n”成功接收到了“断开连接请求(FIN packet)”做出回应的“FIN/ACK数据包”或触发超时中断,则 “Sn_SR寄存器的值”会变成SOCK_CLOSED。*/
地址重定义:
#define Sn_SR(N) (_W5500_IO_BASE_+(0x0003<< 8)+(WIZCHIP_SREG_BLOCK(N)<< 3))
/*生成“W5500帧”的第1个字节,第2个字节和第3个字节的高5位值,低3位为0,用来访问Socket n状态寄存器(Socket n Status Register,简写Sn_SR);
Socket n状态寄存器(Socket n Status Register,简写Sn_SR)偏移地址为0x0003。
WIZCHIP_SREG_BLOCK(N)用来选择“Socket n寄存器区”*/
5)、Socket n源端口寄存器(Socket n Source Port Register,简写Sn_PORT)偏移地址为0x0004,可读写,复位值为0x0000;采用“大端存储方式”。
寄存器地址 | 0x0004 | 0x0005 |
寄存器名称 | Sn_PORT0 (高8位数值) | Sn_PORT1 (低8位数值) |
“Socketn源端口寄存器”保存的是“Socket n的端口”,属于“本地端口”。
地址重定义:
#define Sn_PORT(N) (_W5500_IO_BASE_+(0x0004<<8)+(WIZCHIP_SREG_BLOCK(N)<< 3))
/*生成“W5500帧”的第1个字节,第2个字节和第3个字节的高5位值,低3位为0,用来访问Socket n源端口寄存器(Socket n Source Port Register);
Socket n源端口寄存器(Socket n Source Port Register)偏移地址为0x0004。
WIZCHIP_SREG_BLOCK(N)用来选择“Socket n寄存器区”*/
6)、Socket n的目的硬件地址寄存器(Socket n Destination Hardware Address Register,简写Sn_DHAR)偏移地址为0x0006,可读写,复位值为0xFFFFFFFFFF;采用“大端存储方式”。
寄存器地址 | 0x0006 | 0x0007 | 0x0008 | 0x0009 | 0x000A | 0x000B |
寄存器名称 | Sn_DHAR0 | Sn_DHAR1 | Sn_DHAR2 | Sn_DHAR3 | Sn_DHAR4 | Sn_DHAR5 |
在“UDP模式”中,当发送“SEND_MAC命令”时,“Socket n的目的硬件地址寄存器”保存的是“Socket n”要访问的“MAC地址”。在“ARP过程”中,通过“CONNECT命令/SEND命令”获取“目的硬件地址”。
地址重定义:
#define Sn_DHAR(N) (_W5500_IO_BASE_+(0x0006<< 8)+(WIZCHIP_SREG_BLOCK(N)<< 3))
/*生成“W5500帧”的第1个字节,第2个字节和第3个字节的高5位值,低3位为0,
“Socket n的目的硬件地址寄存器”偏移地址为0x0006。
WIZCHIP_SREG_BLOCK(N)用来选择“Socket n寄存器区”*/
7)、Socket n的目的IP地址寄存器(Socket n Destination IP Address Register,简写Sn_DIPR)偏移地址为0x000C,可读写,复位值为0xFFFFFFFF;采用“大端存储方式”。
寄存器地址 | 0x000C | 0x000D | 0x000E | 0x000F |
寄存器名称 | Sn_DIPR0 | Sn_DIPR1 | Sn_DIPR2 | Sn_DIPR3 |
在“TCP客户端模式”中,还没有使用“CONNECT命令”之前,“Socket n的目的IP地址寄存器”保存的是“TCP 服务器”的IP地址。
在“TCP服务器模式”中,“Socket n的目的IP地址寄存器”保存的是“TCP客户端”已成功地建立了连接的IP地址
在“UDP模式”中,“Socket n的目的IP地址寄存器”保存的是“对方端”的IP地址,它是通过“SEND命令”或“SEND_MAC命令”接收“UDP数据包”得到的。
地址重定义:
#define Sn_DIPR(N) (_W5500_IO_BASE_ + (0x000C << 8) + (WIZCHIP_SREG_BLOCK(N) << 3))
/*生成“W5500帧”的第1个字节,第2个字节和第3个字节的高5位值,低3位为0,
Socket n的目的IP地址寄存器偏移地址为0x000C。
WIZCHIP_SREG_BLOCK(N)用来选择“Socket n寄存器区”*/
8)、Socket n的目的端口寄存器(Socket n Destination Port Register,简写Sn_DPORT)偏移地址为0x0010,可读写,复位值为0x0000;采用“大端存储方式”。
寄存器地址 | 0x0010 | 0x0011 |
寄存器名称 | Sn_DPORT0 | Sn_DPORT1 |
在“TCP客户端模式”中,还没有使用“CONNECT命令”之前,“Socket n的目的端口寄存器”保存的是“TCP 服务器的监听端口”。
在“TCP服务器模式”中,“Socket n的目的端口寄存器”保存的是“TCP客户端”已成功地建立了连接的端口数值
在“UDP模式”中,“Socket n的目的端口寄存器”保存的是“对方端”的端口数值,它是通过“SEND命令”或“SEND_MAC命令”接收“UDP数据包”得到的。
地址重定义:
#define Sn_DPORT(N) (_W5500_IO_BASE_ + (0x0010 << 8) + (WIZCHIP_SREG_BLOCK(N) << 3))
/*生成“W5500帧”的第1个字节,第2个字节和第3个字节的高5位值,低3位为0,
Socket n的目的端口寄存器偏移地址为0x0010。
WIZCHIP_SREG_BLOCK(N)用来选择“Socket n寄存器区”;*/
9)、Socket n的最大分段大小寄存器(Socket n Maximum Segment Size Register,简写Sn_MSSR)偏移地址为0x0012,可读写,复位值为0x0000;采用“大端存储方式”。
寄存器地址 | 0x0012 | 0x0013 |
寄存器名称 | Sn_MSSR0 | Sn_MSSR1 |
注意:MSS是“Maximum Segment Size”的缩写,它指在TCP连接中,一个“TCP段”所能承载的最大数据量。当TCP工作在被动模式时,“Socket n的最大分段大小寄存器”显示的是“对方端的设置的MSS”。
地址重定义:
#define Sn_MSSR(N) (_W5500_IO_BASE_ + (0x0012 << 8) + (WIZCHIP_SREG_BLOCK(N) << 3))
/*生成“W5500帧”的第1个字节,第2个字节和第3个字节的高5位值,低3位为0,
“Socket n的最大分段大小寄存器”的偏移地址为0x0012。
WIZCHIP_SREG_BLOCK(N)用来选择“Socket n寄存器区”;*/
10)、Socket n的IP报文转发优先级寄存器(Socket n IP TOS Register,简写Sn_TOS)是Sn_TOS寄存器,偏移地址为0x0015,可读写,复位值为0x00;
TOS是“Type Of Service field in IP Header”的缩写,IP报头中的服务字段的类型。
地址重定义:
#define Sn_TOS(N) (_W5500_IO_BASE_ + (0x0015 << 8) + (WIZCHIP_SREG_BLOCK(N) << 3))
/*生成“W5500帧”的第1个字节,第2个字节和第3个字节的高5位值,低3位为0,
Socket n的IP报文转发优先级寄存器偏移地址为0x0015。
WIZCHIP_SREG_BLOCK(N)用来选择“Socket n寄存器区”;*/
11)、Socket n的TTL值寄存器(Socket n IP TTL Register,简写Sn_TTL)是Sn_TTL寄存器,偏移地址为0x0016,可读写,复位值为0x80;
TTL是“Time To Live field in IP header”的缩写。每个IP数据包在被转发时,其“TTL值”就会被减一。一旦TTL值变为零,路由器会丢弃该数据包,并发送一个“ICMP Time Exceeded消息”回“源主机”,通知“源端数据包”已经超时无法到达目的地。
地址重定义:
#define Sn_TTL(N) (_W5500_IO_BASE_ + (0x0016 << 8) + (WIZCHIP_SREG_BLOCK(N) << 3))
/*生成“W5500帧”的第1个字节,第2个字节和第3个字节的高5位值,低3位为0,
Socket n的TTL值寄存器(Socket n IP TTL Register,简写Sn_TTL)偏移地址为0x0016。
WIZCHIP_SREG_BLOCK(N)用来选择“Socket n寄存器区”;*/
12)、Socket n的接收缓冲区大小寄存器(Socket n Receive Buffer Size Register,简写Sn_RXBUF_SIZE)偏移地址为0x001E,可读写,复位值为0x02,即“Socket n”接收缓存的大小为2K字节。
用来指定“Socket n”接收缓存的大小。
W5500有一个“16KB的接收内存”用作“8个Socket接收缓存区”,可以通过 “Sn_RXBUF_SIZE寄存器”,偏重新分配“各个Socket接收缓存的大小”,但“8个Socket接收缓存区”的总内存不能超过16K。注意:“Socket n接收缓存区大小”可以配置 为1K,2K,4K,8K和16K字节。如果配置为其他大小,则 W5500不能正常的从对方主机接收数据。
地址重定义:
#define Sn_RXBUF_SIZE(N) (_W5500_IO_BASE_ + (0x001E << 8) + (WIZCHIP_SREG_BLOCK(N) << 3))
/*生成“W5500帧”的第1个字节,第2个字节和第3个字节的高5位值,低3位为0,
“Socket n的接收缓冲区大小寄存器”偏移地址为0x001E。
WIZCHIP_SREG_BLOCK(N)用来选择“Socket n寄存器区”;*/
13)、Socket n的发送缓冲区大小寄存器(Socket n Transmit Buffer Size Register,简写Sn_TXBUF_SIZE)偏移地址为0x001F,可读写,复位值为0x02,即“Socket n”发送缓存的大小为2K字节。
用来指定该Socket发送缓存的大小。
W5500有一个“16KB的发送内存”用作“8个Socket发送缓存区”,通过 “Sn_TXBUF_SIZE寄存器”,重新分配“各个Socket发送缓存的大小”,但“8个Socket发送缓存区”的总内存不能超过16K。注意:“Socket n发送缓存区大小”可以配置为1K,2K,4K,8K和16K字节。如果配置为其他大小,则 W5500不能正常给对方主机发送数据。
地址重定义:
#define Sn_TXBUF_SIZE(N) (_W5500_IO_BASE_ + (0x001F << 8) + (WIZCHIP_SREG_BLOCK(N) << 3))
/*生成“W5500帧”的第1个字节,第2个字节和第3个字节的高5位值,低3位为0,
“Socket n的发送缓冲区大小寄存器”偏移地址为0x001F。
WIZCHIP_SREG_BLOCK(N)用来选择“Socket n寄存器区”;*/
14)、Socket n的发送缓冲区剩余量大小寄存器(Socket n TX Free Size Register,简写Sn_TX_FSR)偏移地址为0x0020,可读写,复位值为0x0800,即“Socket n的发送缓冲区”有2K字节是没有使用。采用“大端存储方式”。
寄存器地址 | 0x0020 | 0x0021 |
寄存器名称 | 高8位 | 低8位 |
“Socket n的发送缓冲区剩量余大小寄存器”用来指示“Socket n的发送缓冲区”的空闲区有多少个字节没有被使用,意思是还可以写入多少个字节。
地址重定义:
#define Sn_TX_FSR(N) (_W5500_IO_BASE_ + (0x0020 << 8) + (WIZCHIP_SREG_BLOCK(N) << 3))
/*生成“W5500帧”的第1个字节,第2个字节和第3个字节的高5位值,低3位为0;
“Socket n的发送缓冲区剩余量大小寄存器”偏移地址为0x0020;
WIZCHIP_SREG_BLOCK(N)用来选择“Socket n寄存器区”;*/
15)、Socket n的发送缓冲区读指针寄存器(Socket n TX Read Pointer Register,简写Sn_TX_RD)偏移地址为0x0022,只读,复位值为0x0000;
寄存器地址 | 0x0022 | 0x0023 |
寄存器名称 | Sn_TX_RD0 | Sn_TX_RD1 |
“Socket n的发送缓冲区读指针寄存器”通过“OPEN命令”进行初始化。但是在“TCP连接”期间,它会被重新初始化。“Socket n的发送缓冲区读指针寄存器”初始化之后,会根据“SEND命令”自增。
“SEND命令”传输的是“Socket n的发送缓冲区”中的数据,即“Sn_TX_RD所指向的地址”到“Sn_TX_WR所指向的地址”之间的数据。在传输完这部分数据之后,“SEND命令”会将“Sn_TX_RD寄存器”等于“Sn_TX_WR寄存器” 的值。
当“Sn_TX_RD寄存器”增加的值超出最大值0xFFFF,“Sn_TX_RD寄存器”会忽略进位,仅使用低16位的值。
地址重定义:
#define Sn_TX_RD(N) (_W5500_IO_BASE_ + (0x0022 << 8) + (WIZCHIP_SREG_BLOCK(N) << 3))
/*生成“W5500帧”的第1个字节,第2个字节和第3个字节的高5位值,低3位为0;
“Socket n的发送缓冲区读指针寄存器”偏移地址为0x0022;
WIZCHIP_SREG_BLOCK(N)用来选择“Socket n寄存器区”;*/
18)、Socket n的发送缓冲区写指针寄存器(Socket n TX Write Pointer Register,简写Sn_TX_WR)偏移地址为0x0024,可读可写,复位值为0x0000;采用“大端存储方式”。
寄存器地址 | 0x0024 | 0x0025 |
寄存器名称 | Sn_TX_WR0 | Sn_TX_WR1 |
“Sn_TX_WR寄存器”可以通过“OPEN命令”进行初始化。但是在“TCP连接”期间,它会被重新初始化。
“Socket n的发送缓冲区写指针寄存器”的读取和更新:
①读取“Socket n的发送缓冲区”中将要保存“传输数据的首地址”。
②从“Socket n的发送缓冲区”对应的首地址开始,保存需要“传输的数据”;
③在保存完“传输数据”之后,将“Sn_TX_WR寄存器”的值增加到传输数据大小。如果增加后,超过最大值0xFFFF,“Sn_TX_WR寄存器”会自动忽略进位,并自动更新为低16位的值。
④通过使用“SEND命令”发送保存在“Socket n的发送缓冲区”中的数据。
地址重定义:
#define Sn_TX_WR(N) (_W5500_IO_BASE_ + (0x0024 << 8) + (WIZCHIP_SREG_BLOCK(N) << 3))
/*生成“W5500帧”的第1个字节,第2个字节和第3个字节的高5位值,低3位为0;
“Socket n的发送缓冲区写指针寄存器”偏移地址为0x0024;
WIZCHIP_SREG_BLOCK(N)用来选择“Socket n寄存器区”;*/
17)、Socket n的接收缓冲区的接收量大小寄存器(Socket n RX Received Size Register,简写Sn_RX_RSR)偏移地址为0x0026,可读可写,复位值为0x0000;采用“大端存储方式”。
寄存器地址 | 0x0026 | 0x0027 |
寄存器名称 | Sn_RX_RSR0 | Sn_RX_RSR1 |
“Socket n的接收缓冲区的接收量大小寄存器”显示了“Socket n的接收缓冲区”中已接收和保存的数据大小。Sn_RX_RSR的值不会超过“Sn_RXBUF_SIZE寄存器”大小,且计算的为“Socket n的接收缓冲区的写指针(Sn_RX_WR)” 和“Socket n的的接收缓冲区的读指针(Sn_RX_RD)”之间的空间大小。
地址重定义:
#define Sn_RX_RSR(N) (_W5500_IO_BASE_ + (0x0026 << 8) + (WIZCHIP_SREG_BLOCK(N) << 3))
/*生成“W5500帧”的第1个字节,第2个字节和第3个字节的高5位值,低3位为0;
“Socket n的接收缓冲区的接收量大小寄存器”偏移地址为0x0026;
WIZCHIP_SREG_BLOCK(N)用来选择“Socket n寄存器区”;*/
18)、Socket n的的接收缓冲区的读指针寄存器(Socket n RX Read Pointer Register,简写Sn_RX_RD)偏移地址为0x0028,可读可写,复位值为0x0000;采用“大端存储方式”。
寄存器地址 | 0x0028 | 0x0029 |
寄存器名称 | Sn_RX_RD0 | Sn_RX_RD1 |
“Socket n的的接收缓冲区的读指针寄存器”可以通过“OPEN命令”进行初始化。
“Socket n的的接收缓冲区的读指针寄存器”读取更新步骤:
①读取保存在“Socket n的的接收缓冲区”中数据的首地址;
②从保存在“Socket n的的接收缓冲区”中数据的首地址开始读取数据;
③在读取完毕“接收数据”后,将“Socket n的的接收缓冲区的读指针寄存器Sn_RX_RD” 的值更新为“所读数据大小”。如果增加后的值 超过最大值 0xFFFF,“Socket n的的接收缓冲区的读指针寄存器”将会忽略进位,只取低16位值。
④在接收到“RECV命令”后,将更新后的“Socket n的的接收缓冲区的读指针寄存器Sn_RX_RD”值告知W5500。
地址重定义:
#define Sn_RX_RD(N) (_W5500_IO_BASE_ + (0x0028 << 8) + (WIZCHIP_SREG_BLOCK(N) << 3))
/*生成“W5500帧”的第1个字节,第2个字节和第3个字节的高5位值,低3位为0;
“Socket n的的接收缓冲区的读指针寄存器”偏移地址为0x0028;
WIZCHIP_SREG_BLOCK(N)用来选择“Socket n寄存器区”;*/
19)、Socket n的接收缓冲区的写指针寄存器(Socket n RX Write Pointer Register,简写Sn_RX_WR)偏移地址为0x002A,只读,复位值为0x0000;采用“大端存储方式”。
寄存器地址 | 0x002A | 0x002B |
寄存器名称 | Sn_RX_WR 0 | Sn_RX_WR 1 |
“Socket n的接收缓冲区的写指针寄存器”通过“OPEN命令”进行初始化。并且随着数据接收自动增加。
如果“Socket n的接收缓冲区的写指针寄存器Sn_RX_WR”的值增长到超过最大值 0xFFFF,将会自动忽略进位,并自动更新为低16位的值。
地址重定义:
#define Sn_RX_WR(N) (_W5500_IO_BASE_ + (0x002A << 8) + (WIZCHIP_SREG_BLOCK(N) << 3))
/*生成“W5500帧”的第1个字节,第2个字节和第3个字节的高5位值,低3位为0;
“Socket n的接收缓冲区的写指针寄存器”偏移地址为0x002A;
WIZCHIP_SREG_BLOCK(N)用来选择“Socket n寄存器区”;*/
20)、Socket n的中断使能寄存器(Socket n Interrupt Mask Register,简写Sn_IMR)偏移地址为0x002C,可读可写,复位值为0xFF;
Bit7 | Bit6 | Bit5 | Bit4 | Bit3 | Bit2 | Bit1 | Bit0 |
Reserved | Reserved | Reserved | SEND_OK | TIMEOUT | RECV | DISCON | CON |
Socket n的中断使能寄存器(Socket n Interrupt Mask Register,简写Sn_IMR)的bit4(SEND_OK)=1,使能“SEND命令”执行完成,产生SEND_OK中断。
Socket n的中断使能寄存器(Socket n Interrupt Mask Register,简写Sn_IMR)的bit3(TIMEOUT)=1,使能“ARP数据包或者TCP数据包”超时,产生TIMEOUT中断。
Socket n的中断使能寄存器(Socket n Interrupt Mask Register,简写Sn_IMR)的bit2(RECV)=1,使能接收到“对方的数据”,产生RECV中断。
Socket n的中断使能寄存器(Socket n Interrupt Mask Register,简写Sn_IMR)的bit1(DISCON)=1,使能接收到来自“对方的FIN或FIN/ACK包”,产生DISCON中断。
Socket n的中断使能寄存器(Socket n Interrupt Mask Register,简写Sn_IMR)的bit0(CON)=1,使能与对方建立连接成功,且Sn_SR寄存器变为“SOCK_ESTABLISHED”,产生CON中断。
地址重定义:
#define Sn_IMR(N) (_W5500_IO_BASE_ + (0x002C << 8) + (WIZCHIP_SREG_BLOCK(N) << 3))
/*生成“W5500帧”的第1个字节,第2个字节和第3个字节的高5位值,低3位为0;
“Socket n的中断使能寄存器”偏移地址为0x002C;
WIZCHIP_SREG_BLOCK(N)用来选择“Socket n寄存器区”;*/
21)、Socket n的IP头中的分片偏移量寄存器(Socket n Fragment Offset in IP header Register,简写Sn_FRAG)偏移地址为0x002D,可读可写,复位值为0x4000;采用“大端存储方式”。
寄存器地址 | 0x002D | 0x002E |
寄存器名称 | Sn_FRAG0 | Sn_FRAG1 |
Fragment Offset:分片偏移,用于标识分片在原始数据报文中的位置。
地址重定义:
#define Sn_FRAG(N) (_W5500_IO_BASE_ + (0x002D << 8) + (WIZCHIP_SREG_BLOCK(N) << 3))
/*生成“W5500帧”的第1个字节,第2个字节和第3个字节的高5位值,低3位为0;
“Socket n的IP头中的分片偏移量寄存器”偏移地址为0x002D;
WIZCHIP_SREG_BLOCK(N)用来选择“Socket n寄存器区”;*/
22)、保活定时器寄存器(Keep alive timer Register,简写Sn_KPALVTR)偏移地址为0x002F,可读可写,复位值为0x00;
保活定时器寄存器也称“Socket在线时间寄存器”,只用于“TCP模式”,时间单位是5秒。
“KA数据包”的条件:当“Sn_SR寄存器”的值为“SOCK_ESTABLISHED”时,W5500与“对方端”至少进行过一次收或发后,或者进行“KA数据包”传输。
如果Sn_KPALVTR > 0,W5500会在“一定时间周期”内自动传输“KA数据包”以检查 TCP 的连接状态(自动在线验证)。
如果Sn_KPALVTR = 0,将不会启动“自动在线验证”。主机可以通过对“保活定时器寄存器(Keep alive timer Register,简写Sn_KPALVTR)”配置,发送“KA数据包”,执行“手动在线验证”。在Sn_KPALVTR > 0时,W5500将会无视“手动在线验证”。
地址重定义:
#define Sn_KPALVTR(N) (_W5500_IO_BASE_ + (0x002F << 8) + (WIZCHIP_SREG_BLOCK(N) << 3))
/*生成“W5500帧”的第1个字节,第2个字节和第3个字节的高5位值,低3位为0;
保活定时器寄存器偏移地址为0x002F;
WIZCHIP_SREG_BLOCK(N)用来选择“Socket n寄存器区”;*/