一、测试平台:凌跃智能奋斗者开发板 二、测试芯片:GD32F103ZET6+W5500 三、测试目的: 以太网通信,利用GD芯片驱动W5500芯片与电脑主机进行网络通信。 四、测试方法 使用网线将开发板和电脑主机网口直连到一起,或者通过路由器连接到一起,电脑的IP地址修改成为固定的IP:192.168.239.28,默认网关修改成为:192.168.239.1,开发板的IP地址修改为192.168.239.88,开发板下载程序并复位,在电脑dos窗口ping 192.168.239.88,可以正常ping通,同时串口助手可以相关的配置信息。 五、程序说明 1、系统时钟设置,在本例程中,将系统时钟设置为72Mhz。
#define __SYSTEM_CLOCK_72M_PLL_HXTAL (uint32_t)(72000000)
2、配置串口,监控网络配置信息,只写了比较重要的核心部分,还有一些代码根据自己需要写
void USART0_Config(void)
{
rcu_periph_clock_enable(RCU_GPIOA);
rcu_periph_clock_enable(RCU_USART0);
gpio_init(GPIOA, GPIO_MODE_AF_PP, GPIO_OSPEED_50MHZ, GPIO_PIN_9);
gpio_init(GPIOA, GPIO_MODE_IN_FLOATING, GPIO_OSPEED_50MHZ, GPIO_PIN_10);
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协议内容比较多,这里接不一一列举了。
void i2c_CfgGpio(void)
{
rcu_periph_clock_enable(RCC_I2C_PORT);
gpio_init(GPIO_PORT_I2C, GPIO_MODE_OUT_PP, GPIO_OSPEED_50MHZ, I2C_SCL_PIN | I2C_SDA_PIN);
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);
gpio_init(WIZ_SPIx_GPIO_PORT, GPIO_MODE_AF_PP, GPIO_OSPEED_50MHZ, WIZ_SPIx_SCLK);
gpio_init(WIZ_SPIx_GPIO_PORT, GPIO_MODE_AF_PP, GPIO_OSPEED_50MHZ, WIZ_SPIx_MISO);
gpio_init(WIZ_SPIx_GPIO_PORT, GPIO_MODE_AF_PP, GPIO_OSPEED_50MHZ, WIZ_SPIx_MOSI);
gpio_init(WIZ_SPIx_SCS_PORT, GPIO_MODE_OUT_PP, GPIO_OSPEED_50MHZ, WIZ_SPIx_SCS);
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_init(SPI1, &spi_init_struct);
spi_enable(SPI1);
gpio_init(WIZ_SPIx_RESET_PORT, GPIO_MODE_OUT_PP, GPIO_OSPEED_50MHZ, WIZ_RESET);
gpio_bit_set(WIZ_SPIx_RESET_PORT, WIZ_RESET);
gpio_init(WIZ_SPIx_INT_PORT, GPIO_MODE_IPU, GPIO_OSPEED_50MHZ, WIZ_INT);
}
#define WIZ_SPIx_GPIO_PORT GPIOB
#define WIZ_SPIx_GPIO_CLK RCU_GPIOB
#define WIZ_SPIx SPI1
#define WIZ_SPIx_CLK_CMD RCC_APB1PeriphClockCmd
#define WIZ_SPIx_CLK RCU_SPI1
#define WIZ_SPIx_SCLK GPIO_PIN_13
#define WIZ_SPIx_MISO GPIO_PIN_14
#define WIZ_SPIx_MOSI GPIO_PIN_15
#define WIZ_SPIx_SCS GPIO_PIN_9
#define WIZ_SPIx_SCS_PORT GPIOG
#define WIZ_SPIx_SCS_CLK RCU_GPIOG
#define WIZ_RESET GPIO_PIN_15
#define WIZ_SPIx_RESET_PORT GPIOG
#define WIZ_SPIx_RESET_CLK RCU_GPIOG
#define WIZ_INT GPIO_PIN_8
#define WIZ_SPIx_INT_PORT GPIOG
#define WIZ_SPIx_INT_CLK RCU_GPIOG
5、复位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地址等信息。
uint8 mac[6]={0x00,0x08,0xdc,0x11,0x11,0x11};
void set_w5500_mac(void)
{
memcpy(ConfigMsg.mac, mac, 6);
setSHAR(ConfigMsg.mac);
memcpy(DHCP_GET.mac, mac, 6);
}
7、定义并配置开发板的IP信息,注意和电脑在同一网段。
uint8 local_ip[4] ={192,168,239,88};
uint8 subnet[4] ={255,255,255,0};
uint8 gateway[4] ={169,168,239,1};
uint8 dns_server[4]={114,114,114,114};
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");
if(ip_from==IP_FROM_EEPROM)
{
read_config_from_eeprom();
if( *(EEPROM_MSG.mac)==0x00&& *(EEPROM_MSG.mac+1)==0x08&&*(EEPROM_MSG.mac+2)==0xdc)
{
printf(" IP from EEPROM\r\n");
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();
}
}
if(ip_from==IP_FROM_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;
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++)
{
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、主函数
void System_Init(void)
{
systick_config();
USART0_Config();
i2c_CfgGpio();
printf(" 凌跃奋斗者全功能板 网络初始化 Demo V1.0 \r\n");
gpio_for_w5500_config();
reset_w5500();
set_w5500_mac();
set_w5500_ip();
socket_buf_init(txsize, rxsize);
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以太网通信涉及的函数太多,这里只列举了一些比较核心的几个函数,方便大家参考学习。代码都是买完开发板,凌智君指导调试的,测试没有问题。
taobao链接: https://item.taobao.com/item.htm?spm=a1z10.5-c.w4002-13627328884.21.525f550a2aLpuz&id=682013846604
|