單芯片解決方案,開啟全新體驗——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,其資源豐富,專為各種復雜工控場景設計。它擁有66個GPIO、3個ADC、12通道DMA、17個定時器、2個I2C、5個串口、2個SPI接口(其中1個帶I2S接口復用)、1個CAN、1個USB2.0以及1個SDIO接口。如此豐富的外設資源,能夠輕松應對工業(yè)控制中多樣化的連接需求,無論是與各類傳感器、執(zhí)行器的通信,還是對復雜工業(yè)協(xié)議的支持,都能游刃有余,成為復雜工控領域的理想選擇。同系列還有QFN68封裝的W55MH32Q版本,該版本體積更小,僅為8x8mm,成本低,適合集成度高的網(wǎng)關模組等場景,軟件使用方法一致。更多信息和資料請進入http://www.w5500.com/網(wǎng)站或者私信獲取。
此外,本W(wǎng)55MH32支持硬件加密算法單元,WIZnet還推出TOE+SSL應用,涵蓋TCP SSL、HTTP SSL以及 MQTT SSL等,為網(wǎng)絡通信安全再添保障。
為助力開發(fā)者快速上手與深入開發(fā),基于W55MH32L這顆芯片,WIZnet精心打造了配套開發(fā)板。開發(fā)板集成WIZ-Link芯片,借助一根USB C口數(shù)據(jù)線,就能輕松實現(xiàn)調(diào)試、下載以及串口打印日志等功能。開發(fā)板將所有外設全部引出,拓展功能也大幅提升,便于開發(fā)者全面評估芯片性能。
若您想獲取芯片和開發(fā)板的更多詳細信息,包括產(chǎn)品特性、技術參數(shù)以及價格等,歡迎訪問官方網(wǎng)頁:http://www.w5500.com/,我們期待與您共同探索W55MH32的無限可能。
第三章 W55MH32 TCP Client示例
本篇文章,我們將詳細介紹如何在W55MH32芯片上面實現(xiàn)TCP通信。使用W55MH32的TOE引擎,我們只需進行簡單的socket編程及寄存器讀寫,便可輕松實現(xiàn)TCP協(xié)議應用。接下來我們通過實戰(zhàn)例程,為大家講解如何使用TOE引擎進行TCP Client模式的數(shù)據(jù)回環(huán)測試。
該例程用到的其他網(wǎng)絡協(xié)議,例如DHCP,請參考相關章節(jié)。有關W55MH32的初始化過程,請參考Network Install章節(jié),這里將不再贅述。
1 TCP協(xié)議簡介
TCP (Transmission Control Protocol)是一種面向連接的、可靠的傳輸層協(xié)議,它用于在網(wǎng)絡中可靠地傳輸數(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ā)送速度,防止接收方處理不過來導致數(shù)據(jù)丟失。常用的流量控制方法是滑動窗口(Sliding Window)。
擁塞控制:TCP可以動態(tài)調(diào)整傳輸速率,以避免網(wǎng)絡擁塞。采用算法如慢啟動、擁塞避免、快速重傳等。
全雙工通信:在 TCP連接建立后,數(shù)據(jù)可以在兩個方向同時進行傳輸,支持雙向通信。
有序數(shù)據(jù)傳輸:TCP會對數(shù)據(jù)包進行編號,確保數(shù)據(jù)按順序傳輸,即使網(wǎng)絡發(fā)生延遲,接收端也能按順序接收到數(shù)據(jù)。
字節(jié)流服務:TCP傳輸?shù)臄?shù)據(jù)是字節(jié)流,不關心應用層數(shù)據(jù)的邊界,應用層需要自己解析數(shù)據(jù)邊界。
3 TCP與 UDP的區(qū)別
TCP是可靠的、面向連接的協(xié)議,適合需要數(shù)據(jù)完整性和順序保證的應用,如網(wǎng)頁瀏覽、文件傳輸?shù)取?/p>
UDP(User Datagram Protocol)是無連接、不可靠的協(xié)議,適合對時效性要求較高且可以容忍丟包的應用,如視頻流、在線游戲等。
4 TCP應用場景
接下來,我們了解下在W55MH32上,可以使用TCP協(xié)議完成哪些操作及應用呢?
遠程監(jiān)控和數(shù)據(jù)采集:嵌入式設備通常用于采集傳感器數(shù)據(jù),并通過以太網(wǎng)連接上傳到遠程服務器,TCP協(xié)議確保數(shù)據(jù)傳輸?shù)目煽啃院屯暾浴?/p>
設備遠程控制:許多嵌入式系統(tǒng)需要通過網(wǎng)絡接收控制指令(例如工業(yè)自動化中的PLC控制),TCP協(xié)議提供了可靠的通信通道。
物聯(lián)網(wǎng)(IoT):許多物聯(lián)網(wǎng)設備使用TCP協(xié)議與云服務器或其他設備進行通信,傳輸數(shù)據(jù)、執(zhí)行命令等。
嵌入式Web服務器:一些嵌入式設備內(nèi)置Web服務器(例如路由器、網(wǎng)關、傳感器設備等),通過TCP協(xié)議提供網(wǎng)頁接口給用戶進行配置和監(jiān)控。
5使用TCP進行數(shù)據(jù)交互的流程
TCP連接建立(三次握手)
在開始傳輸數(shù)據(jù)之前,TCP會通過三次握手建立連接:
第一次握手:客戶端向服務器發(fā)送一個帶有 SYN標志的數(shù)據(jù)包,表示請求建立連接。
第二次握手:服務器收到 SYN數(shù)據(jù)包后,回復一個帶有 SYN和 ACK標志的數(shù)據(jù)包,表示同意建立連接。
第三次握手:客戶端收到服務器的 SYN+ACK后,發(fā)送一個帶有 ACK標志的數(shù)據(jù)包,連接建立完成。
數(shù)據(jù)交互
TCP連接斷開(四次揮手)
當通信結(jié)束時,TCP需要通過四次揮手來斷開連接:
第一次揮手:客戶端發(fā)送一個 FIN數(shù)據(jù)包,表示數(shù)據(jù)發(fā)送完畢,準備關閉連接。
第二次揮手:服務器收到 FIN數(shù)據(jù)包后,回復一個 ACK數(shù)據(jù)包,表示同意關閉連接。
第三次揮手:服務器發(fā)送一個 FIN數(shù)據(jù)包,表示數(shù)據(jù)發(fā)送完畢,準備關閉連接。
第四次揮手:客戶端收到服務器的 FIN數(shù)據(jù)包后,發(fā)送一個 ACK數(shù)據(jù)包,連接正式關閉。
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ā)送方設置一個定時器,當發(fā)送的數(shù)據(jù)包在規(guī)定時間內(nèi)未收到 ACK,則觸發(fā)重傳。
超時時間是動態(tài)調(diào)整的,由 TCP的往返時間(RTT, Round Trip Time)估算得出。
快速重傳:
當接收方發(fā)現(xiàn)數(shù)據(jù)包丟失時,發(fā)送重復的 ACK(稱為冗余 ACK),提醒發(fā)送方某個數(shù)據(jù)包未到達。
如果發(fā)送方連續(xù)收到 3個重復的 ACK,就會立即重傳對應的數(shù)據(jù)包,而不必等待超時。
選擇性重傳(Selective Repeat, SACK):
在累積確認的基礎上,TCP還可以通過 SACK選項告訴發(fā)送方哪些特定的塊已收到,哪些未收到。
這可以減少不必要的重傳,提高效率。
TCP Keepalive機制
TCP Keepalive是 TCP協(xié)議的一種可選機制,用于檢測長時間空閑的連接是否仍然有效。它的主要作用是:
維護連接狀態(tài):檢測對方主機是否仍在線,避免資源被長期占用。
釋放死連接:如果連接已經(jīng)失效(如網(wǎng)絡中斷或?qū)Ψ街鳈C崩潰),Keepalive可以及時釋放資源。
防止中間設備超時關閉連接:一些 NAT、路由器或防火墻可能會在連接長時間不活動時自動關閉,Keepalive可防止這種情況。
用法:在W55MH32的TOE引擎中,需要在Sn_KPALVTR寄存器中設置Keepalive時間,然后在成功連接服務器后發(fā)送一條數(shù)據(jù)來激活Keepalive。
7實現(xiàn)過程
接下來,我們一起來看看如何在W55MH32上實現(xiàn)TCP客戶端模式,連接服務器進行回環(huán)測試。
注意:測試實例需要PC端和W55MH32處于同一網(wǎng)段。
步驟一:開啟TCP Keepalive功能
在W55MH32中,KeepAlive的時間單元為5秒,這里我們設置6個單元,則W55MH32會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
步驟二:在主循環(huán)中運行TCP Client回環(huán)測試程序
while (1) { loopback_tcpc(SOCKET_ID, ethernet_buf, dest_ip, dest_port); }
loopback_tcpc()函數(shù)的四個傳參分別為,SOCKET ID,TCP協(xié)議緩存數(shù)組,目標服務器IP地址,目標服務器端口號。
注意:當我們想提高吞吐速度時,可以設置Sn_TXBUF_SIZE(socket n發(fā)送緩存大小寄存器)和Sn_RXBUF_SIZE(socket n接收緩存大小寄存器)來重新分配socket緩存大小,同時提高TCP協(xié)議緩存數(shù)組的大小。
示例的目標服務器IP地址和端口號為:192.168.1.20:8080。
loopback_tcpc()函數(shù)內(nèi)容如下:
/** * @brief tcp client loopback test * @param sn: socket number * @param buf: Data sending and receiving cache * @param destip: Destination IP address * @param destport: Destination port * @return value for SOCK_ERRORs,return 1:no error */ int32_t loopback_tcpc(uint8_t sn, uint8_t *buf, uint8_t *destip, uint16_t destport) { int32_t ret; // return value for SOCK_ERRORs uint16_t size = 0, sentsize = 0; // Destination (TCP Server) IP info (will be connected) // >> loopback_tcpc() function parameter // >> Ex) uint8_t dip[4] = {192, 168, 0, 214}; uint16_t dport = 5000; getSn_DIPR(sn, dip); dport = getSn_DPORT(sn); // Port number for TCP client (will be increased) static uint16_t any_port = 50000; // Socket Status Transitions // Check the W5500 Socket n status register (Sn_SR, The 'Sn_SR' controlled by Sn_CR command or Packet send/recv status) switch (getSn_SR(sn)) { case SOCK_ESTABLISHED: if (getSn_IR(sn) & Sn_IR_CON) // Socket n interrupt register mask; TCP CON interrupt = connection with peer is successful { #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 #ifdef _LOOPBACK_DEBUG_ printf("%d:Connected to - %d.%d.%d.%d : %drn", sn, destip[0], destip[1], destip[2], destip[3], destport); #endif setSn_IR(sn, Sn_IR_CON); // this interrupt should be write the bit cleared to '1' } ////////////////////////////////////////////////////////////////////////////////////////////// // Data Transaction Parts; Handle the [data receive and send] process ////////////////////////////////////////////////////////////////////////////////////////////// if ((size = getSn_RX_RSR(sn)) > 0) // Sn_RX_RSR: Socket n Received Size Register, Receiving data length { if (size > DATA_BUF_SIZE) size = DATA_BUF_SIZE; // DATA_BUF_SIZE means user defined buffer size (array) ret = recv(sn, buf, size); // Data Receive process (H/W Rx socket buffer -> User's buffer) buf[size] = 0x00; printf("rece from %d.%d.%d.%d:%d data:%srn", dip[0], dip[1], dip[2], dip[3], dport, buf); if (ret <= 0) return ret; // If the received data length <= 0, receive failed and process end size = (uint16_t)ret; sentsize = 0; // Data sentsize control while (size != sentsize) { ret = send(sn, buf + sentsize, size - sentsize); // Data send process (User's buffer -?> Destination through H/W Tx socket buffer) if (ret < 0) // Send Error occurred (sent data length < 0) { close(sn); // socket close 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:Try to connect to the %d.%d.%d.%d : %drn", sn, destip[0], destip[1], destip[2], destip[3], destport); #endif if ((ret = connect(sn, destip, destport)) != SOCK_OK) return ret; // Try to TCP connect to the TCP server (destination) break; case SOCK_CLOSED: close(sn); if ((ret = socket(sn, Sn_MR_TCP, any_port++, 0x00)) != sn) { if (any_port == 0xffff) any_port = 50000; return ret; // TCP socket open with 'any_port' port number } #ifdef _LOOPBACK_DEBUG_ printf("%d:TCP client loopback startrn", sn); printf("%d:Socket openedrn", sn); #endif break; default: break; } return 1; }
在這個程序中,會運行TCP Client狀態(tài)機,基于不同的的SOCKET的狀態(tài)執(zhí)行對應的操作,SOCKET的狀態(tài)變化如下圖所示:
SOCK_CLOSED:當前SOCKET未打開,配置連接服務器及連接端口號后打開SOCKET,打開成功后SOCKET會進入SOCK_INIT狀態(tài)。
注意:在W55MH32異常斷開服務器時,服務器并不知道我們已經(jīng)掉線了,所以繼續(xù)使用上一次連接的端口進行連接時會被服務器拒絕連接,所以這里在連接失敗后會將連接端口自動加1。如果是在一些特定的場景下,服務器只允許客戶端使用固定端口連接,這里就不能使用連接端口自動加1的操作。
SOCK_INIT:SOCKET執(zhí)行連接服務器操作,如果連接成功,SOCKET狀態(tài)改為SOCK_ESTABLISHED;連接失敗,SOCKET狀態(tài)改為關閉狀態(tài)。
SOCK_ESTABLISHED:首先清除連接成功中斷,并發(fā)送1包數(shù)據(jù)激活KeepAlive,然后讀取Sn_RX_RSR(空閑接收緩存寄存器)寄存器的值,當收到服務器數(shù)據(jù)時,Sn_RX_RSR寄存器的值會大于0,此時我們將接收到的數(shù)據(jù)打印并將數(shù)據(jù)回環(huán)發(fā)送。
SOCK_CLOSE_WAIT:當服務器主動斷開連接時,SOCKET狀態(tài)改為SOCK_CLOSE_WAIT狀態(tài),這是一個半關閉狀態(tài),可以進行關閉前最后的數(shù)據(jù)傳輸。使用disconnect()函數(shù)徹底斷開連接時,SOCKET狀態(tài)將改為SOCK_CLOSED狀態(tài)。
8運行結(jié)果
燒錄例程運行后,首先進行了PHY鏈路檢測,然后是通過DHCP獲取網(wǎng)絡地址并打印網(wǎng)絡地址信息,最后則是TCP數(shù)據(jù)回環(huán)測試,當服務器未開啟時,會一直打印打開socket和連接服務器提示消息。
接下來我們打開一個網(wǎng)絡調(diào)試工具,例如SocketTester,設置為TCP Server模式,選擇PC的IP地址和需要進行TCP通訊的端口號,然后點擊”Listen”建立TCP Server軟件的偵聽。接著我們就能看到W55MH32的連接信息了,最后向W55MH32發(fā)送數(shù)據(jù)進行回環(huán)測試。
9總結(jié)
本文介紹在 W55MH32芯片上實現(xiàn) TCP客戶端模式進行數(shù)據(jù)回環(huán)測試的方法。闡述 TCP協(xié)議概念、特點、與 UDP區(qū)別、應用場景及相關機制。展示實現(xiàn)過程,包括開啟 Keepalive功能,在主循環(huán)運行測試程序。燒錄例程后進行 PHY鏈路檢測、獲取網(wǎng)絡地址,再借助網(wǎng)絡調(diào)試工具測試。
下一篇將講解在該芯片上實現(xiàn) TCP服務器模式監(jiān)聽端口進行數(shù)據(jù)回環(huán)測試,解析相關原理及步驟。敬請期待!
WIZnet是一家無晶圓廠半導體公司,成立于 1998年。產(chǎn)品包括互聯(lián)網(wǎng)處理器 iMCU?,它采用 TOE(TCP/IP卸載引擎)技術,基于獨特的專利全硬連線 TCP/IP。iMCU?面向各種應用中的嵌入式互聯(lián)網(wǎng)設備。
WIZnet在全球擁有 70多家分銷商,在香港、韓國、美國設有辦事處,提供技術支持和產(chǎn)品營銷。
香港辦事處管理的區(qū)域包括:澳大利亞、印度、土耳其、亞洲(韓國和日本除外)。
審核編輯 黃宇
-
以太網(wǎng)
+關注
關注
41文章
5684瀏覽量
176251 -
物聯(lián)網(wǎng)
+關注
關注
2931文章
46306瀏覽量
393450
發(fā)布評論請先 登錄
第二章 W55MH32 DHCP示例

第五章 W55MH32 UDP示例

第九章 W55MH32 HTTP Server示例

第十五章 W55MH32 SNMP示例

第二十九章 W55MH32 Modbus_TCP_Server示例

第三十章 W55MH32 HTTP_Server&NetBIOS示例

評論