|
用官網(wǎng)W5500庫版本的DHCP例子 申請10次會有5次 獲取不到IP 卡在了discover步驟,
經(jīng)過優(yōu)化,現(xiàn)在自測了50多遍,100%可以申請到IP。
主控用的nrf52832 cortex m4內(nèi)核 硬件spi
SDK為nRF_SDK_15.2.0
把解壓后的目錄放nRF_SDK_15.2.0\examples\ble_central下編譯就可以成功。
代碼預(yù)覽
- #include "ethernet.h"
- #include "dhcp.h"
- /* Private typedef -----------------------------------------------------------*/
- /* Private define ------------------------------------------------------------*/
- #define SOCK_TCPS 0
- /* Private macro -------------------------------------------------------------*/
- uint8_t gSEND_BUFF[SEND_BUFF_SIZE];
- // Default Network Configuration
- wiz_NetInfo gWIZNETINFO = { .mac = {0x00, 0x02, 0x04,0x06, 0x08, 0x10},
- .ip = {192,168,1,2 },
- .sn = {255,255,2555,0},
- .gw = {0, 0, 0, 0},
- .dns = {1,2,4,8},
- .dhcp = NETINFO_DHCP };
- void network_init(void);
-
- void set_macaddr(void)
- {
- gWIZNETINFO.mac[0] = (uint8_t )(NRF_FICR->DEVICEADDR[0]);
- gWIZNETINFO.mac[1] = (uint8_t )(NRF_FICR->DEVICEADDR[0]>>8);
- gWIZNETINFO.mac[2] = (uint8_t )(NRF_FICR->DEVICEADDR[0]>>16);
- gWIZNETINFO.mac[3] = (uint8_t )(NRF_FICR->DEVICEADDR[0]>>24);
- gWIZNETINFO.mac[4] = (uint8_t )(NRF_FICR->DEVICEADDR[1]);
- gWIZNETINFO.mac[5] = (uint8_t )(NRF_FICR->DEVICEADDR[1]>>8);
- }
- uint8_t DHCP_message[128];
- void ethernet_init(void)
- {
- uint8_t tmp;
-
- uint8_t memsize[2][8] = {{2,2,2,2,2,2,2,2},{2,2,2,2,2,2,2,2}};
-
-
- SPI_Configuration();
-
- memset((char *)gSEND_BUFF,0,SEND_BUFF_SIZE);
-
- reg_wizchip_cris_cbfunc(SPI_CrisEnter, SPI_CrisExit); //注冊臨界區(qū)函數(shù)
- /* Chip selection call back */
- #if _WIZCHIP_IO_MODE_ == _WIZCHIP_IO_MODE_SPI_VDM_
- reg_wizchip_cs_cbfunc(SPI_CS_Select, SPI_CS_Deselect);//注冊SPI片選信號函數(shù)
- #elif _WIZCHIP_IO_MODE_ == _WIZCHIP_IO_MODE_SPI_FDM_
- reg_wizchip_cs_cbfunc(SPI_CS_Select, SPI_CS_Deselect); // CS must be tried with LOW.
- #else
- #if (_WIZCHIP_IO_MODE_ & _WIZCHIP_IO_MODE_SIP_) != _WIZCHIP_IO_MODE_SIP_
- #error "Unknown _WIZCHIP_IO_MODE_"
- #else
- reg_wizchip_cs_cbfunc(wizchip_select, wizchip_deselect);
- #endif
- #endif
- /* SPI Read & Write callback function */
- reg_wizchip_spi_cbfunc(SPI_ReadByte, SPI_WriteByte); //注冊讀寫函數(shù)
- /* WIZCHIP SOCKET Buffer initialize */
- if(ctlwizchip(CW_INIT_WIZCHIP,(void*)memsize) == -1){
-
- while(1)
- {
- NRF_LOG_DEBUG("WIZCHIP Initialized fail.\r\n");
- nrf_delay_ms(500);
- }
- }
- NRF_LOG_DEBUG("WIZCHIP Initialized Successful.\r\n");
- /* PHY link status check */
- do{
- if(ctlwizchip(CW_GET_PHYLINK, (void*)&tmp) == -1)
- {
- NRF_LOG_DEBUG("Unknown PHY Link stauts.\r\n");
-
- }
-
- }while(tmp == PHY_LINK_OFF);
- NRF_LOG_DEBUG("phy running.\n");
-
- set_macaddr();
-
- memset(DHCP_message,0,128);
- DHCP_init(0,DHCP_message);
-
- /* Network initialization */
- network_init();
-
-
- }
- void show_netinfo(void);
- void ethernet_handle(void)
- {
- uint8_t dhcp_res;
- dhcp_res = DHCP_run();
- if(dhcp_res != DHCP_IP_LEASED)
- {
- NRF_LOG_INFO("DHCP_run... 返回值:%d\n",dhcp_res);
- nrf_delay_ms(1000);
- return;
- }
-
- static uint8_t temp = 0;
- if(temp == 0)
- {
- NRF_LOG_INFO("DHCP成功申請到IP地址\n");
- show_netinfo();
- temp = 1;
- }
- switch(getSn_SR(0))
- {
- case SOCK_UDP:
-
- if(getSn_IR(0) & Sn_IR_RECV)
- {
- setSn_IR(0, Sn_IR_RECV);
- }
- #if 0
- if((ret=getSn_RX_RSR(0))>0)
- {
- memset(gDATABUF,0,ret+1);
- recvfrom(0,gDATABUF, ret, DstIP,&DstPort);
- NRF_LOG_DEBUG("%s\r\n",gDATABUF);
- sendto(0,gDATABUF,ret, DstIP, DstPort);
- }
- #endif
- break;
- case SOCK_CLOSED: // Socket處于關(guān)閉狀態(tài)
- socket(0,Sn_MR_UDP,UDP_LOCAL_PORT,0x00); // 打開Socket0,并配置為UDP模式,打開一個本地端口
- break;
- }
-
- }
- void show_netinfo(void)
- {
- uint8_t tmpstr[6];
- ctlnetwork(CN_GET_NETINFO, (void*)&gWIZNETINFO);
- // Display Network Information
- ctlwizchip(CW_GET_ID,(void*)tmpstr);
- NRF_LOG_INFO("=== %s NET CONF ===\r\n",(char*)tmpstr);
- NRF_LOG_INFO("MAC: %02X:%02X:%02X:%02X:%02X:%02X\r\n",gWIZNETINFO.mac[0],gWIZNETINFO.mac[1],gWIZNETINFO.mac[2],
- gWIZNETINFO.mac[3],gWIZNETINFO.mac[4],gWIZNETINFO.mac[5]);
- NRF_LOG_INFO("SIP: %d.%d.%d.%d\r\n", gWIZNETINFO.ip[0],gWIZNETINFO.ip[1],gWIZNETINFO.ip[2],gWIZNETINFO.ip[3]);
- NRF_LOG_INFO("GAR: %d.%d.%d.%d\r\n", gWIZNETINFO.gw[0],gWIZNETINFO.gw[1],gWIZNETINFO.gw[2],gWIZNETINFO.gw[3]);
- NRF_LOG_INFO("SUB: %d.%d.%d.%d\r\n", gWIZNETINFO.sn[0],gWIZNETINFO.sn[1],gWIZNETINFO.sn[2],gWIZNETINFO.sn[3]);
- NRF_LOG_INFO("DNS: %d.%d.%d.%d\r\n", gWIZNETINFO.dns[0],gWIZNETINFO.dns[1],gWIZNETINFO.dns[2],gWIZNETINFO.dns[3]);
- NRF_LOG_INFO("======================\r\n");
- }
- void network_init(void)
- {
- ctlnetwork(CN_SET_NETINFO, (void*)&gWIZNETINFO);
- }
復(fù)制代碼
0.png (40.36 KB, 下載次數(shù): 80)
下載附件
2019-1-8 15:14 上傳
SDK為nRF_SDK_15.2.0
把解壓后的目錄放nRF_SDK_15.2.0\examples\ble_central下編譯就可以成功。
iar的工程(沒裝iar的鞋童就不要下載了):
w5500_dhcp_udp.7z
(342.93 KB, 下載次數(shù): 82)
2019-1-8 15:16 上傳
點擊文件名下載附件
下載積分: 黑幣 -5
|
評分
-
查看全部評分
|