單芯片解決方案,開(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示例
本篇文章,我們將詳細(xì)介紹如何在W55MH32芯片上面實(shí)現(xiàn)TCP通信。并通過(guò)實(shí)戰(zhàn)例程,為大家講解如何使用W55MH32作為TCP Server進(jìn)行數(shù)據(jù)回環(huán)測(cè)試,有關(guān)TCP協(xié)議的簡(jiǎn)介以及特點(diǎn),請(qǐng)參考TCP Client章節(jié)。
該例程用到的其他網(wǎng)絡(luò)協(xié)議,例如DHCP,請(qǐng)參考相關(guān)章節(jié)。有關(guān)W55MH32的初始化過(guò)程,也請(qǐng)參考相關(guān)章節(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),我們一起來(lái)看看如何在W55MH32上實(shí)現(xiàn)TCP服務(wù)器模式,監(jiān)聽(tīng)端口并進(jìn)行回環(huán)測(cè)試。
注意:測(cè)試實(shí)例需要PC端和W55MH32處于同一網(wǎng)段。
步驟1:開(kāi)啟TCP KeepAlive功能(避免出現(xiàn)假連接情況)
在W55MH32中,KeepAlive的時(shí)間單元為5秒,因?yàn)樵O(shè)我們?cè)O(shè)置6個(gè)單元,即30秒發(fā)送1次KeepAlive報(bào)文。
/* 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)中運(yùn)行TCP Server回環(huán)測(cè)試程序
while (1) { loopback_tcps(SOCKET_ID, ethernet_buf, local_port); }
loopback_tcps()函數(shù)的三個(gè)傳參分別為,SOCKET ID,交互的緩存數(shù)組,本地端口號(hào)。
示例的本地端口號(hào)為: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; }
在這個(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)。
8運(yùn)行結(jié)果
燒錄例程運(yùn)行后,首先進(jìn)行了PHY鏈路檢測(cè),然后是通過(guò)DHCP獲取網(wǎng)絡(luò)地址并打印網(wǎng)絡(luò)地址信息,最后則是進(jìn)行TCP數(shù)據(jù)回環(huán)測(cè)試,當(dāng)客戶端未連接時(shí),會(huì)一直監(jiān)聽(tīng),等待客戶端連接。

接下來(lái)我們打開(kāi)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芯片上實(shí)現(xiàn) TCP服務(wù)器模式進(jìn)行數(shù)據(jù)回環(huán)測(cè)試的方法。先回顧 TCP協(xié)議相關(guān)知識(shí),接著展示實(shí)現(xiàn)過(guò)程,包括開(kāi)啟 Keepalive功能,在主循環(huán)運(yùn)行測(cè)試程序。程序依據(jù) SOCKET不同狀態(tài)執(zhí)行操作,狀態(tài)從關(guān)閉、初始化、監(jiān)聽(tīng),到連接建立、關(guān)閉等待。燒錄例程后經(jīng) PHY鏈路檢測(cè)、獲取網(wǎng)絡(luò)地址,借助網(wǎng)絡(luò)調(diào)試工具完成測(cè)試。
下一篇將講解在該芯片上實(shí)現(xiàn) UDP通信及數(shù)據(jù)回環(huán)測(cè)試,介紹 UDP相關(guān)原理和實(shí)現(xià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ó)和日本除外)。
審核編輯 黃宇
-
以太網(wǎng)
+關(guān)注
關(guān)注
41文章
5929瀏覽量
179596 -
物聯(lián)網(wǎng)
+關(guān)注
關(guān)注
2939文章
47353瀏覽量
408374 -
TCP
+關(guān)注
關(guān)注
8文章
1418瀏覽量
83046
發(fā)布評(píng)論請(qǐng)先 登錄
第三十章 W55MH32 HTTP_Server&NetBIOS示例
第二十九章 W55MH32 Modbus_TCP_Server示例
第二十六章 W55MH32?上位機(jī)搜索和配置示例
第二十五章 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示例

第四章 W55MH32 TCP Server示例
評(píng)論