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寄存器區”;*/