單芯片解決方案,開啟全新體驗——W55MH32高性能以太網(wǎng)單片機
W55MH32是WIZnet重磅推出的高性能以太網(wǎng)單片機,它為用戶帶來前所未有的集成化體驗。這顆芯片將強大的組件集于一身,具體來說,一顆W55MH32內(nèi)置高性能Arm? Cortex-M3核心,其主頻最高可達216MHz;配備1024KB FLASH與96KB SRAM,滿足存儲與數(shù)據(jù)處理需求;集成TOE引擎,包含WIZnet全硬件TCP/IP協(xié)議棧、內(nèi)置MAC以及PHY,擁有獨立的32KB以太網(wǎng)收發(fā)緩存,可供8個獨立硬件socket使用。如此配置,真正實現(xiàn)了All-in-One解決方案,為開發(fā)者提供極大便利。
在封裝規(guī)格上,W55MH32提供了兩種選擇:QFN100和QFN68。
W55MH32L采用QFN100封裝版本,尺寸為12x12mm,其資源豐富,專為各種復(fù)雜工控場景設(shè)計。它擁有66個GPIO、3個ADC、12通道DMA、17個定時器、2個I2C、5個串口、2個SPI接口(其中1個帶I2S接口復(fù)用)、1個CAN、1個USB2.0以及1個SDIO接口。如此豐富的外設(shè)資源,能夠輕松應(yīng)對工業(yè)控制中多樣化的連接需求,無論是與各類傳感器、執(zhí)行器的通信,還是對復(fù)雜工業(yè)協(xié)議的支持,都能游刃有余,成為復(fù)雜工控領(lǐng)域的理想選擇。同系列還有QFN68封裝的W55MH32Q版本,該版本體積更小,僅為8x8mm,成本低,適合集成度高的網(wǎng)關(guā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ò)通信安全再添保障。
為助力開發(fā)者快速上手與深入開發(fā),基于W55MH32L這顆芯片,WIZnet精心打造了配套開發(fā)板。開發(fā)板集成WIZ-Link芯片,借助一根USB C口數(shù)據(jù)線,就能輕松實現(xiàn)調(diào)試、下載以及串口打印日志等功能。開發(fā)板將所有外設(shè)全部引出,拓展功能也大幅提升,便于開發(fā)者全面評估芯片性能。
若您想獲取芯片和開發(fā)板的更多詳細信息,包括產(chǎn)品特性、技術(shù)參數(shù)以及價格等,歡迎訪問官方網(wǎng)頁:http://www.w5500.com/,我們期待與您共同探索W55MH32的無限可能。
第四章 W55MH32 TCP Server示例
本篇文章,我們將詳細介紹如何在W55MH32芯片上面實現(xiàn)TCP通信。并通過實戰(zhàn)例程,為大家講解如何使用W55MH32作為TCP Server進行數(shù)據(jù)回環(huán)測試,有關(guān)TCP協(xié)議的簡介以及特點,請參考TCP Client章節(jié)。
該例程用到的其他網(wǎng)絡(luò)協(xié)議,例如DHCP,請參考相關(guān)章節(jié)。有關(guān)W55MH32的初始化過程,也請參考相關(guān)章節(jié),這里將不再贅述。
1 TCP協(xié)議簡介
TCP (Transmission Control Protocol)是一種面向連接的、可靠的傳輸層協(xié)議,它用于在網(wǎng)絡(luò)中可靠地傳輸數(shù)據(jù)。TCP是互聯(lián)網(wǎng)協(xié)議族中的核心協(xié)議之一,通常與 IP協(xié)議(Internet Protocol)一起使用,形成套接字通信。
2 TCP協(xié)議特點
面向連接:在傳輸數(shù)據(jù)之前,TCP需要建立一個連接,保證發(fā)送方與接收方能夠彼此通信。通過三次握手(Three-Way Handshake)過程來建立連接,確保雙方的通信是可靠的。
可靠性:TCP提供可靠的數(shù)據(jù)傳輸,確保數(shù)據(jù)完整并且按順序到達接收端。如果數(shù)據(jù)丟失或出錯,TCP會自動重傳丟失的數(shù)據(jù)包。
流量控制:TCP使用流量控制機制來調(diào)節(jié)數(shù)據(jù)的發(fā)送速度,防止接收方處理不過來導(dǎo)致數(shù)據(jù)丟失。常用的流量控制方法是滑動窗口(Sliding Window)。
擁塞控制:TCP可以動態(tài)調(diào)整傳輸速率,以避免網(wǎng)絡(luò)擁塞。采用算法如慢啟動、擁塞避免、快速重傳等。
全雙工通信:在 TCP連接建立后,數(shù)據(jù)可以在兩個方向同時進行傳輸,支持雙向通信。
有序數(shù)據(jù)傳輸:TCP會對數(shù)據(jù)包進行編號,確保數(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)頁瀏覽、文件傳輸?shù)取?/p>
UDP(User Datagram Protocol)是無連接、不可靠的協(xié)議,適合對時效性要求較高且可以容忍丟包的應(yīng)用,如視頻流、在線游戲等。
4 TCP應(yīng)用場景
接下來,我們了解下在W55MH32上,可以使用TCP協(xié)議完成哪些操作及應(yīng)用呢?
遠程監(jiān)控和數(shù)據(jù)采集:嵌入式設(shè)備通常用于采集傳感器數(shù)據(jù),并通過以太網(wǎng)連接上傳到遠程服務(wù)器,TCP協(xié)議確保數(shù)據(jù)傳輸?shù)目煽啃院屯暾浴?/p>
設(shè)備遠程控制:許多嵌入式系統(tǒng)需要通過網(wǎng)絡(luò)接收控制指令(例如工業(yè)自動化中的PLC控制),TCP協(xié)議提供了可靠的通信通道。
物聯(lián)網(wǎng)(IoT):許多物聯(lián)網(wǎng)設(shè)備使用TCP協(xié)議與云服務(wù)器或其他設(shè)備進行通信,傳輸數(shù)據(jù)、執(zhí)行命令等。
嵌入式Web服務(wù)器:一些嵌入式設(shè)備內(nèi)置Web服務(wù)器(例如路由器、網(wǎng)關(guān)、傳感器設(shè)備等),通過TCP協(xié)議提供網(wǎng)頁接口給用戶進行配置和監(jiān)控。
5使用TCP進行數(shù)據(jù)交互的流程
TCP連接建立(三次握手)
在開始傳輸數(shù)據(jù)之前,TCP會通過三次握手建立連接:
第一次握手:客戶端向服務(wù)器發(fā)送一個帶有 SYN標(biāo)志的數(shù)據(jù)包,表示請求建立連接。
第二次握手:服務(wù)器收到 SYN數(shù)據(jù)包后,回復(fù)一個帶有 SYN和 ACK標(biāo)志的數(shù)據(jù)包,表示同意建立連接。
第三次握手:客戶端收到服務(wù)器的 SYN+ACK后,發(fā)送一個帶有 ACK標(biāo)志的數(shù)據(jù)包,連接建立完成。
數(shù)據(jù)交互
TCP連接斷開(四次揮手)
當(dāng)通信結(jié)束時,TCP需要通過四次揮手來斷開連接:
第一次揮手:客戶端發(fā)送一個 FIN數(shù)據(jù)包,表示數(shù)據(jù)發(fā)送完畢,準(zhǔn)備關(guān)閉連接。
第二次揮手:服務(wù)器收到 FIN數(shù)據(jù)包后,回復(fù)一個 ACK數(shù)據(jù)包,表示同意關(guān)閉連接。
第三次揮手:服務(wù)器發(fā)送一個 FIN數(shù)據(jù)包,表示數(shù)據(jù)發(fā)送完畢,準(zhǔn)備關(guān)閉連接。
第四次揮手:客戶端收到服務(wù)器的 FIN數(shù)據(jù)包后,發(fā)送一個 ACK數(shù)據(jù)包,連接正式關(guān)閉。
ACK字段:ACK包含在 TCP報文頭中,表示接收方期望接收的下一個字節(jié)的序列號。
TCP 3次握手示意圖
TCP 4次揮手示意圖
6 TCP的ACK機制、重傳機制和Keepalive機制
TCP的ACK機制
ACK是 TCP用于確認已成功接收到數(shù)據(jù)包的機制。在 TCP通信中,每個數(shù)據(jù)包都包含一個序列號,接收方用 ACK來告訴發(fā)送方已經(jīng)成功收到的字節(jié)序列。
累積確認:TCP使用累積確認方式,表示接收方已經(jīng)連續(xù)收到所有數(shù)據(jù),直到某個序列號為止。
超時重傳:如果發(fā)送方在超時時間內(nèi)未收到 ACK,就會重傳該數(shù)據(jù)包。
TCP的重傳機制
TCP的重傳機制保證了數(shù)據(jù)的可靠傳輸。以下是常見的重傳機制:
超時重傳:
發(fā)送方設(shè)置一個定時器,當(dāng)發(fā)送的數(shù)據(jù)包在規(guī)定時間內(nèi)未收到 ACK,則觸發(fā)重傳。
超時時間是動態(tài)調(diào)整的,由 TCP的往返時間(RTT, Round Trip Time)估算得出。
快速重傳:
當(dāng)接收方發(fā)現(xiàn)數(shù)據(jù)包丟失時,發(fā)送重復(fù)的 ACK(稱為冗余 ACK),提醒發(fā)送方某個數(shù)據(jù)包未到達。
如果發(fā)送方連續(xù)收到 3個重復(fù)的 ACK,就會立即重傳對應(yīng)的數(shù)據(jù)包,而不必等待超時。
選擇性重傳(Selective Repeat, SACK):
在累積確認的基礎(chǔ)上,TCP還可以通過 SACK選項告訴發(fā)送方哪些特定的塊已收到,哪些未收到。
這可以減少不必要的重傳,提高效率。
TCP Keepalive 機制
TCP Keepalive是 TCP協(xié)議的一種可選機制,用于檢測長時間空閑的連接是否仍然有效。它的主要作用是:
維護連接狀態(tài):檢測對方主機是否仍在線,避免資源被長期占用。
釋放死連接:如果連接已經(jīng)失效(如網(wǎng)絡(luò)中斷或?qū)Ψ街鳈C崩潰),Keepalive可以及時釋放資源。
防止中間設(shè)備超時關(guān)閉連接:一些 NAT、路由器或防火墻可能會在連接長時間不活動時自動關(guān)閉,Keepalive可防止這種情況。
用法:在W55MH32的TOE引擎中,需要在Sn_KPALVTR寄存器中設(shè)置Keepalive時間,然后在成功連接服務(wù)器后發(fā)送一條數(shù)據(jù)來激活Keepalive。
7實現(xiàn)過程
接下來,我們一起來看看如何在W55MH32上實現(xiàn)TCP服務(wù)器模式,監(jiān)聽端口并進行回環(huán)測試。
注意:測試實例需要PC端和W55MH32處于同一網(wǎng)段。
步驟1:開啟TCP KeepAlive功能(避免出現(xiàn)假連接情況)
在W55MH32中,KeepAlive的時間單元為5秒,因為設(shè)我們設(shè)置6個單元,即30秒發(fā)送1次KeepAlive報文。
/* Enable keepalive,Parameter 2 is the keep alive time, with a unit of 5 seconds */ setSn_KPALVTR(SOCKET_ID, 6); // 30s keepalive
步驟2:在主循環(huán)中運行TCP Server回環(huán)測試程序
while (1) { loopback_tcps(SOCKET_ID, ethernet_buf, local_port); }
loopback_tcps()函數(shù)的三個傳參分別為,SOCKET ID,交互的緩存數(shù)組,本地端口號。
示例的本地端口號為:8080。
loopback_tcps()函數(shù)內(nèi)容如下:
/** * @brief tcp server loopback test * @param sn: socket number * @param buf: Data sending and receiving cache * @param port: Listen port * @return value for SOCK_ERRORs,return 1:no error */ int32_t loopback_tcps(uint8_t sn, uint8_t *buf, uint16_t port) { int32_t ret; uint16_t size = 0, sentsize = 0; #ifdef _LOOPBACK_DEBUG_ uint8_t destip[4]; uint16_t destport; #endif switch (getSn_SR(sn)) { case SOCK_ESTABLISHED: if (getSn_IR(sn) & Sn_IR_CON) { #ifdef _LOOPBACK_DEBUG_ getSn_DIPR(sn, destip); destport = getSn_DPORT(sn); printf("%d:Connected - %d.%d.%d.%d : %drn", sn, destip[0], destip[1], destip[2], destip[3], destport); #endif #if KEEPALIVE_ENABLE == 1 // We need to send a packet of data to activate keepalive ret = send(sn, (uint8_t *)"", 1); // Data send process if (ret < 0) // Send Error occurred (sent data length < 0) { close(sn); // socket close return ret; } #endif setSn_IR(sn, Sn_IR_CON); } if ((size = getSn_RX_RSR(sn)) > 0) // Don't need to check SOCKERR_BUSY because it doesn't not occur. { if (size > DATA_BUF_SIZE) size = DATA_BUF_SIZE; ret = recv(sn, buf, size); if (ret <= 0) return ret; // check SOCKERR_BUSY & SOCKERR_XXX. For showing the occurrence of SOCKERR_BUSY. size = (uint16_t)ret; sentsize = 0; buf[size] = 0x00; printf("rece data:%srn", buf); while (size != sentsize) { ret = send(sn, buf + sentsize, size - sentsize); if (ret < 0) { close(sn); return ret; } sentsize += ret; // Don't care SOCKERR_BUSY, because it is zero. } } break; case SOCK_CLOSE_WAIT: #ifdef _LOOPBACK_DEBUG_ printf("%d:CloseWaitrn", sn); #endif if ((ret = disconnect(sn)) != SOCK_OK) return ret; #ifdef _LOOPBACK_DEBUG_ printf("%d:Socket Closedrn", sn); #endif break; case SOCK_INIT: #ifdef _LOOPBACK_DEBUG_ printf("%d:Listen, TCP server loopback, port [%d]rn", sn, port); #endif if ((ret = listen(sn)) != SOCK_OK) return ret; break; case SOCK_CLOSED: #ifdef _LOOPBACK_DEBUG_ printf("%d:TCP server loopback startrn", sn); #endif if ((ret = socket(sn, Sn_MR_TCP, port, 0x00)) != sn) return ret; #ifdef _LOOPBACK_DEBUG_ printf("%d:Socket openedrn", sn); #endif break; default: break; } return 1; }
在這個程序中,會運行TCP Server狀態(tài)機,基于SOCKET不同的狀態(tài)執(zhí)行對應(yīng)的操作,SOCKET的狀態(tài)變化如下圖所示:
SOCK_CLOSED:當(dāng)前SOCKET未打開,配置連接服務(wù)器及連接端口號后打開SOCKET,打開成功后SOCKET會進入SOCK_INIT狀態(tài)。
SOCK_INIT:SOCKET打開成功,開始監(jiān)聽端口,當(dāng)有客戶端進行連接時,SOCKET狀態(tài)改為SOCK_ESTABLISHED。
SOCK_ESTABLISHED:首先清除連接成功中斷,并發(fā)送1包數(shù)據(jù)激活KeepAlive,然后讀取Sn_RX_RSR(空閑接收緩存寄存器)寄存器值,當(dāng)收到服務(wù)器數(shù)據(jù)時,Sn_RX_RSR寄存器的值會大于0,此時我們將接收到的數(shù)據(jù)打印并將數(shù)據(jù)回環(huán)發(fā)送。
SOCK_CLOSE_WAIT:當(dāng)客戶端主動斷開連接時,SOCKET狀態(tài)改為SOCK_CLOSE_WAIT狀態(tài),這是一個半關(guān)閉狀態(tài),可以進行關(guān)閉前最后的數(shù)據(jù)傳輸。使用disconnect()函數(shù)徹底斷開連接時,SOCKET狀態(tài)將改為SOCK_CLOSED狀態(tài)。
8運行結(jié)果
燒錄例程運行后,首先進行了PHY鏈路檢測,然后是通過DHCP獲取網(wǎng)絡(luò)地址并打印網(wǎng)絡(luò)地址信息,最后則是進行TCP數(shù)據(jù)回環(huán)測試,當(dāng)客戶端未連接時,會一直監(jiān)聽,等待客戶端連接。
接下來我們打開SocketTester網(wǎng)絡(luò)調(diào)試工具,設(shè)置為TCP Client模式,輸入W55MH32的IP地址和端口后進行連接,然后就能看到W55MH32打印客戶端連接信息了,最后用SocketTester向W55MH32發(fā)送數(shù)據(jù)進行回環(huán)測試。
9總結(jié)
本文介紹在 W55MH32芯片上實現(xiàn) TCP服務(wù)器模式進行數(shù)據(jù)回環(huán)測試的方法。先回顧 TCP協(xié)議相關(guān)知識,接著展示實現(xiàn)過程,包括開啟 Keepalive功能,在主循環(huán)運行測試程序。程序依據(jù) SOCKET不同狀態(tài)執(zhí)行操作,狀態(tài)從關(guān)閉、初始化、監(jiān)聽,到連接建立、關(guān)閉等待。燒錄例程后經(jīng) PHY鏈路檢測、獲取網(wǎng)絡(luò)地址,借助網(wǎng)絡(luò)調(diào)試工具完成測試。
下一篇將講解在該芯片上實現(xiàn) UDP通信及數(shù)據(jù)回環(huán)測試,介紹 UDP相關(guān)原理和實現(xiàn)步驟。敬請期待!
WIZnet是一家無晶圓廠半導(dǎo)體公司,成立于 1998年。產(chǎn)品包括互聯(lián)網(wǎng)處理器 iMCU?,它采用 TOE(TCP/IP卸載引擎)技術(shù),基于獨特的專利全硬連線 TCP/IP。iMCU?面向各種應(yīng)用中的嵌入式互聯(lián)網(wǎng)設(shè)備。
WIZnet在全球擁有 70多家分銷商,在香港、韓國、美國設(shè)有辦事處,提供技術(shù)支持和產(chǎn)品營銷。
香港辦事處管理的區(qū)域包括:澳大利亞、印度、土耳其、亞洲(韓國和日本除外)。
審核編輯 黃宇
-
以太網(wǎng)
+關(guān)注
關(guān)注
41文章
5864瀏覽量
178553 -
物聯(lián)網(wǎng)
+關(guān)注
關(guān)注
2938文章
46912瀏覽量
402299 -
TCP
+關(guān)注
關(guān)注
8文章
1412瀏覽量
82559
發(fā)布評論請先 登錄
第三十章 W55MH32 HTTP_Server&NetBIOS示例

第二十九章 W55MH32 Modbus_TCP_Server示例

第二十六章 W55MH32?上位機搜索和配置示例

第二十五章 W55MH32 TCP_Server_Multi_Socket示例

第二十四章 W55MH32TCP_Client_Multi_Socket示例

第十八章 W55MH32 FTP_Server示例

第十六章 W55MH32 PING示例

第十五章 W55MH32 SNMP示例

第十四章 W55MH32 TFTP示例

第十章 W55MH32 SNTP示例

第九章 W55MH32 HTTP Server示例

第六章 W55MH32 UDP?Multicast示例

第五章 W55MH32 UDP示例

第三章 W55MH32 TCP Client示例

第二章 W55MH32 DHCP示例

評論