- void USART0_Config(void)
- {
- rcu_periph_clock_enable(RCU_GPIOA); // 使能GPIO时钟
- rcu_periph_clock_enable(RCU_USART0); // 使能串口时钟
-
- gpio_init(GPIOA, GPIO_MODE_AF_PP, GPIO_OSPEED_50MHZ, GPIO_PIN_9); // 发送引脚初始化 TX
- gpio_init(GPIOA, GPIO_MODE_IN_FLOATING, GPIO_OSPEED_50MHZ, GPIO_PIN_10); // 接收引脚初始化 RX
- usart_deinit(USART0); // 串口复位
- usart_word_length_set(USART0, USART_WL_8BIT); // 字长
- usart_stop_bit_set(USART0, USART_STB_1BIT); // 停止位
- usart_parity_config(USART0, USART_PM_NONE);
- usart_baudrate_set(USART0, 115200U); // 波特率
- usart_receive_config(USART0, USART_RECEIVE_ENABLE); // 接收使能
- usart_transmit_config(USART0, USART_TRANSMIT_ENABLE); // 发送使能
- usart_hardware_flow_rts_config(USART0, USART_RTS_DISABLE);
- usart_hardware_flow_cts_config(USART0, USART_CTS_DISABLE);
- usart_enable(USART0); // 串口使能
- }
3、初始化IIC协议,用于驱动EEPROM,存储数据,IIC协议内容比较多,这里接不一一列举了。
- /************************************************************
- * 函数: i2c_CfgGpio(void)
- * 说明: 引脚初始化
- * 输入: 无
- * 输出: 无
- * 返回值: 无
- * 作者 凌智君
- * 其他: 无
- ************************************************************/
- void i2c_CfgGpio(void)
- {
- rcu_periph_clock_enable(RCC_I2C_PORT); // 初始化 GPIOB 时钟
- gpio_init(GPIO_PORT_I2C, GPIO_MODE_OUT_PP, GPIO_OSPEED_50MHZ, I2C_SCL_PIN | I2C_SDA_PIN); // 初始化 PB6 PB7 为输出模式
- /* 给一个停止信号, 复位I2C总线上的所有设备到待机模式 */
- i2c_Stop();
- }
4、初始化驱动W5500的芯片引脚,同样只写核心部分。
- void gpio_for_w5500_config(void)
- {
- spi_parameter_struct spi_init_struct;
-
- rcu_periph_clock_enable(WIZ_SPIx_RESET_CLK); // 使能时钟
-
- rcu_periph_clock_enable(WIZ_SPIx_INT_CLK); // 使能时钟
-
- rcu_periph_clock_enable(WIZ_SPIx_GPIO_CLK);
-
- rcu_periph_clock_enable(WIZ_SPIx_SCS_CLK);
-
- rcu_periph_clock_enable(RCU_SPI1); // 初始化SPI1时钟
-
- /*!< Configure SPI_FLASH_SPI pins: SCK */
- gpio_init(WIZ_SPIx_GPIO_PORT, GPIO_MODE_AF_PP, GPIO_OSPEED_50MHZ, WIZ_SPIx_SCLK);
- /*!< Configure SPI_FLASH_SPI pins: MISO */
- gpio_init(WIZ_SPIx_GPIO_PORT, GPIO_MODE_AF_PP, GPIO_OSPEED_50MHZ, WIZ_SPIx_MISO);
- /*!< Configure SPI_FLASH_SPI pins: MOSI */
- gpio_init(WIZ_SPIx_GPIO_PORT, GPIO_MODE_AF_PP, GPIO_OSPEED_50MHZ, WIZ_SPIx_MOSI);
-
- /*!< Configure SPI_FLASH_SPI_CS_PIN pin: SPI_FLASH Card CS pin */
- gpio_init(WIZ_SPIx_SCS_PORT, GPIO_MODE_OUT_PP, GPIO_OSPEED_50MHZ, WIZ_SPIx_SCS);
-
- /* SPI configuration */
- spi_init_struct.trans_mode = SPI_TRANSMODE_FULLDUPLEX;
- spi_init_struct.device_mode = SPI_MASTER;
- spi_init_struct.frame_size = SPI_FRAMESIZE_8BIT;
- spi_init_struct.clock_polarity_phase = SPI_CK_PL_HIGH_PH_2EDGE;
- spi_init_struct.nss = SPI_NSS_SOFT;
- spi_init_struct.prescale = SPI_PSC_4;
- spi_init_struct.endian = SPI_ENDIAN_MSB;
-
- // SPI_InitStructure.SPI_CRCPolynomial = 7; // GD 芯片没有定义
-
- spi_init(SPI1, &spi_init_struct);
- spi_enable(SPI1); // 使能SPI1
-
- /*定义RESET引脚*/
- gpio_init(WIZ_SPIx_RESET_PORT, GPIO_MODE_OUT_PP, GPIO_OSPEED_50MHZ, WIZ_RESET);
- gpio_bit_set(WIZ_SPIx_RESET_PORT, WIZ_RESET);
-
- /*定义INT引脚*/
- gpio_init(WIZ_SPIx_INT_PORT, GPIO_MODE_IPU, GPIO_OSPEED_50MHZ, WIZ_INT);
- }
- #define WIZ_SPIx_GPIO_PORT GPIOB /* GPIO端口 */
- #define WIZ_SPIx_GPIO_CLK RCU_GPIOB /* GPIO端口时钟 */
- #define WIZ_SPIx SPI1 /* 定义W5500所用的SPI接口 */
- #define WIZ_SPIx_CLK_CMD RCC_APB1PeriphClockCmd
- #define WIZ_SPIx_CLK RCU_SPI1 /* 定义W5500所用的SPI接口时钟 */
- #define WIZ_SPIx_SCLK GPIO_PIN_13 /* 定义W5500的时钟管脚 */
- #define WIZ_SPIx_MISO GPIO_PIN_14 /* 定义W5500的MISO管脚 */
- #define WIZ_SPIx_MOSI GPIO_PIN_15 /* 定义W5500的MOSI管脚 */
- #define WIZ_SPIx_SCS GPIO_PIN_9 /* 定义W5500的片选管脚 */
- #define WIZ_SPIx_SCS_PORT GPIOG /* GPIO端口 */
- #define WIZ_SPIx_SCS_CLK RCU_GPIOG /* GPIO端口时钟 */
-
- #define WIZ_RESET GPIO_PIN_15 /* 定义W5500的RESET管脚 */
- #define WIZ_SPIx_RESET_PORT GPIOG /* GPIO端口 */
- #define WIZ_SPIx_RESET_CLK RCU_GPIOG /* GPIO端口时钟 */
- #define WIZ_INT GPIO_PIN_8 /* 定义W5500的INT管脚 */
- #define WIZ_SPIx_INT_PORT GPIOG /* GPIO端口 */
- #define WIZ_SPIx_INT_CLK RCU_GPIOG /* GPIO端口时钟 */
5、复位W5500
- /************************************************************
- * 函数: reset_w5500(void)
- * 说明: W5500复位设置函数
- * 输入: 无
- * 输出: 无
- * 返回值: 无
- * 作者 凌智君
- * 其他: 无
- ************************************************************/
- void reset_w5500(void)
- {
- gpio_bit_reset(WIZ_SPIx_RESET_PORT, WIZ_RESET);
- delay_1us(2);
- gpio_bit_set(WIZ_SPIx_RESET_PORT, WIZ_RESET);
- delay_1ms(1600);
- }
6、定义并配置奋斗者开发板的MAC地址等信息。
- /*定义MAC地址,如果多块W5500网络适配板在同一现场工作,请使用不同的MAC地址*/
- uint8 mac[6]={0x00,0x08,0xdc,0x11,0x11,0x11};
- /************************************************************
- * 函数: reset_w5500(void)
- * 说明: 配置W5500的MAC地址
- * 输入: 无
- * 输出: 无
- * 返回值: 无
- * 作者 凌智君
- * 其他: 无
- ************************************************************/
- void set_w5500_mac(void)
- {
- memcpy(ConfigMsg.mac, mac, 6);
- setSHAR(ConfigMsg.mac); /**/
- memcpy(DHCP_GET.mac, mac, 6);
- }
7、定义并配置开发板的IP信息,注意和电脑在同一网段
- /*定义默认IP信息*/
- uint8 local_ip[4] ={192,168,239,88}; /*定义W5500默认IP地址*/
- uint8 subnet[4] ={255,255,255,0}; /*定义W5500默认子网掩码*/
- uint8 gateway[4] ={169,168,239,1}; /*定义W5500默认网关*/
- uint8 dns_server[4]={114,114,114,114}; /*定义W5500默认DNS*/
- uint16 local_port=5000; /*定义本地端口*/
- 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]);
- }
8、初始化Socket发送和接收缓存
- void socket_buf_init( uint8 * tx_size, uint8 * rx_size )
- {
- int16 i;
- int16 ssum=0,rsum=0;
-
- for (i = 0 ; i < MAX_SOCK_NUM; i++) // Set the size, masking and base address of Tx & Rx memory by each channel
- {
- IINCHIP_WRITE( (Sn_TXMEM_SIZE(i)), tx_size[i]);
- IINCHIP_WRITE( (Sn_RXMEM_SIZE(i)), rx_size[i]);
-
- #ifdef __DEF_IINCHIP_DBG__
- printf("tx_size[%d]: %d, Sn_TXMEM_SIZE = %d\r\n",i, tx_size[i], IINCHIP_READ(Sn_TXMEM_SIZE(i)));
- printf("rx_size[%d]: %d, Sn_RXMEM_SIZE = %d\r\n",i, rx_size[i], IINCHIP_READ(Sn_RXMEM_SIZE(i)));
- #endif
- SSIZE[i] = (int16)(0);
- RSIZE[i] = (int16)(0);
-
- if (ssum <= 16384)
- {
- SSIZE[i] = (int16)tx_size[i]*(1024);
- }
- if (rsum <= 16384)
- {
- RSIZE[i]=(int16)rx_size[i]*(1024);
- }
- ssum += SSIZE[i];
- rsum += RSIZE[i];
- }
- }
9、输出配置信息
- printf(" 网络已完成初始化……\r\n");
-
- printf(" 在Dos命令行中输入cmd,之后输入ping %d.%d.%d.%d \r\n",ConfigMsg.lip[0],ConfigMsg.lip[1],ConfigMsg.lip[2],ConfigMsg.lip[3]);
10、主函数
- /************************************************************
- * 函数: System_Init(void)
- * 说明: 系统初始化
- * 输入: 无
- * 输出: 无
- * 返回值: 无
- * 作者 凌智君
- * 其他: 无
- ************************************************************/
- void System_Init(void)
- {
- systick_config(); // 系统主频72MHZ,采用外部晶振
-
- USART0_Config(); // 串口初始化
-
- i2c_CfgGpio(); // 初始化IIC引脚
-
- printf(" 凌跃奋斗者全功能板 网络初始化 Demo V1.0 \r\n");
- gpio_for_w5500_config(); /*初始化MCU相关引脚*/
-
- reset_w5500(); /*硬复位W5500*/
-
- set_w5500_mac(); /*配置MAC地址*/
-
- set_w5500_ip(); /*配置IP地址*/
-
- socket_buf_init(txsize, rxsize); /*初始化8个Socket的发送接收缓存大小*/
-
- printf(" 网络已完成初始化……\r\n");
-
- printf(" 在Dos命令行中输入cmd,之后输入ping %d.%d.%d.%d \r\n",ConfigMsg.lip[0],ConfigMsg.lip[1],ConfigMsg.lip[2],ConfigMsg.lip[3]);
-
- }
因为W5500以太网通信涉及的函数太多,这里只列举了一些比较核心的几个函数,方便大家参考学习。代码都是买完开发板,凌智君指导调试的,测试没有问题。