單芯片解決方案,開啟全新體驗——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,其資源豐富,專為各種復雜工控場景設(shè)計。它擁有66個GPIO、3個ADC、12通道DMA、17個定時器、2個I2C、5個串口、2個SPI接口(其中1個帶I2S接口復用)、1個CAN、1個USB2.0以及1個SDIO接口。如此豐富的外設(shè)資源,能夠輕松應(yīng)對工業(yè)控制中多樣化的連接需求,無論是與各類傳感器、執(zhí)行器的通信,還是對復雜工業(yè)協(xié)議的支持,都能游刃有余,成為復雜工控領(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 DHCP示例
本篇文章我們將詳細講解DHCP協(xié)議的基本信息、優(yōu)勢特點、工作原理、應(yīng)用場景,并通過實戰(zhàn)例程,為大家講解如何使用W55MH32動態(tài)獲取IP信息,幫助讀者更好地了解并運用這一協(xié)議。
有關(guān)W55MH32的初始化過程,請參考相關(guān)章節(jié),這里將不再詳述。
1 DHCP協(xié)議簡介
DHCP(Dynamic Host Configuration Protocol)即動態(tài)主機配置協(xié)議,是一個應(yīng)用層協(xié)議。它主要用于在 IP網(wǎng)絡(luò)中為客戶端自動分配 IP地址及其他相關(guān)網(wǎng)絡(luò)配置參數(shù),如子網(wǎng)掩碼、默認網(wǎng)關(guān)、DNS服務(wù)器地址等。這種動態(tài)分配的方式大大簡化了網(wǎng)絡(luò)管理員的工作,并且能夠更有效地利用有限的 IP地址資源。
2 DHCP協(xié)議特點
便捷配置與管控:DHCP可自動分配IP地址、子網(wǎng)掩碼、網(wǎng)關(guān)、DNS等網(wǎng)絡(luò)參數(shù),設(shè)備入網(wǎng)即自動獲取,用戶無需手動操作。管理員能通過服務(wù)器集中管理IP分配,網(wǎng)絡(luò)架構(gòu)調(diào)整時,修改服務(wù)器設(shè)置,客戶端自動適配;靜態(tài)IP則要逐臺手動輸入、調(diào)整,流程繁瑣還易出錯。
靈活資源利用:DHCP動態(tài)分配IP,設(shè)備離線后地址回池再利用,契合公共場所臨時大量接入需求,提升地址利用率;還能按需靈活調(diào)配,為關(guān)鍵設(shè)備保留靜態(tài)IP,其余動態(tài)分配。靜態(tài)IP固定占用,閑置浪費資源,靈活性差。
高效維護與排障:DHCP自動分配,規(guī)避手動配置錯誤與IP地址沖突,服務(wù)器詳細記錄分配情況。網(wǎng)絡(luò)故障時,管理員依服務(wù)器日志鎖定故障設(shè)備排查;靜態(tài)IP手動配置易沖突,故障排查缺少有效記錄,難度大、耗時久。
適配移動與拓展:移動設(shè)備橫跨網(wǎng)絡(luò)時,DHCP讓其自動獲取IP配置,無需手動切換;網(wǎng)絡(luò)規(guī)模擴大、新增設(shè)備時,DHCP自動分配地址,助力快速擴容。靜態(tài)IP需提前規(guī)劃,易現(xiàn)地址不足、分配不合理問題,還增加設(shè)備移動操作難度。
3 DHCP工作原理
DHCP工作原理如圖所示:
從圖示中我們可以直觀明了地看出DHCP地工作原理,一般為四個階段:
發(fā)現(xiàn)階段:客戶端接入網(wǎng)絡(luò)時以廣播形式發(fā)送DHCP Discover報文(目的IP是255.255.255.255,源IP是0.0.0.0)尋找DHCP服務(wù)器,報文中含客戶端MAC地址。若服務(wù)器和客戶端不在同一子網(wǎng),會通過中繼代理(如路由器)轉(zhuǎn)發(fā)。
提供階段:DHCP服務(wù)器收到Discover報文后,從IP地址池選一個未分配的IP地址,將其和子網(wǎng)掩碼、默認網(wǎng)關(guān)、DNS服務(wù)器地址等信息封裝進DHCP Offer報文,以廣播或單播方式發(fā)給客戶端,可能會有多個Offer報文。
請求階段:客戶端收到多個Offer后選擇一個,以廣播形式發(fā)送DHCP Request報文請求分配該IP地址等配置信息,且發(fā)送ARP請求檢查IP地址唯一性。
確認階段:服務(wù)器收到Request報文后,檢查IP地址是否可用。若可用,將以廣播或單播的形式發(fā)送DHCP Ack報文,客戶端收到后完成網(wǎng)絡(luò)配置正常上網(wǎng)。若不可用,發(fā)送DHCP Nak報文,客戶端收到后重新發(fā)起Discover流程。
4 DHCP協(xié)議報文
DHCP的報文格式如下:
0~7 bit | 8~15 bit | 16~23 bit | 24~31 bit |
op(1) | htype(1) | hlen(1) | hops(1) |
Xid(4) | |||
secs(2) | flags(2) | ||
ciaddr(4) | |||
yiaddr(4) | |||
siaddr(4) | |||
giaddr(4) | |||
chaddr(16) | |||
sname(64) | |||
file(128) | |||
options(variable) |
DHCP報文各字段的說明如下表所示:
字段 | 長度 | 含義 |
op(op code) | 1字節(jié) |
表示報文的類型,取值為1或2,含義如下: 1:客戶端請求報文。 2:服務(wù)器響應(yīng)報文。 |
htype(hardware type) | 1字節(jié) | 表示硬件類型。不同的硬件類型取值不同,常見值為1,表示以太網(wǎng)(10Mb)。 |
hlen(hardware length) | 1字節(jié) | 表示硬件地址長度,以太網(wǎng)的值為6。 |
hops | 1字節(jié) | 表示DHCP報文經(jīng)過的DHCP中繼數(shù)目。客戶端或服務(wù)器初始設(shè)為0,每經(jīng)過一個中繼則加1,用于限制DHCP報文經(jīng)過的中繼數(shù)量,且服務(wù)器與客戶端間中繼數(shù)目不能超16個(Hops值不能大于16),否則報文將被丟棄。 |
xid | 4字節(jié) | 表示DHCP客戶端選取的隨機數(shù),使DHCP服務(wù)器的回復與DHCP客戶端的報文相關(guān)聯(lián)。 |
secs(seconds) | 2字節(jié) | 表示客戶端從開始獲取地址或地址續(xù)租更新后所用的時間,單位是秒。 |
flags | 2字節(jié) |
表示標志字段。只有標志字段的最高位才有意義,其余的15位均被置為0。最高位被解釋為單播或者廣播響應(yīng)標志位,內(nèi)容如下所示: 0:客戶端請求服務(wù)器以單播形式發(fā)送響應(yīng)報文。 1:客戶端請求服務(wù)器以廣播形式發(fā)送響應(yīng)報文。 |
ciaddr(client ip address) | 4字節(jié) |
表示客戶端的IP地址。可以是服務(wù)器分配給客戶端的IP地址或者客戶端已有的IP地址。客戶端在初始化狀態(tài)時沒有IP地址,此字段為0.0.0.0。 IP地址0.0.0.0僅在采用DHCP方式的系統(tǒng)啟動時允許本主機利用它進行臨時的通信,不是有效目的地址。 |
yiaddr(your client ip address) | 4字節(jié) | 表示服務(wù)器分配給客戶端的IP地址。當服務(wù)器進行DHCP響應(yīng)時,將分配給客戶端的IP地址填入此字段。 |
siaddr(server ip address) | 4字節(jié) | DHCP客戶端獲得啟動配置信息的服務(wù)器的IP地址。 |
giaddr(gateway ip address) | 4字節(jié) | 表示首個DHCP中繼的IP地址。客戶端發(fā)DHCP請求,若服務(wù)器與客戶端不在同一網(wǎng)段,首個中繼轉(zhuǎn)發(fā)請求報文給服務(wù)器時填入自身IP地址,服務(wù)器據(jù)此判斷客戶端網(wǎng)段地址,選地址池分配對應(yīng)IP地址,再按此地址回發(fā)響應(yīng)報文給該中繼,由中繼轉(zhuǎn)發(fā)給客戶端。若存在多個中繼,此字段作為客戶端網(wǎng)段標記,填好首個中繼IP地址后不再變更,每經(jīng)過一個中繼,hops字段數(shù)值加1。 |
chaddr(client hardware address) | 16字節(jié) | 表示客戶端的MAC地址,此字段與前面的“hardware type”和“hardware length”保持一致。當客戶端發(fā)出DHCP請求時,將自己的硬件地址填入此字段。對于以太網(wǎng),當“hardware type”和“hardware length”分別為“1”和“6”時,此字段必須填入6字節(jié)的以太網(wǎng)MAC地址。 |
sname(server host name) | 64字節(jié) | 表示客戶端獲取配置信息的服務(wù)器名字。此字段由DHCP服務(wù)器填寫,是可選的。如果填寫,必須是一個以0結(jié)尾的字符串。 |
file(file name) | 128字節(jié) | 表示客戶端需獲取的啟動配置文件名。由DHCP服務(wù)器填寫,隨DHCP地址分配下發(fā)至客戶端。該字段可選,若填寫則須是以0結(jié)尾的字符串。 |
options | 可變 | 表示DHCP的選項字段,最多1200字節(jié),包含DHCP報文類型、服務(wù)器分配給終端的配置信息(如網(wǎng)關(guān)IP地址、DNS服務(wù)器IP地址、客戶端IP地址有效租期等)。詳情參見IETF官網(wǎng)“DHCP Options”部分的描述。 |
Discover報文實例:客戶端通過UDP廣播的方式發(fā)送DHCP發(fā)現(xiàn)報文,報文中包含了客戶端MAC地址、主機名和請求的IP地址等信息
|報文解析| Message type: Boot Request (1)(op code為1,客戶端請求報文) Hardware type: Ethernet (0x01) Hardware address length: 6 Hops: 0 Transaction ID: 0xbf600589 Seconds elapsed: 0 Bootp flags: 0x0000 (Unicast) Client IP address: 0.0.0.0 Your (client) IP address: 0.0.0.0 Next server IP address: 0.0.0.0 Relay agent IP address: 0.0.0.0 Client MAC address: HP_b1:37:11 (64:4e:d7:b1:37:11) Client hardware address padding: 00000000000000000000 Server host name not given Boot file name not given Magic cookie: DHCP Option: (53) DHCP Message Type (Discover) Option: (61) Client identifier Option: (50) Requested IP Address (192.168.1.115) Option: (12) Host Name Option: (60) Vendor class identifier Option: (55) Parameter Request List Option: (255) End Padding: 0000000000000000 |報文原文| 01 01 06 00 bf 60 05 89 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 64 4e d7 b1 37 11 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 63 82 53 63 35 01 01 3d 07 01 64 4e d7 b1 37 11 32 04 c0 a8 01 73 0c 05 46 41 45 5f 33 3c 08 4d 53 46 54 20 35 2e 30 37 0e 01 03 06 0f 1f 21 2b 2c 2e 2f 77 79 f9 fc ff 00 00 00 00 00 00 00 00
Offer報文實例:DHCP服務(wù)器收到Discover報文后,從IP地址池選一個未分配的IP地址,將其和子網(wǎng)掩碼、默認網(wǎng)關(guān)等信息封裝進Offer報文以廣播或單播(這里為廣播的方式)方式發(fā)給客戶端
|報文解析| Message type: Boot Reply (2)(op code為2,服務(wù)器響應(yīng)報文) Hardware type: Ethernet (0x01) Hardware address length: 6 Hops: 0 Transaction ID: 0xbf600589 Seconds elapsed: 0 Bootp flags: 0x0000 (Unicast) Client IP address: 0.0.0.0 Your (client) IP address: 192.168.1.115 Next server IP address: 0.0.0.0 Relay agent IP address: 0.0.0.0 Client MAC address: HP_b1:37:11 (64:4e:d7:b1:37:11) Client hardware address padding: 00000000000000000000 Server host name not given Boot file name not given Magic cookie: DHCP Option: (53) DHCP Message Type (Offer) Option: (54) DHCP Server Identifier (192.168.1.1) Option: (51) IP Address Lease Time Option: (6) Domain Name Server Option: (1) Subnet Mask (255.255.255.0) Option: (3) Router Option: (255) End |報文原文| 02 01 06 00 bf 60 05 89 00 00 00 00 00 00 00 00 c0 a8 01 73 00 00 00 00 00 00 00 00 64 4e d7 b1 37 11 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 63 82 53 63 35 01 02 36 04 c0 a8 01 01 33 04 00 00 1c 20 06 08 ca 60 86 21 ca 60 80 56 01 04 ff ff ff 00 03 04 c0 a8 01 01 ff
其他報文信息這里就不一一展示了,感興趣的朋友可以自行抓取查看。
5 DHCP應(yīng)用場景
DHCP的應(yīng)用場景通常集中在需要動態(tài)分配IP地址的局域網(wǎng)環(huán)境中。例如,在大型的辦公環(huán)境或者學校中,由于有大量的網(wǎng)絡(luò)設(shè)備需要連接到網(wǎng)絡(luò),手動為每個設(shè)備分配和管理IP地址會非常繁瑣且容易出錯。使用DHCP可以集中管理IP地址的分配,提高網(wǎng)絡(luò)管理員的工作效率,減少錯誤的發(fā)生,且可以適應(yīng)網(wǎng)絡(luò)變化。
6實現(xiàn)過程
接下來,我們一起來看看如何在W55MH32上實現(xiàn)DHCP動態(tài)獲取網(wǎng)絡(luò)地址信息。
注意:使用DHCP動態(tài)獲取IP時,必需將網(wǎng)絡(luò)結(jié)構(gòu)體配置中dhcp的值改為NETINFO_DHCP,這樣才能運行DHCP模式。
步驟一:注冊DHCP定時器中斷到1s定時器中:
/** * @brief 1ms timer IRQ Handler * @param none * @return none */ void TIM3_IRQHandler(void) { static uint32_t tim3_1ms_count = 0; if (TIM_GetITStatus(TIM3, TIM_IT_Update) != RESET) { tim3_1ms_count++; if (tim3_1ms_count >= 1000) { DHCP_time_handler(); tim3_1ms_count = 0; } TIM_ClearITPendingBit(TIM3, TIM_IT_Update); } }
注冊DHCP定時器中斷主要為了DHCP超時處理。
在dhcp.h文件中,定義了DHCP超時時間、重試次數(shù)、端口號和主機名等內(nèi)容:
/* Retry to processing DHCP */ #define MAX_DHCP_RETRY 2 ///< Maximum retry count #define DHCP_WAIT_TIME 10 ///< Wait Time 10s /* UDP port numbers for DHCP */ #define DHCP_SERVER_PORT 67 ///< DHCP server port number #define DHCP_CLIENT_PORT 68 ///< DHCP client port number #define MAGIC_COOKIE 0x63825363 ///< You should not modify it number. #define DCHP_HOST_NAME "WIZnet"
步驟二:啟用DHCP動態(tài)獲取:
首先需要將默認網(wǎng)絡(luò)地址信息結(jié)構(gòu)體中的模式改為DHCP模式
/* network information */ wiz_NetInfo default_net_info = { .mac = {0x00, 0x08, 0xdc, 0x12, 0x22, 0x12}, .ip = {192, 168, 1, 30}, .gw = {192, 168, 1, 1}, .sn = {255, 255, 255, 0}, .dns = {8, 8, 8, 8}, .dhcp = NETINFO_DHCP };
步驟三:DHCP獲取網(wǎng)絡(luò)地址信息
首先是在初始化完硬件和TOE之后調(diào)用network_init進行網(wǎng)絡(luò)地址信息配置
network_init(ethernet_buf, &default_net_info);
這個函數(shù)需要將DHCP處理用到的緩存數(shù)組以及默認網(wǎng)絡(luò)地址信息傳入,函數(shù)具體內(nèi)容如下:
/** * @brief set network information * * First determine whether to use DHCP. If DHCP is used, first obtain the Internet Protocol Address through DHCP. * When DHCP fails, use static IP to configure network information. If static IP is used, configure network information directly * * @param sn: socketid * @param ethernet_buff: * @param net_info: network information struct * @return none */ void network_init(uint8_t *ethernet_buff, wiz_NetInfo *conf_info) { int ret; wizchip_setnetinfo(conf_info); // Configuring Network Information if (conf_info->dhcp == NETINFO_DHCP) { ret = wiz_dhcp_process(0, ethernet_buff); if (ret == 0) { conf_info->dhcp = NETINFO_STATIC; wizchip_setnetinfo(conf_info); } } print_network_information(); }
在這個函數(shù)中,會先設(shè)置一遍網(wǎng)絡(luò)地址到W55MH32中,然后判斷模式是否為DHCP模式,如果為DHCP模式,則使用wiz_dhcp_process函數(shù)來執(zhí)行DHCP進程,在通過DHCP方式成功獲取到網(wǎng)絡(luò)地址后更新到W55MH32中,最后將網(wǎng)絡(luò)地址信息打印出來。wiz_dhcp_process函數(shù)內(nèi)容如下:
/** * @brief DHCP process * @param sn :socket number * @param buffer :socket buffer */ static uint8_t wiz_dhcp_process(uint8_t sn, uint8_t *buffer) { wiz_NetInfo conf_info; uint8_t dhcp_run_flag = 1; uint8_t dhcp_ok_flag = 0; /* Registration DHCP_time_handler to 1 second timer */ DHCP_init(sn, buffer); printf("DHCP runningrn"); while (1) { switch (DHCP_run()) // Do the DHCP client { case DHCP_IP_LEASED: // DHCP Acquiring network information successfully if (dhcp_ok_flag == 0) { dhcp_ok_flag = 1; dhcp_run_flag = 0; } break; case DHCP_FAILED: dhcp_run_flag = 0; break; } if (dhcp_run_flag == 0) { printf("DHCP %s!rn", dhcp_ok_flag ? "success" : "fail"); DHCP_stop(); if (dhcp_ok_flag) { getIPfromDHCP(conf_info.ip); getGWfromDHCP(conf_info.gw); getSNfromDHCP(conf_info.sn); getDNSfromDHCP(conf_info.dns); conf_info.dhcp = NETINFO_DHCP; getSHAR(conf_info.mac); wizchip_setnetinfo(&conf_info); // Update network information to network information obtained by DHCP return 1; } return 0; } } }
在該函數(shù)體中,首先會調(diào)用DHCP_init函數(shù)進行初始化DHCP配置:
void DHCP_init(uint8_t s, uint8_t * buf) { uint8_t zeroip[4] = {0,0,0,0}; getSHAR(DHCP_CHADDR); if((DHCP_CHADDR[0] | DHCP_CHADDR[1] | DHCP_CHADDR[2] | DHCP_CHADDR[3] | DHCP_CHADDR[4] | DHCP_CHADDR[5]) == 0x00) { // assigning temporary mac address, you should be set SHAR before call this function. DHCP_CHADDR[0] = 0x00; DHCP_CHADDR[1] = 0x08; DHCP_CHADDR[2] = 0xdc; DHCP_CHADDR[3] = 0x00; DHCP_CHADDR[4] = 0x00; DHCP_CHADDR[5] = 0x00; setSHAR(DHCP_CHADDR); } DHCP_SOCKET = s; // SOCK_DHCP pDHCPMSG = (RIP_MSG*)buf; DHCP_XID = 0x12345678; { DHCP_XID += DHCP_CHADDR[3]; DHCP_XID += DHCP_CHADDR[4]; DHCP_XID += DHCP_CHADDR[5]; DHCP_XID += (DHCP_CHADDR[3] ^ DHCP_CHADDR[4] ^ DHCP_CHADDR[5]); } // WIZchip Netinfo Clear setSIPR(zeroip); setGAR(zeroip); reset_DHCP_timeout(); dhcp_state = STATE_DHCP_INIT; }
然后是在DHCP主循環(huán)中運行DHCP_run函數(shù),它的主要作用是進行DHCP組包,發(fā)送發(fā)現(xiàn)、請求等報文,對服務(wù)器的提供、響應(yīng)等內(nèi)容進行解析以及超時處理,這里只需要根據(jù)DHCP_run函數(shù)的返回值進行相應(yīng)處理即可。DHCP_run函數(shù)內(nèi)容如下:
uint8_t DHCP_run(void) { uint8_t type; uint8_t ret; if(dhcp_state == STATE_DHCP_STOP) return DHCP_STOPPED; if(getSn_SR(DHCP_SOCKET) != SOCK_UDP) socket(DHCP_SOCKET, Sn_MR_UDP, DHCP_CLIENT_PORT, 0x00); ret = DHCP_RUNNING; type = parseDHCPMSG(); switch ( dhcp_state ) { case STATE_DHCP_INIT : DHCP_allocated_ip[0] = 0; DHCP_allocated_ip[1] = 0; DHCP_allocated_ip[2] = 0; DHCP_allocated_ip[3] = 0; send_DHCP_DISCOVER(); dhcp_state = STATE_DHCP_DISCOVER; break; case STATE_DHCP_DISCOVER : if (type == DHCP_OFFER){ #ifdef _DHCP_DEBUG_ printf("> Receive DHCP_OFFERrn"); #endif DHCP_allocated_ip[0] = pDHCPMSG->yiaddr[0]; DHCP_allocated_ip[1] = pDHCPMSG->yiaddr[1]; DHCP_allocated_ip[2] = pDHCPMSG->yiaddr[2]; DHCP_allocated_ip[3] = pDHCPMSG->yiaddr[3]; send_DHCP_REQUEST(); dhcp_state = STATE_DHCP_REQUEST; } else ret = check_DHCP_timeout(); break; case STATE_DHCP_REQUEST : if (type == DHCP_ACK) { #ifdef _DHCP_DEBUG_ printf("> Receive DHCP_ACKrn"); #endif if (check_DHCP_leasedIP()) { // Network info assignment from DHCP dhcp_ip_assign(); reset_DHCP_timeout(); dhcp_state = STATE_DHCP_LEASED; } else { // IP address conflict occurred reset_DHCP_timeout(); dhcp_ip_conflict(); dhcp_state = STATE_DHCP_INIT; } } else if (type == DHCP_NAK) { #ifdef _DHCP_DEBUG_ printf("> Receive DHCP_NACKrn"); #endif reset_DHCP_timeout(); dhcp_state = STATE_DHCP_DISCOVER; } else ret = check_DHCP_timeout(); break; case STATE_DHCP_LEASED : ret = DHCP_IP_LEASED; if ((dhcp_lease_time != INFINITE_LEASETIME) && ((dhcp_lease_time/2) < dhcp_tick_1s)) { #ifdef _DHCP_DEBUG_ printf("?> Maintains the IP address rn"); #endif type = 0; OLD_allocated_ip[0] = DHCP_allocated_ip[0]; OLD_allocated_ip[1] = DHCP_allocated_ip[1]; OLD_allocated_ip[2] = DHCP_allocated_ip[2]; OLD_allocated_ip[3] = DHCP_allocated_ip[3]; DHCP_XID++; send_DHCP_REQUEST(); reset_DHCP_timeout(); dhcp_state = STATE_DHCP_REREQUEST; } break; case STATE_DHCP_REREQUEST : ret = DHCP_IP_LEASED; if (type == DHCP_ACK) { dhcp_retry_count = 0; if (OLD_allocated_ip[0] != DHCP_allocated_ip[0] || OLD_allocated_ip[1] != DHCP_allocated_ip[1] || OLD_allocated_ip[2] != DHCP_allocated_ip[2] || OLD_allocated_ip[3] != DHCP_allocated_ip[3]) { ret = DHCP_IP_CHANGED; dhcp_ip_update(); #ifdef _DHCP_DEBUG_ printf(">IP changed.rn"); #endif } #ifdef _DHCP_DEBUG_ else printf(">IP is continued.rn"); #endif reset_DHCP_timeout(); dhcp_state = STATE_DHCP_LEASED; } else if (type == DHCP_NAK) { #ifdef _DHCP_DEBUG_ printf("> Receive DHCP_NACK, Failed to maintain iprn"); #endif reset_DHCP_timeout(); dhcp_state = STATE_DHCP_DISCOVER; } else ret = check_DHCP_timeout(); break; default : break; } return ret; }
8運行結(jié)果
燒錄例程運行后,首先打印了PHY鏈路檢測的結(jié)果以及DHCP日志信息,然后打印了網(wǎng)絡(luò)地址信息,這里可以看到配置方式為DHCP,IP地址為192.168.1.117,最后是PING提示消息。
接著在PC端打開CMD,PING W55MH32的IP地址,可以正常PING通。
7總結(jié)
本文介紹 DHCP協(xié)議,包括其在 IP網(wǎng)絡(luò)自動分配參數(shù)的功能、便捷配置等特點、工作原理、報文格式和應(yīng)用場景。通過 W55MH32實戰(zhàn)例程展示動態(tài)獲取網(wǎng)絡(luò)地址信息過程,含注冊定時器中斷、啟用模式和獲取信息等步驟,燒錄后可完成檢測與信息打印,PC端能 PING通設(shè)備。
下一篇文章將講解如何在 W55MH32芯片上實現(xiàn) TCP客戶端模式,解析 TCP客戶端連接服務(wù)器進行回環(huán)測試的核心原理及應(yīng)用,同時通過實戰(zhàn)例程講解具體實現(xiàn)步驟與要點,敬請期待!
WIZnet是一家無晶圓廠半導體公司,成立于 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文章
5682瀏覽量
176226 -
物聯(lián)網(wǎng)
+關(guān)注
關(guān)注
2931文章
46302瀏覽量
393362
發(fā)布評論請先 登錄
第二章 開發(fā)板與芯片介紹 詳解W55MH32芯片及開發(fā)板

第五章 W55MH32 UDP示例

第六章 W55MH32 UDP?Multicast示例

第九章 W55MH32 HTTP Server示例

第十章 W55MH32 SNTP示例

第十二章 W55MH32 NetBIOS示例

第十四章 W55MH32 TFTP示例

第十五章 W55MH32 SNMP示例

第十六章 W55MH32 PING示例

第十七章 W55MH32 ARP示例

第十八章 W55MH32 FTP_Server示例

第二十二章 W55MH32 MQTT&Aliyun示例

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

第二十七章 W55MH32?Interrupt示例

第三十章 W55MH32 HTTP_Server&NetBIOS示例

評論