/** ****************************************************************************** * @file w5500_conf.c * @version V1.2 * @date 2017-11-01 * @brief 用3.5.0版本库建的工程模板 * @attention 配置MCU,移植w5500程序需要修改的文件,配置w5500的MAC和IP地址 * * @company 深圳炜世科技有限公司 * @information WIZnet W5500官方代理商,全程技术支持,价格绝对优势! * @website www.wisioe.com * @forum www.w5500.cn * @qqGroup 383035001 ****************************************************************************** */ /* add by Gavin 2020.03 RST -PA15 CS -PB14 INT -PB15 SPI -sys_SPI3(PC10-clk;PC11 MISO;PC12 -MOSI; 参考原理图得知,w5500和NFC读卡器共用系统spi3, 而目前的NFC驱动是用的模拟spi,需要修改; 特别说明: 由于RST复位引脚也是共用(硬件设计缺陷),所以初始化在前的执行一次复位; 后初始化的那个模块不能再执行复位动作了,否则... NFC ic RC522的spi速度最大10M; w5500 SPI最大速度 80M system SPI3 最大速度 21.5M 所以系统SPI只能设置成3个中最小的那个 10M; 代理商参考设计资料 http://www.w5500.cn //--------------------------- 1,DEMO_W5500的宏定义用于屏蔽 demo中的开发板硬件信息 2, 实际调试,NFC ic-RC522只能用SPI3 8分频=5M通信,4分频实际测试不通过!!!!!!!!!!!! */ #include #include #include "w5500_conf.h" #include "utility.h" #include "w5500.h" #include "dhcp.h" #include "platform_interface.h" #include "function_interface.h" #include "function.h" #include "tcp_demo.h" #include "platform.h" //next 3 header file mask by Gavin //#include "bsp_i2c_ee.h" //#include "bsp_spi_flash.h" //#include "bsp_TiMbase.h" //add by Gavin extern SPI_HandleTypeDef hspi3; #ifndef DEMO_W5500 #define W5500_CS_PORT GPIOB #define W5500_CS_PIN GPIO_PIN_14 #define SET_W5500_CS HAL_GPIO_WritePin(W5500_CS_PORT,W5500_CS_PIN,GPIO_PIN_SET) #define RESET_W5500_CS HAL_GPIO_WritePin(W5500_CS_PORT,W5500_CS_PIN,GPIO_PIN_RESET) #endif CONFIG_MSG ConfigMsg; /*配置结构体*/ EEPROM_MSG_STR EEPROM_MSG; /*EEPROM存储信息结构体*/ /*MAC地址首字节必须为偶数*/ /*如果多块W5500网络适配板在同一现场工作,请使用不同的MAC地址*/ uint8 mac[6]={0x00,0x08,0xdc,0x11,0x11,0x11}; /*定义默认IP信息*/ uint8 local_ip[4]={192,168,0,12}; /*定义W5500默认IP地址*/ uint8 subnet[4]={255,255,255,0}; /*定义W5500默认子网掩码*/ uint8 gateway[4]={200,200,100,1}; //{192,168,1,1}; /*定义W5500默认网关*/ uint8 dns_server[4]={114,114,114,114}; /*定义W5500默认DNS*/ uint16 local_port=4000;//8000; /*定义本地端口*/ /*定义远端IP信息*/ uint8 remote_ip[4]={192,168,1,107}; /*远端IP地址*/ uint16 remote_port=8080; /*远端端口号*/ /*IP配置方法选择,请自行选择*/ uint8 ip_from=IP_FROM_DEFINE; uint8 dhcp_ok=0; /*dhcp成功获取IP*/ uint32 ms=0; /*毫秒计数*/ uint32 dhcp_time= 0; /*DHCP运行计数*/ vu8 ntptimer = 0; /*NPT秒计数*/ /** *@brief 配置W5500的IP地址 *@param 无 *@return 无 */ void set_w5500_ip(void) { /*复制定义的配置信息到配置结构体*/ memcpy(ConfigMsg.mac, mac, 6); memcpy(ConfigMsg.lip,local_ip,4); memcpy(ConfigMsg.sub,subnet,4); memcpy(ConfigMsg.gw,gateway,4); memcpy(ConfigMsg.dns,dns_server,4); if(ip_from==IP_FROM_DEFINE){ //printf(" 使用定义的IP信息配置W5500:\r\n"); } /*使用EEPROM存储的IP参数*/ if(ip_from==IP_FROM_EEPROM) { /*从EEPROM中读取IP配置信息*/ read_config_from_eeprom(); /*如果读取EEPROM中MAC信息,如果已配置,则可使用*/ if( *(EEPROM_MSG.mac)==0x00&& *(EEPROM_MSG.mac+1)==0x08&&*(EEPROM_MSG.mac+2)==0xdc) { //printf(" IP from EEPROM\r\n"); /*复制EEPROM配置信息到配置的结构体变量*/ memcpy(ConfigMsg.lip,EEPROM_MSG.lip, 4); memcpy(ConfigMsg.sub,EEPROM_MSG.sub, 4); memcpy(ConfigMsg.gw, EEPROM_MSG.gw, 4); } else { //printf(" EEPROM未配置,使用定义的IP信息配置W5500,并写入EEPROM\r\n"); write_config_to_eeprom(); /*使用默认的IP信息,并初始化EEPROM中数据*/ } } /*使用DHCP获取IP参数,需调用DHCP子函数*/ if(ip_from==IP_FROM_DHCP) { /*复制DHCP获取的配置信息到配置结构体*/ if(dhcp_ok==1) { //printf(" IP from DHCP\r\n"); memcpy(ConfigMsg.lip,DHCP_GET.lip, 4); memcpy(ConfigMsg.sub,DHCP_GET.sub, 4); memcpy(ConfigMsg.gw,DHCP_GET.gw, 4); memcpy(ConfigMsg.dns,DHCP_GET.dns,4); } else { //printf(" DHCP子程序未运行,或者不成功\r\n"); //printf(" 使用定义的IP信息配置W5500\r\n"); } } /*以下配置信息,根据需要选用*/ ConfigMsg.sw_ver[0]=FW_VER_HIGH; ConfigMsg.sw_ver[1]=FW_VER_LOW; /*将IP配置信息写入W5500相应寄存器*/ setSUBR(ConfigMsg.sub); setGAR(ConfigMsg.gw); setSIPR(ConfigMsg.lip); getSIPR (local_ip); //printf(" W5500 IP地址 : %d.%d.%d.%d\r\n", local_ip[0],local_ip[1],local_ip[2],local_ip[3]); getSUBR(subnet); //printf(" W5500 子网掩码 : %d.%d.%d.%d\r\n", subnet[0],subnet[1],subnet[2],subnet[3]); getGAR(gateway); //printf(" W5500 网关 : %d.%d.%d.%d\r\n", gateway[0],gateway[1],gateway[2],gateway[3]); } /** *@brief 配置W5500的MAC地址 *@param 无 *@return 无 */ void set_w5500_mac(void) { memcpy(ConfigMsg.mac, mac, 6); setSHAR(ConfigMsg.mac); /**/ memcpy(DHCP_GET.mac, mac, 6); } /** *@brief 配置W5500的GPIO接口 *@param 无 *@return 无 */ void gpio_for_w5500_config(void) { #ifdef DEMO_W5500 //add by Gavin GPIO_InitTypeDef GPIO_InitStructure; SPI_FLASH_Init(); /*初始化STM32 SPI接口*/ RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB|RCC_APB2Periph_GPIOC|RCC_APB2Periph_GPIOE|RCC_APB2Periph_GPIOG, ENABLE); /*使用SPI1*/ #ifdef STM32_SPI1 /*定义RESET引脚*/ GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0; /*选择要控制的GPIO引脚*/ GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; /*设置引脚速率为50MHz*/ GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; /*设置引脚模式为通用推挽输出*/ GPIO_Init(GPIOC, &GPIO_InitStructure); /*调用库函数,初始化GPIO*/ GPIO_SetBits(GPIOC, GPIO_Pin_0); /*定义INT引脚*/ GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1; /*选择要控制的GPIO引脚*/ GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; /*设置引脚速率为50MHz */ GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU; /*设置引脚模式为通用推挽模拟上拉输入*/ GPIO_Init(GPIOC, &GPIO_InitStructure); /*调用库函数,初始化GPIO*/ #endif /*使用SPI2*/ #ifdef STM32_SPI2 /*定义RESET引脚*/ GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9; /*选择要控制的GPIO引脚*/ GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; /*设置引脚速率为50MHz*/ GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; /*设置引脚模式为通用推挽输出*/ GPIO_Init(GPIOB, &GPIO_InitStructure); /*调用库函数,初始化GPIO*/ GPIO_SetBits(GPIOB, GPIO_Pin_9); /*定义INT引脚*/ GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6; /*选择要控制的GPIO引脚*/ GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; /*设置引脚速率为50MHz */ GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU; /*设置引脚模式为通用推挽模拟上拉输入*/ GPIO_Init(GPIOC, &GPIO_InitStructure); /*调用库函数,初始化GPIO*/ #endif #else GPIO_InitTypeDef GPIO_InitStruct = {0}; GPIO_InitStruct.Pin = W5500_CS_PIN; GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP; GPIO_InitStruct.Pull = GPIO_NOPULL; GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH; HAL_GPIO_Init(W5500_CS_PORT, &GPIO_InitStruct); #endif } /** *@brief W5500片选信号设置函数 *@param val: 为“0”表示片选端口为低,为“1”表示片选端口为高 *@return 无 */ void wiz_cs(uint8_t val) { #ifdef DEMO_W5500 //add by Gavin #ifdef STM32_SPI1 if (val == LOW) { GPIO_ResetBits(GPIOA, GPIO_Pin_4); } else if (val == HIGH) { GPIO_SetBits(GPIOA, GPIO_Pin_4); } #endif #ifdef STM32_SPI2 if (val == LOW) { GPIO_ResetBits(GPIOB, GPIO_Pin_12); } else if (val == HIGH) { GPIO_SetBits(GPIOB, GPIO_Pin_12); } #endif #else if (val == LOW) { RESET_W5500_CS;//GPIO_ResetBits(GPIOB, GPIO_Pin_12); } else if (val == HIGH) { SET_W5500_CS;//GPIO_SetBits(GPIOB, GPIO_Pin_12); } #endif } /** *@brief 设置W5500的片选端口SCSn为低 *@param 无 *@return 无 */ void iinchip_csoff(void) { wiz_cs(LOW); } /** *@brief 设置W5500的片选端口SCSn为高 *@param 无 *@return 无 */ void iinchip_cson(void) { wiz_cs(HIGH); } /* 2019.12.04 实测1ms; 环境:主频168MHz,关闭中断,IO取反用示波器测试!! */ void w5500_delay_ms( unsigned short time ) { unsigned short i = 0; while( time-- ){ i = 33400; while( i-- ); } } /** *@brief W5500复位设置函数 *@param 无 *@return 无 */ void reset_w5500(void) { #ifdef DEMO_W5500 //add by Gavin #ifdef STM32_SPI1 GPIO_ResetBits(GPIOC, GPIO_Pin_0); delay_us(2); GPIO_SetBits(GPIOC, GPIO_Pin_0); delay_ms(1600); #endif #ifdef STM32_SPI2 GPIO_ResetBits(GPIOB, GPIO_Pin_9); delay_us(2); GPIO_SetBits(GPIOB, GPIO_Pin_9); delay_ms(1600); #endif #endif if( get_hard_flag() ==0){ //200S_V3 w5500 RST-PA8 GPIO_InitTypeDef GPIO_InitStruct = {0}; GPIO_InitStruct.Pin = GPIO_PIN_8; GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP; GPIO_InitStruct.Pull = GPIO_NOPULL; GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH; HAL_GPIO_Init(GPIOA, &GPIO_InitStruct); // HAL_GPIO_WritePin(GPIOA, GPIO_PIN_8, GPIO_PIN_RESET); w5500_delay_ms(50); HAL_GPIO_WritePin(GPIOA, GPIO_PIN_8, GPIO_PIN_SET); w5500_delay_ms(50); } } /** *@brief STM32 SPI1读写8位数据 *@param dat:写入的8位数据 *@return 无 */ uint8 IINCHIP_SpiSendData(uint8 dat) { #ifdef DEMO_W5500 //add by Gavin return(SPI_FLASH_SendByte(dat)); #else unsigned char rxdata; HAL_SPI_TransmitReceive(&hspi3,&dat,&rxdata,1,100); return rxdata; #endif } /** *@brief 写入一个8位数据到W5500 *@param addrbsb: 写入数据的地址 *@param data:写入的8位数据 *@return 无 */ void IINCHIP_WRITE( uint32 addrbsb, uint8 data) { iinchip_csoff(); IINCHIP_SpiSendData( (addrbsb & 0x00FF0000)>>16); IINCHIP_SpiSendData( (addrbsb & 0x0000FF00)>> 8); IINCHIP_SpiSendData( (addrbsb & 0x000000F8) + 4); IINCHIP_SpiSendData(data); iinchip_cson(); } /** *@brief 从W5500读出一个8位数据 *@param addrbsb: 写入数据的地址 *@param data:从写入的地址处读取到的8位数据 *@return 无 */ uint8 IINCHIP_READ(uint32 addrbsb) { uint8 data = 0; iinchip_csoff(); IINCHIP_SpiSendData( (addrbsb & 0x00FF0000)>>16); IINCHIP_SpiSendData( (addrbsb & 0x0000FF00)>> 8); IINCHIP_SpiSendData( (addrbsb & 0x000000F8)) ; data = IINCHIP_SpiSendData(0x00); iinchip_cson(); return data; } /** *@brief 向W5500写入len字节数据 *@param addrbsb: 写入数据的地址 *@param buf:写入字符串 *@param len:字符串长度 *@return len:返回字符串长度 */ uint16 wiz_write_buf(uint32 addrbsb,uint8* buf,uint16 len) { uint16 idx = 0; if(len == 0){ //printf(" Unexpected2 length 0\r\n"); } iinchip_csoff(); IINCHIP_SpiSendData( (addrbsb & 0x00FF0000)>>16); IINCHIP_SpiSendData( (addrbsb & 0x0000FF00)>> 8); IINCHIP_SpiSendData( (addrbsb & 0x000000F8) + 4); for(idx = 0; idx < len; idx++) { IINCHIP_SpiSendData(buf[idx]); } iinchip_cson(); return len; } /** *@brief 从W5500读出len字节数据 *@param addrbsb: 读取数据的地址 *@param buf:存放读取数据 *@param len:字符串长度 *@return len:返回字符串长度 */ uint16 wiz_read_buf(uint32 addrbsb, uint8* buf,uint16 len) { uint16 idx = 0; if(len == 0) { //printf(" Unexpected2 length 0\r\n"); } iinchip_csoff(); IINCHIP_SpiSendData( (addrbsb & 0x00FF0000)>>16); IINCHIP_SpiSendData( (addrbsb & 0x0000FF00)>> 8); IINCHIP_SpiSendData( (addrbsb & 0x000000F8)); for(idx = 0; idx < len; idx++) { buf[idx] = IINCHIP_SpiSendData(0x00); } iinchip_cson(); return len; } /** *@brief 写配置信息到EEPROM *@param 无 *@return 无 */ void write_config_to_eeprom(void) { #ifdef DEMO_W5500 //add by Gavin uint16 dAddr=0; ee_WriteBytes(ConfigMsg.mac,dAddr,(uint8)EEPROM_MSG_LEN); delay_ms(10); #endif } /** *@brief 从EEPROM读配置信息 *@param 无 *@return 无 */ void read_config_from_eeprom(void) { #ifdef DEMO_W5500 //add by Gavin ee_ReadBytes(EEPROM_MSG.mac,0,EEPROM_MSG_LEN); delay_us(10); #endif } /** *@brief STM32定时器2初始化 *@param 无 *@return 无 */ void timer2_init(void) { #ifdef DEMO_W5500 //add by Gavin TIM2_Configuration(); /* TIM2 定时配置 */ TIM2_NVIC_Configuration(); /* 定时器的中断优先级 */ RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2 , ENABLE); /* TIM2 重新开时钟,开始计时 */ #endif } /** *@brief dhcp用到的定时器初始化 *@param 无 *@return 无 */ void dhcp_timer_init(void) { timer2_init(); } /** *@brief ntp用到的定时器初始化 *@param 无 *@return 无 */ void ntp_timer_init(void) { timer2_init(); } /** *@brief 定时器2中断函数 *@param 无 *@return 无 */ #ifdef DEMO_W5500 //add by Gavin void timer2_isr(void) { ms++; if(ms>=1000) { ms=0; dhcp_time++; /*DHCP定时加1S*/ #ifndef __NTP_H__ ntptimer++; /*NTP重试时间加1S*/ #endif } } #else void timer2_isr(void) { //called by 20ms if(++ms>=50) { ms=0; dhcp_time++; /*DHCP定时加1S*/ #ifndef __NTP_H__ ntptimer++; /*NTP重试时间加1S*/ #endif } } #endif /** *@brief STM32系统软复位函数 *@param 无 *@return 无 */ void reboot(void) { #ifdef DEMO_W5500 //add by Gavin pFunction Jump_To_Application; uint32 JumpAddress; //printf(" 系统重启中……\r\n"); JumpAddress = *(vu32*) (0x00000004); Jump_To_Application = (pFunction) JumpAddress; Jump_To_Application(); #endif } //----------------------------------- NEXT add by Gavin ---------------------------------------------------------------- //see BASE protocol 5.2.9 TCPIP struct tcpip_STR{ unsigned char ip_addr[4]; unsigned char mac_addr[6]; unsigned char subnet_mask[4]; unsigned char gateway[4]; #define IP_ADDR_LEN 4 #define MAC_ADDR_LEN 6 #define SUBNET_ADDR_LEN 4 #define GATEWAY_ADDR_LEN 4 }; struct tcpip_STR tcp_ip; #define STORE_IP_ADDR 0x120 //len=4+1 #define STORE_MAC_ADDR 0x128 //len=6+1 #define STORE_SUBNET_ADDR 0x130 //len=4+1 #define STORE_GATEWAY_ADDR 0x138 //len=4+1 #define W5500_STORE_FLAG 0x5A //-------------------------------------------------------------------- static void w5500_set_mac_addr(void){ memcpy(ConfigMsg.mac,tcp_ip.mac_addr, 6);// memcpy(ConfigMsg.mac, mac, 6); setSHAR(ConfigMsg.mac); } static void w5500_set_ip_addr(void){ memcpy(ConfigMsg.lip,tcp_ip.ip_addr,4); setSIPR(ConfigMsg.lip); } static void w5500_set_sub_addr(void){ memcpy(ConfigMsg.sub,tcp_ip.subnet_mask,4); setSUBR(ConfigMsg.sub); } static void w5500_set_getway_addr(void){ memcpy(ConfigMsg.gw,tcp_ip.gateway,4); setGAR(ConfigMsg.gw); } /* 设置w5500的网络参数!!! */ static void setting_w5500_parameter(void) { memcpy(ConfigMsg.mac,tcp_ip.mac_addr, 6);// memcpy(ConfigMsg.mac, mac, 6); setSHAR(ConfigMsg.mac); /**/ memcpy(DHCP_GET.mac, tcp_ip.mac_addr, 6);// memcpy(DHCP_GET.mac, mac, 6); //复制定义的配置信息到配置结构体/ memcpy(ConfigMsg.mac, tcp_ip.mac_addr, 6); memcpy(ConfigMsg.lip,tcp_ip.ip_addr,4); memcpy(ConfigMsg.sub,tcp_ip.subnet_mask,4); memcpy(ConfigMsg.gw,tcp_ip.gateway,4); memcpy(ConfigMsg.dns,dns_server,4); /*将IP配置信息写入W5500相应寄存器*/ setSUBR(ConfigMsg.sub); setGAR(ConfigMsg.gw); setSIPR(ConfigMsg.lip); } /* #define STORE_IP_ADDR 0x120 //len=4+1 #define STORE_MAC_ADDR 0x128 //len=6+1 #define STORE_SUBNET_ADDR 0x130 //len=4+1 #define STORE_GATEWAY_ADDR 0x138 //len=4+1 * 处理来自sdk/PC的配置参数信息 */ void _0x61_tcpip_sub(const unsigned char *rxpc) { unsigned char ack_buf[32],ack_len,wtmp[8]; unsigned char op_flag =0; switch(rxpc[4]){ case 2: memcpy(tcp_ip.ip_addr,rxpc+5,IP_ADDR_LEN); w5500_set_ip_addr();// memcpy(wtmp+1,tcp_ip.ip_addr,IP_ADDR_LEN); wtmp[0] =W5500_STORE_FLAG; platform.e2prom_write(STORE_IP_ADDR,wtmp,IP_ADDR_LEN+1); case 1: //read ip addr ack_buf[0] =1; memcpy(ack_buf+1,tcp_ip.ip_addr,IP_ADDR_LEN); ack_len =IP_ADDR_LEN; op_flag =1; break; case 4: memcpy(tcp_ip.mac_addr,rxpc+5,MAC_ADDR_LEN); w5500_set_mac_addr();// memcpy(wtmp+1,tcp_ip.mac_addr,MAC_ADDR_LEN); wtmp[0] =W5500_STORE_FLAG; platform.e2prom_write(STORE_MAC_ADDR,wtmp,MAC_ADDR_LEN+1); case 3: //read mac_addr addr ack_buf[0] =3; memcpy(ack_buf+1,tcp_ip.mac_addr,MAC_ADDR_LEN); ack_len =MAC_ADDR_LEN; op_flag =1; break; case 6: memcpy(tcp_ip.subnet_mask,rxpc+5,SUBNET_ADDR_LEN); w5500_set_sub_addr(); memcpy(wtmp+1,tcp_ip.subnet_mask,SUBNET_ADDR_LEN); wtmp[0] =W5500_STORE_FLAG; platform.e2prom_write(STORE_SUBNET_ADDR,wtmp,SUBNET_ADDR_LEN+1); case 5: //read subnet_mask addr ack_buf[0] =5; memcpy(ack_buf+1,tcp_ip.subnet_mask,SUBNET_ADDR_LEN); ack_len =SUBNET_ADDR_LEN; op_flag =1; break; case 8: memcpy(tcp_ip.gateway,rxpc+5,GATEWAY_ADDR_LEN); w5500_set_getway_addr(); memcpy(wtmp+1,tcp_ip.gateway,GATEWAY_ADDR_LEN); wtmp[0] =W5500_STORE_FLAG; platform.e2prom_write(STORE_GATEWAY_ADDR,wtmp,GATEWAY_ADDR_LEN+1); case 7: //read gateway addr ack_buf[0] =7; memcpy(ack_buf+1,tcp_ip.gateway,GATEWAY_ADDR_LEN); ack_len =GATEWAY_ADDR_LEN; op_flag =1; break; default:break; }//sw if(op_flag){ user__pc_cmd_ack(0x61,12,ack_buf,ack_len+1); } } /* * 从E2prom中的指定位置读取W5500的参数,用于上电初始化 * 初始化设置W5500 : setting parameter; */ static void read_w5500_parameter(void) { unsigned char tmp[8]; //12 TCP IP settting //ip platform.e2prom_read(STORE_IP_ADDR,tmp,IP_ADDR_LEN+1); if(tmp[0] ==W5500_STORE_FLAG ){ memcpy(tcp_ip.ip_addr,tmp+1,IP_ADDR_LEN); } else{ tcp_ip.ip_addr[0] = 192; tcp_ip.ip_addr[1] = 168; tcp_ip.ip_addr[2] = 0; tcp_ip.ip_addr[3] = 12; } //mac platform.e2prom_read(STORE_MAC_ADDR,tmp,MAC_ADDR_LEN+1); if( tmp[0] ==W5500_STORE_FLAG ){ memcpy(tcp_ip.mac_addr,tmp+1,MAC_ADDR_LEN); } else{ tcp_ip.mac_addr[0] = 0x00; tcp_ip.mac_addr[1] = 0x08; tcp_ip.mac_addr[2] = 0xdc; tcp_ip.mac_addr[3] = 0x11; tcp_ip.mac_addr[4] = 0x11; tcp_ip.mac_addr[5] = 0x11; } //subnet platform.e2prom_read(STORE_SUBNET_ADDR,tmp,SUBNET_ADDR_LEN+1); if(tmp[0] == W5500_STORE_FLAG ){ memcpy(tcp_ip.subnet_mask,tmp+1,SUBNET_ADDR_LEN); } else{ tcp_ip.subnet_mask[0] = 255; tcp_ip.subnet_mask[1] = 255; tcp_ip.subnet_mask[2] = 255; tcp_ip.subnet_mask[3] = 0; } //gateway platform.e2prom_read(STORE_GATEWAY_ADDR,tmp,GATEWAY_ADDR_LEN+1); if(tmp[0] ==W5500_STORE_FLAG ){ memcpy(tcp_ip.gateway,tmp+1,GATEWAY_ADDR_LEN); } else{ tcp_ip.gateway[0] = 200; tcp_ip.gateway[1] = 200; tcp_ip.gateway[2] = 100; tcp_ip.gateway[3] = 1; } } /* * 初始化W5500 * 初始化io控制; rest ; setting ip mac。。。 */ void w5500_init(void) { if( !function.TCPIP__SW) return ; gpio_for_w5500_config(); /*初始化MCU相关引脚*/ reset_w5500(); /*硬复位W5500*/ //useing to test spi communication;add by Gavin //w5500_ver = IINCHIP_READ(VERSIONR); // PHY_check(); /*检查网线是否接入*/ // set_w5500_mac(); /*配置MAC地址*/ // set_w5500_ip(); /*配置IP地址*/ read_w5500_parameter(); setting_w5500_parameter();// socket_buf_init(txsize, rxsize); /*初始化8个Socket的发送接收缓存大小*/ }