單芯片解決方案,開啟全新體驗——W55MH32 高性能以太網單片機
W55MH32是WIZnet重磅推出的高性能以太網單片機,它為用戶帶來前所未有的集成化體驗。這顆芯片將強大的組件集于一身,具體來說,一顆W55MH32內置高性能Arm? Cortex-M3核心,其主頻最高可達216MHz;配備1024KB FLASH與96KB SRAM,滿足存儲與數據處理需求;集成TOE引擎,包含WIZnet全硬件TCP/IP協議棧、內置MAC以及PHY,擁有獨立的32KB以太網收發緩存,可供8個獨立硬件socket使用。如此配置,真正實現了All-in-One解決方案,為開發者提供極大便利。
在封裝規格上,W55MH32 提供了兩種選擇:QFN100和QFN68。
W55MH32L采用QFN100封裝版本,尺寸為12x12mm,其資源豐富,專為各種復雜工控場景設計。它擁有66個GPIO、3個ADC、12通道DMA、17個定時器、2個I2C、5個串口、2個SPI接口(其中1個帶I2S接口復用)、1個CAN、1個USB2.0以及1個SDIO接口。如此豐富的外設資源,能夠輕松應對工業控制中多樣化的連接需求,無論是與各類傳感器、執行器的通信,還是對復雜工業協議的支持,都能游刃有余,成為復雜工控領域的理想選擇。同系列還有QFN68封裝的W55MH32Q版本,該版本體積更小,僅為8x8mm,成本低,適合集成度高的網關模組等場景,軟件使用方法一致。更多信息和資料請進入http://www.w5500.com/網站或者私信獲取。
此外,本W55MH32支持硬件加密算法單元,WIZnet還推出TOE+SSL應用,涵蓋TCP SSL、HTTP SSL以及 MQTT SSL等,為網絡通信安全再添保障。
為助力開發者快速上手與深入開發,基于W55MH32L這顆芯片,WIZnet精心打造了配套開發板。開發板集成WIZ-Link芯片,借助一根USB C口數據線,就能輕松實現調試、下載以及串口打印日志等功能。開發板將所有外設全部引出,拓展功能也大幅提升,便于開發者全面評估芯片性能。
若您想獲取芯片和開發板的更多詳細信息,包括產品特性、技術參數以及價格等,歡迎訪問官方網頁:http://www.w5500.com/,我們期待與您共同探索W55MH32的無限可能。
第二十五章 W55MH32 TCP_Server_Multi_Socket示例
本篇文章,我們將詳細介紹如何在W55MH32芯片上面實現TCP通信。使用W55MH32的TOE引擎,我們只需進行簡單的socket編程及寄存器讀寫,便可輕松實現TCP協議應用。接下來我們通過實戰例程,為大家講解如何使用TOE引擎上的8個socket,設置為TCP Server模式,讓多個客戶端連接進行數據回環測試。
該例程用到的其他網絡協議,例如DHCP,請參考相關章節。有關W55MH32的初始化過程,請參考Network Install章節,這里將不再贅述。
1 TCP協議簡介
TCP (Transmission Control Protocol)是一種面向連接的、可靠的傳輸層協議,它用于在網絡中可靠地傳輸數據。TCP是互聯網協議族中的核心協議之一,通常與 IP協議(Internet Protocol)一起使用,形成套接字通信。
2 TCP協議特點
面向連接:在傳輸數據之前,TCP需要建立一個連接,保證發送方與接收方能夠彼此通信。通過三次握手(Three-Way Handshake)過程來建立連接,確保雙方的通信是可靠的。
可靠性:TCP提供可靠的數據傳輸,確保數據完整并且按順序到達接收端。如果數據丟失或出錯,TCP會自動重傳丟失的數據包。
流量控制:TCP使用流量控制機制來調節數據的發送速度,防止接收方處理不過來導致數據丟失。常用的流量控制方法是滑動窗口(Sliding Window)。
擁塞控制:TCP可以動態調整傳輸速率,以避免網絡擁塞。采用算法如慢啟動、擁塞避免、快速重傳等。
全雙工通信:在 TCP連接建立后,數據可以在兩個方向同時進行傳輸,支持雙向通信。
有序數據傳輸:TCP會對數據包進行編號,確保數據按順序傳輸,即使網絡發生延遲,接收端也能按順序接收到數據。
字節流服務:TCP傳輸的數據是字節流,不關心應用層數據的邊界,應用層需要自己解析數據邊界。
3 TCP與 UDP的區別
TCP是可靠的、面向連接的協議,適合需要數據完整性和順序保證的應用,如網頁瀏覽、文件傳輸等。
UDP(User Datagram Protocol)是無連接、不可靠的協議,適合對時效性要求較高且可以容忍丟包的應用,如視頻流、在線游戲等。
4 TCP應用場景
接下來,我們了解下在W55MH32上,可以使用TCP協議完成哪些操作及應用呢?
遠程監控和數據采集:嵌入式設備通常用于采集傳感器數據,并通過以太網連接上傳到遠程服務器,TCP協議確保數據傳輸的可靠性和完整性。
設備遠程控制:許多嵌入式系統需要通過網絡接收控制指令(例如工業自動化中的PLC控制),TCP協議提供了可靠的通信通道。
物聯網(IoT):許多物聯網設備使用TCP協議與云服務器或其他設備進行通信,傳輸數據、執行命令等。
嵌入式Web服務器:一些嵌入式設備內置Web服務器(例如路由器、網關、傳感器設備等),通過TCP協議提供網頁接口給用戶進行配置和監控。
5使用TCP進行數據交互的流程
TCP連接建立(三次握手)
在開始傳輸數據之前,TCP會通過三次握手建立連接:
第一次握手:客戶端向服務器發送一個帶有 SYN標志的數據包,表示請求建立連接。
第二次握手:服務器收到 SYN數據包后,回復一個帶有 SYN和 ACK標志的數據包,表示同意建立連接。
第三次握手:客戶端收到服務器的 SYN+ACK后,發送一個帶有 ACK標志的數據包,連接建立完成。
數據交互
TCP連接斷開(四次揮手)
當通信結束時,TCP需要通過四次揮手來斷開連接:
第一次揮手:客戶端發送一個 FIN 數據包,表示數據發送完畢,準備關閉連接。
第二次揮手:服務器收到 FIN數據包后,回復一個 ACK數據包,表示同意關閉連接。
第三次揮手:服務器發送一個 FIN 數據包,表示數據發送完畢,準備關閉連接。
第四次揮手:客戶端收到服務器的 FIN數據包后,發送一個 ACK數據包,連接正式關閉。
ACK字段:ACK包含在 TCP報文頭中,表示接收方期望接收的下一個字節的序列號。

