【笔记】w5500 官方DHCP库 使用
官方版本 V4.0.0
无需改动
心得
1.适配其中的 时基函数
/** @brief DHCP 1s Tick Timer handler* @note SHOULD BE register to your system 1s Tick timer handler */
void DHCP_time_handler(void);
看情况,定时器,系统节拍中 都可以。实现 1s 调用一次该函数就可以
2. 创建消息缓冲区
目的为了接收解析udp消息使用。
是接收以下数据使用
.c
/** @brief DHCP message format*/
typedef struct {uint8_t op; ///< @ref DHCP_BOOTREQUEST or @ref DHCP_BOOTREPLYuint8_t htype; ///< @ref DHCP_HTYPE10MB or @ref DHCP_HTYPE100MBuint8_t hlen; ///< @ref DHCP_HLENETHERNETuint8_t hops; ///< @ref DHCP_HOPSuint32_t xid; ///< @ref DHCP_XID This increase one every DHCP transaction.uint16_t secs; ///< @ref DHCP_SECSuint16_t flags; ///< @ref DHCP_FLAGSBROADCAST or @ref DHCP_FLAGSUNICASTuint8_t ciaddr[4]; ///< @ref Request IP to DHCP severuint8_t yiaddr[4]; ///< @ref Offered IP from DHCP serveruint8_t siaddr[4]; ///< No use uint8_t giaddr[4]; ///< No useuint8_t chaddr[16]; ///< DHCP client 6bytes MAC address. Others is filled to zerouint8_t sname[64]; ///< No useuint8_t file[128]; ///< No useuint8_t OPT[OPT_SIZE]; ///< Option
} RIP_MSG;
我们创建缓冲区的大小 : 在 .c 98 行有定义 这个结构体的空间大小
#define OPT_SIZE 312 /// Max OPT size of @ref RIP_MSG
#define RIP_MSG_SIZE (236+OPT_SIZE) /// Max size of @ref RIP_MSG
所以 236+312 = 548; 感觉这个宏应该放在 .h 文件里,比较方便。就这样用吧,不改动了
创建的时候 最好动态 申请内存。 因为只有dhcp时候 用一下。(别浪费ram,ram量大无所谓)
缓冲区地址将会被这个函数使用,可以看到 转成 结构体类型了。所以空间大小要对称
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_DHCPpDHCPMSG = (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 ClearsetSIPR(zeroip);setGAR(zeroip);reset_DHCP_timeout();dhcp_state = STATE_DHCP_INIT;
}
其他问题
看到很多修改回调函数的 ip_assign,ip_update,ip_conflict 这几个。
其实不需要更改,.c里有默认的实现函数。
注册时候 直接 填空,就会使用默认函数。
reg_dhcp_cbfunc(NULL,NULL,NULL);
实际操作
设备上电 基础的操作。
w5500_hard_reset();// 硬件复位w5500_interface_init();//我自己的函数 注册wizchip_conf 的操作函数
缓冲区默认
wizchip_init(NULL, NULL)
1.PHY
好像可以自动 感兴趣可以试试
// phy initphyconf.by = PHY_CONFBY_SW;phyconf.mode = PHY_MODE_MANUAL;phyconf.speed = PHY_SPEED_100;phyconf.duplex = PHY_DUPLEX_FULL;wizphy_setphyconf(&phyconf);
2.mac要设置
dhcp就是根据mac分配的
如果局域网内单台设备 不设置也行,有默认设置
setSHAR(netconf.mac);
3.初始化DHCP 注册函数
DHCP_init(1,DHCP_buf);
reg_dhcp_cbfunc(NULL,NULL,NULL);// 使用默认回调函数
4.动态申请DHCP
dhcp_ret = DHCP_run();//重点是DHCP_run(),该函数实现动态申请IP的功能while(dhcp_ret != DHCP_IP_LEASED)//返回DHCP_IP_LEASED说明申请租赁IP地址成功,如果没成功,重新申请{HAL_Delay(1000);dhcp_ret = DHCP_run();printf(".");}
5.成功打印
可以PING通