單芯片解決方案,開啟全新體驗(yàn)——W55MH32 高性能以太網(wǎng)單片機(jī)
W55MH32是WIZnet重磅推出的高性能以太網(wǎng)單片機(jī),它為用戶帶來前所未有的集成化體驗(yàn)。這顆芯片將強(qiáng)大的組件集于一身,具體來說,一顆W55MH32內(nèi)置高性能Arm? Cortex-M3核心,其主頻最高可達(dá)216MHz;配備1024KB FLASH與96KB SRAM,滿足存儲與數(shù)據(jù)處理需求;集成TOE引擎,包含WIZnet全硬件TCP/IP協(xié)議棧、內(nèi)置MAC以及PHY,擁有獨(dú)立的32KB以太網(wǎng)收發(fā)緩存,可供8個獨(dú)立硬件socket使用。如此配置,真正實(shí)現(xiàn)了All-in-One解決方案,為開發(fā)者提供極大便利。
在封裝規(guī)格上,W55MH32提供了兩種選擇:QFN100和QFN68。
W55MH32L采用QFN100封裝版本,尺寸為12x12mm,其資源豐富,專為各種復(fù)雜工控場景設(shè)計(jì)。它擁有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)模組等場景,軟件使用方法一致。更多信息和資料請進(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ò)通信安全再添保障。
為助力開發(fā)者快速上手與深入開發(fā),基于W55MH32L這顆芯片,WIZnet精心打造了配套開發(fā)板。開發(fā)板集成WIZ-Link芯片,借助一根USB C口數(shù)據(jù)線,就能輕松實(shí)現(xiàn)調(diào)試、下載以及串口打印日志等功能。開發(fā)板將所有外設(shè)全部引出,拓展功能也大幅提升,便于開發(fā)者全面評估芯片性能。
若您想獲取芯片和開發(fā)板的更多詳細(xì)信息,包括產(chǎn)品特性、技術(shù)參數(shù)以及價(jià)格等,歡迎訪問官方網(wǎng)頁:http://www.w5500.com/,我們期待與您共同探索W55MH32的無限可能。