TCP 3次握手示意圖

TCP 4次揮手示意圖
6 TCP的ACK機制、重傳機制和Keepalive機制
TCP的ACK機制
ACK 是 TCP用于確認已成功接收到數據包的機制。在 TCP通信中,每個數據包都包含一個序列號,接收方用 ACK來告訴發送方已經成功收到的字節序列。
累積確認:TCP使用累積確認方式,表示接收方已經連續收到所有數據,直到某個序列號為止。
超時重傳:如果發送方在超時時間內未收到 ACK,就會重傳該數據包。
TCP的重傳機制
TCP 的重傳機制保證了數據的可靠傳輸。以下是常見的重傳機制:
超時重傳:
發送方設置一個定時器,當發送的數據包在規定時間內未收到 ACK,則觸發重傳。
超時時間是動態調整的,由 TCP的往返時間(RTT, Round Trip Time)估算得出。
快速重傳:
當接收方發現數據包丟失時,發送重復的 ACK(稱為冗余 ACK),提醒發送方某個數據包未到達。
如果發送方連續收到 3個重復的 ACK,就會立即重傳對應的數據包,而不必等待超時。
選擇性重傳(Selective Repeat, SACK):
在累積確認的基礎上,TCP還可以通過 SACK選項告訴發送方哪些特定的塊已收到,哪些未收到。
這可以減少不必要的重傳,提高效率。
TCP Keepalive機制
TCP Keepalive是 TCP協議的一種可選機制,用于檢測長時間空閑的連接是否仍然有效。它的主要作用是:
維護連接狀態:檢測對方主機是否仍在線,避免資源被長期占用。
釋放死連接:如果連接已經失效(如網絡中斷或對方主機崩潰),Keepalive可以及時釋放資源。
防止中間設備超時關閉連接:一些 NAT、路由器或防火墻可能會在連接長時間不活動時自動關閉,Keepalive可防止這種情況。
用法:在W55MH32的TOE引擎中,需要在Sn_KPALVTR寄存器中設置Keepalive時間,然后在成功連接服務器后發送一條數據來激活Keepalive。
7實現過程
接下來,我們在W55MH32上實現TCP服務器,允許多個設備連接進行數據通信。
注意:測試實例需要PC端和W55MH32處于同一網段。
首先,在主循環中調用multi_tcps_socket()函數:
1. while(1)
2. {
3. multi_tcps_socket(ethernet_buf, local_port);
4. }
5.
multi_tcps_socket()函數的兩個傳參分別為交互的緩存數組以及本地端口號,函數具體內容如下:
1. int32_t multi_tcps_socket(uint8_t*buf,uint16_t localport)
2. {
3. int32_t ret;
4. uint16_t size=0, sentsize=0;
5.
6. #ifdef _LOOPBACK_DEBUG_
7. uint8_t destip[4];
8. uint16_t destport;
9. #endif
10.
11. switch(getSn_SR(socket_sn))
12. {
13. case SOCK_ESTABLISHED:
14. if(getSn_IR(socket_sn)&Sn_IR_CON)
15. {
16. #ifdef _LOOPBACK_DEBUG_
17. getSn_DIPR(socket_sn, destip);
18. destport= getSn_DPORT(socket_sn);
19.
20. printf("%d:Connected - %d.%d.%d.%d : %drn", socket_sn, destip[0], destip[1], destip[2], destip[3], destport);
21. #endif
22. setSn_IR(socket_sn,Sn_IR_CON);
23. }
24. if((size= getSn_RX_RSR(socket_sn))>0)// Don't need to check SOCKERR_BUSY because it doesn't not occur.
25. {
26. if(size> DATA_BUF_SIZE)
27. size= DATA_BUF_SIZE;
28. ret= recv(socket_sn, buf, size);
29.
30. if(ret<=?0)
31. return ret;?// check SOCKERR_BUSY & SOCKERR_XXX. For showing the occurrence of SOCKERR_BUSY.
32. size? =?(uint16_t)ret;
33. sentsize? =?0;
34. buf[size]?=?0x00;
35. printf("%d:rece data:%srn", socket_sn, buf);
36. while?(size?!= sentsize)
37. {
38. ret?= send(socket_sn, buf?+ sentsize, size?- sentsize);
39. if?(ret??0)
40. {
41. close(socket_sn);
42. return ret;
43. }
44. sentsize?+= ret;?// Don't care SOCKERR_BUSY, because it is zero.
45. }
46. }
47. break;
48. case SOCK_CLOSE_WAIT:
49. #ifdef _LOOPBACK_DEBUG_
50. printf("%d:CloseWaitrn", socket_sn);
51. #endif
52. if?((ret?= disconnect(socket_sn))?!= SOCK_OK)
53. return ret;
54. #ifdef _LOOPBACK_DEBUG_
55. printf("%d:Socket Closedrn", socket_sn);
56. #endif
57. break;
58. case SOCK_INIT:
59. #ifdef _LOOPBACK_DEBUG_
60. printf("%d:Listen, TCP server loopback, port [%d]rn", socket_sn, localport);
61. #endif
62. if?((ret?= listen(socket_sn))?!= SOCK_OK)
63. return ret;
64. break;
65. case SOCK_CLOSED:
66. #ifdef _LOOPBACK_DEBUG_
67. printf("%d:TCP server loopback startrn", socket_sn);
68. #endif
69. if?((ret?= socket(socket_sn,?Sn_MR_TCP, localport,?0x00))?!= socket_sn)
70. return ret;
71. #ifdef _LOOPBACK_DEBUG_
72. printf("%d:Socket openedrn", socket_sn);
73. #endif
74. break;
75. default:
76. break;
77. }
78.
79. if?(socket_sn?< _WIZCHIP_SOCK_NUM_)
80. {
81. socket_sn++;
82. }
83. else
84. {
85. socket_sn?=?0;
86. }
87. return?1;
88. }
89.
在這個程序中,會運行 TCP Server狀態機,基于不同的的 SOCKET的狀態執行對應的操作,SOCKET的狀態變化
如下圖所示:

