單芯片解決方案,開啟全新體驗——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示例
本篇文章,我們將詳細介紹如何在W55MH32芯片上面實現TCP通信。并通過實戰例程,為大家講解如何使用W55MH32作為TCP Server進行數據回環測試,有關TCP協議的簡介以及特點,請參考TCP Client章節。
該例程用到的其他網絡協議,例如DHCP,請參考相關章節。有關W55MH32的初始化過程,也請參考相關章節,這里將不再贅述。
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處于同一網段。
步驟1:開啟TCP KeepAlive功能(避免出現假連接情況)
在W55MH32中,KeepAlive的時間單元為5秒,因為設我們設置6個單元,即30秒發送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:在主循環中運行TCP Server回環測試程序
while (1) { loopback_tcps(SOCKET_ID, ethernet_buf, local_port); }
loopback_tcps()函數的三個傳參分別為,SOCKET ID,交互的緩存數組,本地端口號。
示例的本地端口號為:8080。
loopback_tcps()函數內容如下:
/** * @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狀態機,基于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狀態。
8運行結果
燒錄例程運行后,首先進行了PHY鏈路檢測,然后是通過DHCP獲取網絡地址并打印網絡地址信息,最后則是進行TCP數據回環測試,當客戶端未連接時,會一直監聽,等待客戶端連接。
接下來我們打開SocketTester網絡調試工具,設置為TCP Client模式,輸入W55MH32的IP地址和端口后進行連接,然后就能看到W55MH32打印客戶端連接信息了,最后用SocketTester向W55MH32發送數據進行回環測試。
9總結
本文介紹在 W55MH32芯片上實現 TCP服務器模式進行數據回環測試的方法。先回顧 TCP協議相關知識,接著展示實現過程,包括開啟 Keepalive功能,在主循環運行測試程序。程序依據 SOCKET不同狀態執行操作,狀態從關閉、初始化、監聽,到連接建立、關閉等待。燒錄例程后經 PHY鏈路檢測、獲取網絡地址,借助網絡調試工具完成測試。
下一篇將講解在該芯片上實現 UDP通信及數據回環測試,介紹 UDP相關原理和實現步驟。敬請期待!
WIZnet是一家無晶圓廠半導體公司,成立于 1998年。產品包括互聯網處理器 iMCU?,它采用 TOE(TCP/IP卸載引擎)技術,基于獨特的專利全硬連線 TCP/IP。iMCU?面向各種應用中的嵌入式互聯網設備。
WIZnet在全球擁有 70多家分銷商,在香港、韓國、美國設有辦事處,提供技術支持和產品營銷。
香港辦事處管理的區域包括:澳大利亞、印度、土耳其、亞洲(韓國和日本除外)。
審核編輯 黃宇
-
以太網
+關注
關注
41文章
5684瀏覽量
176280 -
物聯網
+關注
關注
2931文章
46306瀏覽量
393620 -
TCP
+關注
關注
8文章
1404瀏覽量
81194
發布評論請先 登錄
第三十章 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示例

評論