第十四章 W55MH32 TFTP示例
本篇文章,我們將詳細(xì)介紹如何在W55MH32芯片上面實(shí)現(xiàn)TFTP協(xié)議。并通過實(shí)戰(zhàn)例程,為大家講解如何使用TFTP客戶端模式向服務(wù)器獲取文本文件。
該例程用到的其他網(wǎng)絡(luò)協(xié)議,例如DHCP請參考相關(guān)章節(jié)。有關(guān)W55MH32的初始化過程,也請參考Network Install章節(jié),這里將不再贅述。
1 TFTP協(xié)議簡介
TFTP(TrivialFileTransferProtocol)協(xié)議是一種輕量級的文件傳輸協(xié)議,它通常用于需要快速、簡單的文件交換場景,尤其是在網(wǎng)絡(luò)設(shè)備啟動和配置過程中。與FTP(文件傳輸協(xié)議)不同,TFTP設(shè)計(jì)得非常簡單,僅提供基本的文件讀寫功能,并且使用UDP作為傳輸層協(xié)議,因而不具備TCP的復(fù)雜性和重傳機(jī)制。
2 TFTP協(xié)議特點(diǎn)
簡單性:TFTP協(xié)議設(shè)計(jì)簡單,它的報(bào)頭格式簡潔,操作命令種類少,這使得實(shí)現(xiàn)起來相對容易,對資源的需求也較低。
輕量級:TFTP協(xié)議不需要復(fù)雜的連接建立和管理過程,開銷小,因此適合在一些對性能要求不高、資源有限的環(huán)境中使用。
基于UDP:TFTP使用UDP作為傳輸層協(xié)議,利用了UDP的快速傳輸和無連接特性,從而能夠快速地傳輸數(shù)據(jù)。不過,這也意味著TFTP本身不提供可靠的傳輸保證,需要在應(yīng)用層實(shí)現(xiàn)可靠性機(jī)制。
端口固定:TFTP使用固定的端口69來監(jiān)聽客戶端的請求。數(shù)據(jù)傳輸使用的端口是動態(tài)分配的,每次傳輸會在此基礎(chǔ)上選擇一個臨時端口。
數(shù)據(jù)塊大小限制:每個數(shù)據(jù)報(bào)文最多只能傳輸512字節(jié)的數(shù)據(jù),如果文件較大,會分多次傳輸,每次發(fā)送一個512字節(jié)的數(shù)據(jù)塊。最后一個數(shù)據(jù)塊可能小于512字節(jié),表示文件的結(jié)束。
3 TFTP協(xié)議應(yīng)用場景
接下來,我們了解下在W55MH32上,可以使用TFTP協(xié)議完成哪些操作及應(yīng)用呢?
固件升級:對于路由器、交換機(jī)等網(wǎng)絡(luò)設(shè)備,TFTP協(xié)議常用于將固件傳輸?shù)竭@些設(shè)備以進(jìn)行固件更新。TFTP協(xié)議能夠確保固件文件快速、準(zhǔn)確地傳輸?shù)侥繕?biāo)設(shè)備。
配置文件傳輸:TFTP協(xié)議也常用于管理網(wǎng)絡(luò)設(shè)備的配置文件。將配置文件傳輸?shù)骄W(wǎng)絡(luò)設(shè)備以進(jìn)行配置更新,或者從網(wǎng)絡(luò)設(shè)備下載配置文件進(jìn)行備份或分析。
IOT設(shè)備固件升級:TFTP協(xié)議因其簡單性和高效性,成為IOT設(shè)備固件升級的一種常用協(xié)議。
4 TFTP協(xié)議基本工作流程
請求發(fā)送:客戶端向服務(wù)器發(fā)送讀請求(RRQ,Read Request)或?qū)懻埱螅╓RQ,Write Request)。這些請求包含了要讀取或?qū)懭氲奈募约皞鬏斈J剑ㄈ缍M(jìn)制或ASCII碼)。
建立連接:服務(wù)器接收到客戶端的請求后,根據(jù)請求中的文件名和傳輸模式,打開相應(yīng)的文件(對于寫請求)或準(zhǔn)備發(fā)送文件數(shù)據(jù)(對于讀請求),并向客戶端發(fā)送確認(rèn)信息,從而建立連接。
數(shù)據(jù)傳輸:在寫請求的情況下,客戶端開始發(fā)送文件數(shù)據(jù)到服務(wù)器,服務(wù)器接收并寫入文件。數(shù)據(jù)以數(shù)據(jù)塊的形式發(fā)送,每個數(shù)據(jù)塊的大小通常為512字節(jié)(但可以根據(jù)網(wǎng)絡(luò)狀況調(diào)整)。
在讀請求的情況下,服務(wù)器開始發(fā)送文件數(shù)據(jù)到客戶端,客戶端接收并保存文件。同樣,數(shù)據(jù)也是以數(shù)據(jù)塊的形式發(fā)送的。
回應(yīng)與確認(rèn):每當(dāng)客戶端或服務(wù)器發(fā)送一個數(shù)據(jù)塊后,接收方會發(fā)送一個回應(yīng)包(ACK,Acknowledgment)來確認(rèn)接收到了該數(shù)據(jù)塊。這個回應(yīng)包包含了接收到的數(shù)據(jù)塊的編號,以確保數(shù)據(jù)的順序和完整性。
繼續(xù)傳輸或結(jié)束:根據(jù)回應(yīng)包,發(fā)送方會繼續(xù)發(fā)送下一個數(shù)據(jù)塊,直到整個文件傳輸完成。如果傳輸過程中出現(xiàn)錯誤,服務(wù)器會向客戶端發(fā)送錯誤信息包(ERROR),中斷傳輸過程。
關(guān)閉連接:文件傳輸完成后,客戶端和服務(wù)器會關(guān)閉連接。
5 TFTP協(xié)議報(bào)文解析
常見的操作碼:
1:讀請求(RRQ),用于請求讀取服務(wù)器上的文件。
2:寫請求(WRQ),用于請求向服務(wù)器上寫入文件。
3:數(shù)據(jù)(DATA),用于傳輸文件數(shù)據(jù)。
4:回應(yīng)(ACK),用于確認(rèn)接收到的數(shù)據(jù)塊。
5:錯誤信息(ERROR),用于報(bào)告?zhèn)鬏斶^程中發(fā)生的錯誤。
常見操作碼的報(bào)文格式如下:
| 報(bào)文類型 | 報(bào)文格式 | 操作碼 | 其他關(guān)鍵字段及說明 |
| 讀請求(RRQ) | 總長可變,由2字節(jié)操作碼、可變長文件名(以1字節(jié)0結(jié)尾)、可變長傳輸模式(以1字節(jié) 0結(jié)尾)組成 | 1 |
文件名:明確要讀取的文件名稱 傳輸模式:“netascii”表示ASCI碼模式,“octet”表示二進(jìn)制模式 |
| 寫請求(WRQ) | 總長可變,由2字節(jié)操作碼、可變長文件名(以1字節(jié)0結(jié)尾)、可變長傳輸模式(以1字節(jié) 0結(jié)尾)組成 | 2 |
文件名:明確要讀取的文件名稱 傳輸模式:“netascii”表示ASCII碼模式,“octet”表示二進(jìn)制模式 |
| 數(shù)據(jù)(DATA) | 由2字節(jié)操作碼、2字節(jié)數(shù)據(jù)塊編號、最多512字節(jié)數(shù)據(jù)組成 | 3 |
數(shù)據(jù)塊編號:從1開始,用于標(biāo)識數(shù)據(jù)塊順序 數(shù)據(jù):實(shí)際傳輸?shù)奈募?nèi)容 |
| 確認(rèn)(ACK) | 由2字節(jié)操作碼和2字節(jié)確認(rèn)的數(shù)據(jù)塊編號組成 | 4 | 數(shù)據(jù)塊編號:與接收到的數(shù)據(jù)塊編號一致,用于確認(rèn)接收 |
| 錯誤(ERROR) | 由2字節(jié)操作碼、2字節(jié)錯誤碼、可變長錯誤信息(以 1字節(jié)0結(jié)尾)組成 | 5 |
錯誤碼:明確錯誤類型 錯誤信息:具體描述錯誤情況 |
報(bào)文示例:
客戶端讀請求報(bào)文:
|報(bào)文解析|
Trivial File Transfer Protocol
Opcode: Read Request (1) (操作碼為01,讀請求報(bào)文)
Source File: tftp_test_file.txt (明確要讀取的文件名為tftp_test_file.txt)
Type: octet (傳輸模式為octet)
Option: timeout = 5
|報(bào)文原文|
00 01 74 66 74 70 5f 74 65 73 74 5f 66 69 6c 65 2e 74 78 74 00 6f 63 74 65 74 00 74 69 6d 65 6f 75 74 00 35 00
服務(wù)器響應(yīng)報(bào)文:
|報(bào)文解析|
Trivial File Transfer Protocol
Opcode: Option Acknowledgement (6) (操作碼為06,擴(kuò)展操作碼)
[Destination File: tftp_test_file.txt]
[Read Request in frame 125]
Option: timeout = 5
|報(bào)文原文|
00 06 74 69 6d 65 6f 75 74 00 35 00
客戶端響應(yīng)報(bào)文:
|報(bào)文解析|
Trivial File Transfer Protocol
Opcode: Acknowledgement (4) (操作碼為04,回應(yīng)報(bào)文)
[Destination File: tftp_test_file.txt]
[Read Request in frame 125]
Block: 0 (數(shù)據(jù)塊標(biāo)號為00 00)
[Full Block Number: 0]
|報(bào)文原文|
00 04 00 00
服務(wù)器響應(yīng)報(bào)文:
|報(bào)文解析|
Trivial File Transfer Protocol
Opcode: Data Packet (3) (操作碼為03,數(shù)據(jù)報(bào)文)
[Destination File: tftp_test_file.txt]
[Read Request in frame 125]
Block: 1 (數(shù)據(jù)塊標(biāo)號為00 01)
[Full Block Number: 1]
Data (36 bytes)
Data: 736461666173646661736466617364666666666666666641617364666173666166736466 (數(shù)據(jù))
[Length: 36]
|報(bào)文原文|
00 03 00 01 73 64 61 66 61 73 64 66 61 73 64 66 61 73 64 66 66 66 66 66 66 66 66 41 61 73 64 66 61 73 66 61 66 73 64 66
客戶端響應(yīng)報(bào)文:
|報(bào)文解析|
Trivial File Transfer Protocol
Opcode: Acknowledgement (4) (操作碼為04,回應(yīng)報(bào)文)
[Destination File: tftp_test_file.txt]
[Read Request in frame 125]
Block: 1 (數(shù)據(jù)塊標(biāo)號為00 01)
[Full Block Number: 1]
|報(bào)文原文|
00 04 00 01
6實(shí)現(xiàn)過程
接下來,我們在W55MH32上實(shí)現(xiàn)TFTP協(xié)議讀取文件。
注意:測試實(shí)例需要PC端和W55MH32處于同一網(wǎng)段。
在主函數(shù)中調(diào)用do_tftp_client()函數(shù)不斷檢查和處理 TFTP客戶端的狀態(tài),并根據(jù)讀取的結(jié)果(成功或失?。┻M(jìn)入相應(yīng)的處理狀態(tài)。
1. do_tftp_client(SOCKET_ID, ethernet_buf);
do_tftp_client()函數(shù)如下:
void do_tftp_client(uint8_t sn, uint8_t *buff)
{
uint32_t tftp_server_ip = inet_addr(TFTP_SERVER_IP);
uint8_t tftp_read_file_name[] = TFTP_SERVER_FILE_NAME;
TFTP_init(sn, buff);
while (1)
{
if (tftp_read_flag == 0)
{
printf("tftp server ip: %s, file name: %srn", TFTP_SERVER_IP, TFTP_SERVER_FILE_NAME);
printf("send requestrn");
TFTP_read_request(tftp_server_ip, TFTP_SERVER_FILE_NAME);
tftp_read_flag = 1;
}
else
{
tftp_state = TFTP_run();
if (tftp_state == TFTP_SUCCESS)
{
printf("tftp read success, file name: %srn", tftp_read_file_name);
while (1)
{
// 成功后進(jìn)入死循環(huán)
}
}
else if (tftp_state == TFTP_FAIL)
{
printf("tftp read fail, file name: %srn", tftp_read_file_name);
while (1)
{
// 失敗后進(jìn)入死循環(huán)
}
}
}
}
}
進(jìn)入do_tftp_client()函數(shù)后開始進(jìn)行TFTP客戶端處理,步驟如下:
步驟一:TFTP初始化
調(diào)用TFTP_init()函數(shù)對TFTP客戶端進(jìn)行初始化,參數(shù)sn和buff分別是socket號,socket緩存。
void TFTP_init(uint8_t socket, uint8_t *buf)
{
init_tftp();
g_tftp_socket = open_tftp_socket(socket);
g_tftp_rcv_buf = buf;
}
static void init_tftp(void)
{
g_filename[0] = 0;
set_server_ip(0);
set_server_port(0);
set_local_port(0);
set_tftp_state(STATE_NONE);
set_block_number(0);
// timeout flag
g_resend_flag = 0;
tftp_retry_cnt = tftp_time_cnt = 0;
g_progress_state = TFTP_PROGRESS;
}
步驟二:發(fā)送 TFTP讀請求
當(dāng)tftp_read_flag為 0時,表示尚未發(fā)送讀取請求。此時,打印 TFTP服務(wù)器的 IP地址和要讀取的文件名,然后調(diào)用TFTP_read_request()函數(shù)向服務(wù)器發(fā)送讀取請求。發(fā)送請求后,將tftp_read_flag設(shè)置為 1,表示已發(fā)送請求。
void TFTP_read_request(uint32_t server_ip, uint8_t *filename)
{
set_server_ip(server_ip);
#ifdef __TFTP_DEBUG__
DBG_PRINT(INFO_DBG, "[%s] Set Tftp Server : %xrn", __func__, server_ip);
#endif
g_progress_state = TFTP_PROGRESS;
send_tftp_rrq(filename, (uint8_t *)TRANS_BINARY, &default_tftp_opt, 1);
}
步驟三:運(yùn)行 TFTP協(xié)議并處理結(jié)果
當(dāng) tftp_read_flag為 1時調(diào)用 TFTP_run()函數(shù)處理 TFTP協(xié)議操作,依據(jù)其返回的 tftp_state判斷結(jié)果:若為 TFTP_SUCCESS則打印成功信息并進(jìn)入無限循環(huán),若為 TFTP_FAIL則打印失敗信息并進(jìn)入無限循環(huán)。
TFTP_run()函數(shù)如下:
int TFTP_run(void)
{
int len;
uint16_t from_port;
uint32_t from_ip;
/* Timeout Process */
if (g_resend_flag)
{
if (tftp_time_cnt >= g_timeout)
{
switch (get_tftp_state())
{
case STATE_WRQ:
break;
case STATE_RRQ:
send_tftp_rrq(g_filename, (uint8_t *)TRANS_BINARY, &default_tftp_opt, 1);
break;
case STATE_OACK:
case STATE_DATA:
send_tftp_ack(get_block_number());
break;
case STATE_ACK:
break;
default:
break;
}
tftp_time_cnt = 0;
tftp_retry_cnt++;
if (tftp_retry_cnt >= 5)
{
init_tftp();
g_progress_state = TFTP_FAIL;
}
}
}
/* Receive Packet Process */
len = recv_udp_packet(g_tftp_socket, g_tftp_rcv_buf, MAX_MTU_SIZE, &from_ip, &from_port);
if (len < 0)
{
#ifdef __TFTP_DEBUG__
DBG_PRINT(ERROR_DBG, "[%s] recv_udp_packet errorrn", __func__);
#endif
return g_progress_state;
}
recv_tftp_packet(g_tftp_rcv_buf, len, from_ip, from_port);
return g_progress_state;
}
在處理接收到的TFTP數(shù)據(jù)包時,首先調(diào)用recv_tftp_packet()函數(shù)。
recv_tftp_packet()函數(shù)如下:
static void recv_tftp_packet(uint8_t *packet, uint32_t packet_len, uint32_t from_ip, uint16_t from_port)
{
uint16_t opcode;
/* Verify Server IP */
if (from_ip != get_server_ip())
{
#ifdef __TFTP_DEBUG__
DBG_PRINT(ERROR_DBG, "[%s] Server IP faultsrn", __func__);
DBG_PRINT(ERROR_DBG, "from IP : %08x, Server IP : %08xrn", from_ip, get_server_ip());
#endif
return;
}
opcode = ntohs(*((uint16_t *)packet));
/* Set Server Port */
if ((get_tftp_state() == STATE_WRQ) || (get_tftp_state() == STATE_RRQ))
{
set_server_port(from_port);
#ifdef __TFTP_DEBUG__
DBG_PRINT(INFO_DBG, "[%s] Set Server Port : %drn", __func__, from_port);
#endif
}
switch (opcode)
{
case TFTP_RRQ: /* When Server */
recv_tftp_rrq(packet, packet_len);
break;
case TFTP_WRQ: /* When Server */
recv_tftp_wrq(packet, packet_len);
break;
case TFTP_DATA:
recv_tftp_data(packet, packet_len);
break;
case TFTP_ACK:
recv_tftp_ack(packet, packet_len);
break;
case TFTP_OACK:
recv_tftp_oack(packet, packet_len);
break;
case TFTP_ERROR:
recv_tftp_error(packet, packet_len);
break;
default:
// Unknown Message
break;
}
}
進(jìn)入該函數(shù)后,第一步驗(yàn)證接收到的數(shù)據(jù)包的源IP地址,只有當(dāng)它與服務(wù)器IP地址一致時才繼續(xù)處理,若不一致則直接返回。接著,從數(shù)據(jù)包中獲取操作碼(opcode)。根據(jù)獲取到的操作碼,調(diào)用相應(yīng)的處理函數(shù):如果是TFTP讀請求(RRQ),則調(diào)用 recv_tftp_rrq()函數(shù);若是寫請求(WRQ),則調(diào)用recv_tftp_wrq()函數(shù);對于接收到的數(shù)據(jù)數(shù)據(jù)包,調(diào)用 recv_tftp_data()函數(shù);確認(rèn)數(shù)據(jù)包則由recv_tftp_ack()函數(shù)處理;OACK數(shù)據(jù)包由recv_tftp_oack()函數(shù)處理;若遇到錯誤數(shù)據(jù)包,調(diào)用recv_tftp_error()函數(shù)來解析錯誤代碼和錯誤信息。最后,返回g_progress_state,以此表示當(dāng)前TFTP操作的狀態(tài)。
7運(yùn)行結(jié)果
燒錄例程運(yùn)行后,首先進(jìn)行了PHY鏈路檢測,然后是DHCP獲取網(wǎng)絡(luò)地址結(jié)果,最后打印服務(wù)器IP和文本名稱,讀取文本內(nèi)容,如下圖所示:

8總結(jié)
本文講解了如何在 W55MH32芯片上實(shí)現(xiàn) TFTP協(xié)議,通過實(shí)戰(zhàn)例程詳細(xì)展示了使用 TFTP客戶端模式從服務(wù)器獲取文本文件的過程,涵蓋 TFTP初始化、發(fā)送讀請求、運(yùn)行協(xié)議并處理結(jié)果等核心步驟。文章還對 TFTP協(xié)議的簡介、特點(diǎn)、應(yīng)用場景、基本工作流程和報(bào)文解析進(jìn)行了分析,幫助讀者理解其在文件傳輸中的實(shí)際應(yīng)用價(jià)值。
下一篇文章將聚焦 SNMP協(xié)議,解析其核心原理及在網(wǎng)絡(luò)管理中的應(yīng)用,同時講解如何在相關(guān)設(shè)備上實(shí)現(xiàn) SNMP功能,敬請期待!
WIZnet是一家無晶圓廠半導(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多家分銷商,在香港、韓國、美國設(shè)有辦事處,提供技術(shù)支持和產(chǎn)品營銷。
香港辦事處管理的區(qū)域包括:澳大利亞、印度、土耳其、亞洲(韓國和日本除外)。
審核編輯 黃宇
-
以太網(wǎng)
+關(guān)注
關(guān)注
41文章
5994瀏覽量
180752 -
TFTP
+關(guān)注
關(guān)注
0文章
24瀏覽量
14800
發(fā)布評論請先 登錄
第十四章 USART——串口通訊
W55MH32高性能以太網(wǎng)單片機(jī)開發(fā)課件 第十四章 ADC(上篇)
第十四章 ADC(下篇)
第二章 W55MH32 DHCP示例
第五章 W55MH32 UDP示例
第九章 W55MH32 HTTP Server示例
第十章 W55MH32 SNTP示例
第十一章 W55MH32 SMTP示例
第十二章 W55MH32 NetBIOS示例
第十三章 W55MH32 UPnP端口轉(zhuǎn)發(fā)示例
第十五章 W55MH32 SNMP示例
第十六章 W55MH32 PING示例
第十七章 W55MH32 ARP示例
第十八章 W55MH32 FTP_Server示例
第二十六章 W55MH32?上位機(jī)搜索和配置示例
第十四章 W55MH32 TFTP示例
評論