SOCK_CLOSED:當前SOCKET未打開,配置連接服務器及連接端口號后打開SOCKET,打開成功后SOCKET會進入SOCK_INIT狀態。
SOCK_INIT:SOCKET打開成功,開始監聽端口,當有客戶端進行連接時,SOCKET狀態改為SOCK_ESTABLISHED。
SOCK_ESTABLISHED:首先清除連接成功中斷,并發送1包數據激活KeepAlive,然后讀取Sn_RX_RSR(空閑接收緩存寄存器)寄存器值,當收到服務器數據時,Sn_RX_RSR寄存器的值會大于0,此時我們將接收到的數據打印并將數據回環發送。
SOCK_CLOSE_WAIT:當客戶端主動斷開連接時,SOCKET狀態改為SOCK_CLOSE_WAIT狀態,這是一個半關閉狀態,可以進行關閉前最后的數據傳輸。使用disconnect()函數徹底斷開連接時,SOCKET狀態將改為SOCK_CLOSED狀態。
執行完狀態機后,會自動切換到下一個socket,這樣就能實現最多8個設備連接W55MH32進行回環數據測試了。
8運行結果
燒錄例程運行后,首先可以看到進行了PHY鏈路檢測,然后打印了設置的網絡地址信息,如下圖所示:

接下來則是初始化8個socket,并監聽同一個端口

