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

TCP 3次握手示意圖

TCP 4次揮手示意圖
6 TCP的ACK機(jī)制、重傳機(jī)制和Keepalive機(jī)制
TCP的ACK機(jī)制
ACK 是 TCP用于確認(rèn)已成功接收到數(shù)據(jù)包的機(jī)制。在 TCP通信中,每個(gè)數(shù)據(jù)包都包含一個(gè)序列號(hào),接收方用 ACK來(lái)告訴發(fā)送方已經(jīng)成功收到的字節(jié)序列。
累積確認(rèn):TCP使用累積確認(rèn)方式,表示接收方已經(jīng)連續(xù)收到所有數(shù)據(jù),直到某個(gè)序列號(hào)為止。
超時(shí)重傳:如果發(fā)送方在超時(shí)時(shí)間內(nèi)未收到 ACK,就會(huì)重傳該數(shù)據(jù)包。
TCP的重傳機(jī)制
TCP 的重傳機(jī)制保證了數(shù)據(jù)的可靠傳輸。以下是常見(jiàn)的重傳機(jī)制:
超時(shí)重傳:
發(fā)送方設(shè)置一個(gè)定時(shí)器,當(dāng)發(fā)送的數(shù)據(jù)包在規(guī)定時(shí)間內(nèi)未收到 ACK,則觸發(fā)重傳。
超時(shí)時(shí)間是動(dòng)態(tài)調(diào)整的,由 TCP的往返時(shí)間(RTT, Round Trip Time)估算得出。
快速重傳:
當(dāng)接收方發(fā)現(xiàn)數(shù)據(jù)包丟失時(shí),發(fā)送重復(fù)的 ACK(稱為冗余 ACK),提醒發(fā)送方某個(gè)數(shù)據(jù)包未到達(dá)。
如果發(fā)送方連續(xù)收到 3個(gè)重復(fù)的 ACK,就會(huì)立即重傳對(duì)應(yīng)的數(shù)據(jù)包,而不必等待超時(shí)。
選擇性重傳(Selective Repeat, SACK):
在累積確認(rèn)的基礎(chǔ)上,TCP還可以通過(guò) SACK選項(xiàng)告訴發(fā)送方哪些特定的塊已收到,哪些未收到。
這可以減少不必要的重傳,提高效率。
TCP Keepalive機(jī)制
TCP Keepalive是 TCP協(xié)議的一種可選機(jī)制,用于檢測(cè)長(zhǎng)時(shí)間空閑的連接是否仍然有效。它的主要作用是:
維護(hù)連接狀態(tài):檢測(cè)對(duì)方主機(jī)是否仍在線,避免資源被長(zhǎng)期占用。
釋放死連接:如果連接已經(jīng)失效(如網(wǎng)絡(luò)中斷或?qū)Ψ街鳈C(jī)崩潰),Keepalive可以及時(shí)釋放資源。
防止中間設(shè)備超時(shí)關(guān)閉連接:一些 NAT、路由器或防火墻可能會(huì)在連接長(zhǎng)時(shí)間不活動(dòng)時(shí)自動(dòng)關(guān)閉,Keepalive可防止這種情況。
用法:在W55MH32的TOE引擎中,需要在Sn_KPALVTR寄存器中設(shè)置Keepalive時(shí)間,然后在成功連接服務(wù)器后發(fā)送一條數(shù)據(jù)來(lái)激活Keepalive。
7實(shí)現(xiàn)過(guò)程
接下來(lái),我們?cè)赪55MH32上實(shí)現(xiàn)TCP服務(wù)器,允許多個(gè)設(shè)備連接進(jìn)行數(shù)據(jù)通信。
注意:測(cè)試實(shí)例需要PC端和W55MH32處于同一網(wǎng)段。
首先,在主循環(huán)中調(diào)用multi_tcps_socket()函數(shù):
1. while(1)
2. {
3. multi_tcps_socket(ethernet_buf, local_port);
4. }
5.
multi_tcps_socket()函數(shù)的兩個(gè)傳參分別為交互的緩存數(shù)組以及本地端口號(hào),函數(shù)具體內(nèi)容如下:
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.
在這個(gè)程序中,會(huì)運(yùn)行 TCP Server狀態(tài)機(jī),基于不同的的 SOCKET的狀態(tài)執(zhí)行對(duì)應(yīng)的操作,SOCKET的狀態(tài)變化
如下圖所示:

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

接下來(lái)則是初始化8個(gè)socket,并監(jiān)聽(tīng)同一個(gè)端口

我們打開(kāi)8個(gè)SocketTester網(wǎng)絡(luò)調(diào)試工具,設(shè)置為TCP Client模式,輸入W55MH32的IP地址和端口后進(jìn)行連接,然后就能看到W55MH32打印客戶端連接信息了,最后用SocketTester向W55MH32發(fā)送數(shù)據(jù)進(jìn)行回環(huán)測(cè)試。

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

第二十五章 W55MH32 TCP_Server_Multi_Socket示例
評(píng)論