我們打開8個SocketTester網絡調試工具,設置為TCP Client模式,輸入W55MH32的IP地址和端口后進行連接,然后就能看到W55MH32打印客戶端連接信息了,最后用SocketTester向W55MH32發送數據進行回環測試。

9總結
本文講解了如何在 W55MH32芯片上使用 8個 socket實現 TCP服務器模式,讓多個客戶端連接進行數據回環測試,通過實戰例程展示了從初始化 socket到監聽端口、處理客戶端連接、數據交互及連接關閉的完整過程。文章詳細介紹了 TCP協議的概念、特點、與 UDP的區別、應用場景、數據交互流程、ACK機制、重傳機制和 Keepalive機制,幫助讀者理解其在可靠數據傳輸中的實際應用價值。
下一篇文章將聚焦 W55MH32的上位機搜索和配置功能,解析其核心原理及在設備管理中的應用,同時講解實現上位機搜索和配置 W55MH32功能的具體步驟與要點,敬請期待!
WIZnet是一家無晶圓廠半導體公司,成立于 1998年。產品包括互聯網處理器 iMCU?,它采用 TOE(TCP/IP卸載引擎)技術,基于獨特的專利全硬連線 TCP/IP。iMCU?面向各種應用中的嵌入式互聯網設備。
WIZnet在全球擁有 70多家分銷商,在香港、韓國、美國設有辦事處,提供技術支持和產品營銷。
香港辦事處管理的區域包括:澳大利亞、印度、土耳其、亞洲(韓國和日本除外)。
審核編輯 黃宇
-
嵌入式
+關注
關注
5198文章
20442瀏覽量
333964 -
以太網
+關注
關注
41文章
5997瀏覽量
180796 -
Socket
+關注
關注
1文章
214瀏覽量
36907
發布評論請先 登錄
第二十五章 SDIO——SD卡讀寫測試
第二十五章 FLASH
【正點原子FPGA連載】第二十五章HDMI方塊移動實驗 -摘自【正點原子】新起點之FPGA開發指南_V2.1
第二章 W55MH32 DHCP示例
第三章 W55MH32 TCP Client示例
第九章 W55MH32 HTTP Server示例
第十五章 W55MH32 SNMP示例
第二十一章 W55MH32 PHY配置示例
第二十三章 W55MH32 MQTT_OneNET示例
第二十四章 W55MH32TCP_Client_Multi_Socket示例
第二十六章 W55MH32?上位機搜索和配置示例
第二十七章 W55MH32?Interrupt示例
第二十九章 W55MH32 Modbus_TCP_Server示例
第三十章 W55MH32 HTTP_Server&NetBIOS示例
第二十五章 W55MH32 TCP_Server_Multi_Socket示例
評論