GD32F103ZET6奋斗者开发板W5500通信——01 基础移植

一、测试平台:凌跃智能奋斗者开发板
在这里插入图片描述
二、测试芯片: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。

/* use HXTAL (XD series CK_HXTAL = 8M, CL series CK_HXTAL = 25M) */
//#define __SYSTEM_CLOCK_HXTAL                    (uint32_t)(__HXTAL)
//#define __SYSTEM_CLOCK_24M_PLL_HXTAL            (uint32_t)(24000000)
//#define __SYSTEM_CLOCK_36M_PLL_HXTAL            (uint32_t)(36000000)
//#define __SYSTEM_CLOCK_48M_PLL_HXTAL            (uint32_t)(48000000)
//#define __SYSTEM_CLOCK_56M_PLL_HXTAL            (uint32_t)(56000000)
#define __SYSTEM_CLOCK_72M_PLL_HXTAL            (uint32_t)(72000000)
//#define __SYSTEM_CLOCK_96M_PLL_HXTAL            (uint32_t)(96000000)
//#define __SYSTEM_CLOCK_108M_PLL_HXTAL           (uint32_t)(108000000)

2、配置串口,监控网络配置信息,只写了比较重要的核心部分,还有一些代码根据自己需要写

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以太网通信涉及的函数太多,这里只列举了一些比较核心的几个函数,方便大家参考学习。代码都是买完开发板,凌智君指导调试的,测试没有问题。

taobao链接:
https://item.taobao.com/item.htm?spm=a1z10.5-c.w4002-13627328884.21.525f550a2aLpuz&id=682013846604

GD32F103ZET6开发板PDF原理图+硬件用户手册+软件Demo源码资料,01_Running_LED 02_SysTick_LED 03_USART1_Print 04_USART2_Print 05_I2C_EEPROM 06_SPI_SPI-Flash 07_RTC_Clock 08_EXMC_NandFlash 09_EXMC_TouchScreen 10_ADC_DMA 11_DAC Output Voltage Value 12_SDIO_SDCardTest 13_I2S_Audio Player 14_USB_Custom_HID #include "gd32f10x.h" #include #include "systick.h" /* Private function prototypes -----------------------------------------------*/ void LED_config(void); void Turn_On_LED(uint8_t LED_NUM); /* Private variables ---------------------------------------------------------*/ uint8_t count=0; /* Private functions ---------------------------------------------------------*/ /** * @brief Configure the GPIO ports. * @param None * @retval None */ void LED_config(void) { GPIO_InitPara GPIO_InitStructure; /* Enable GPIOF clock */ RCC_APB2PeriphClock_Enable(RCC_APB2PERIPH_GPIOF, ENABLE); GPIO_InitStructure.GPIO_Pin = GPIO_PIN_0 |GPIO_PIN_1 |GPIO_PIN_2 |GPIO_PIN_3; GPIO_InitStructure.GPIO_Speed = GPIO_SPEED_50MHZ; GPIO_InitStructure.GPIO_Mode = GPIO_MODE_OUT_PP; GPIO_Init(GPIOF,&GPIO_InitStructure); GPIO_ResetBits(GPIOF, GPIO_PIN_0 |GPIO_PIN_1 |GPIO_PIN_2 |GPIO_PIN_3); } /** * @brief Light the LEDs. * @param LED_NUM:LEDx where x can be 2..5. * @retval None */ void Turn_On_LED(uint8_t LED_NUM) { switch(LED_NUM) { /* Light the LED2 */ case 0: GPIO_SetBits(GPIOF,GPIO_PIN_0); break; /* Light the LED3 */ case 1: GPIO_SetBits(GPIOF,GPIO_PIN_1); break; /* Light the LED4 */ case 2: GPIO_SetBits(GPIOF,
<think>好的,我现在需要帮用户推荐支持W5500芯片且带网口的开发板。首先,我要回顾用户提供的引用内容。用户提到了GD32F103ZET6奋斗者开发板和STM32F103ZET6+W5500模块的案例。这两个都是基于Cortex-M3/M4的MCU,搭配W5500实现网络通信。 接下来,我需要确定有哪些开发板内置了W5500芯片并带有网口。常见的开发板如树莓派、Arduino通常不直接集成W5500,但可能有扩展模块。不过用户可能更倾向于嵌入式开发板,尤其是MCU类型。 根据引用,GD32F103ZET6奋斗者开发板已经移植W5500,这说明该板子可能支持W5500,但需要确认是否有板载网口。另外,STM32F103ZET6搭配W5500模块,这里可能需要外接模块,但用户希望板载的。所以可能需要寻找集成W5500和RJ45接口的开发板。 然后,考虑市面上常见的方案。例如,WIZnet(W5500的制造商)有自己的评估板,比如WIZ550io或WIZnetio,这些可能直接集成W5500和网口。此外,一些厂商的开发板可能将W5500作为网络接口芯片集成在板上,比如正点原子、野火等的某些型号。 另外,需要检查用户提到的开发板是否有网口。例如,GD32F103ZET6奋斗者开发板可能通过SPI连接W5500模块,但网口是否在板上?或者需要外接模块?如果是外接模块,可能不符合用户的需求。因此,可能需要推荐那些内置W5500并带有RJ45接口的开发板。 可能还需要考虑其他因素,如价格、供货情况、社区支持等。例如,WIZnet的官方开发板可能更可靠,但价格较高;而国产的开发板可能性价比更高,但需要确认兼容性和资料是否充足。 总结可能的推荐:1. WIZnet官方的W5500评估板;2. GD32或STM32系列集成W5500开发板,如奋斗者开发板配合扩展模块;3. 其他厂商如正点原子可能有相关方案,需要具体型号确认。 需要确保推荐的是开发板本身带有W5500和网口,而不是需要额外模块。如果用户提供的引用中的开发板是外接W5500模块,可能需要指出这一点,并推荐真正板载的型号。此外,引用中的代码示例显示复位函数和SPI配置,这可能意味着这些开发板需要自行连接W5500模块,所以需要区分板载和模块化设计。 最后,可能需要建议用户查看具体开发板的硬件手册,确认W5500和网口的存在,或者推荐已知集成这些组件的开发板型号。</think>根据您的需求,以下是几款推荐的支持W5500芯片且带有网口的开发板方案: ### 一、WIZnet官方开发板 1. **W5500-EVB-Pico** - **核心特性**:基于RP2040双核处理器,板载W5500以太网芯片,集成RJ45接口 - **优势**:官方提供完整SDK和例程,支持Arduino/MicroPython开发环境 - **适用场景**:物联网网关、工业控制等TCP/IP通信场景[^1] 2. **WIZ550web** - **特性**:内置W5500+ARM Cortex-M3,自带网页服务器功能 - **接口**:10/100M自适应网口,支持SPI高速通信 - **亮点**:可通过网页直接配置网络参数,适合快速原型开发 ### 二、国产MCU集成方案 1. **GD32F103ZET6奋斗者开发板** - **网络扩展**:通过SPI接口连接W5500模块(需另购),配套提供复位电路和驱动代码 - **示例代码**: ```c // 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); } ``` 2. **STM32F407+W5500核心板** - **配置**:STM32F407VET6+W5500+HR911105A网络滤波器 - **性能**:支持TCP/UDP/HTTP等协议,传输速率可达15Mbps ### 三、模块化解决方案 1. **W5500模块+任意开发板** - **典型组合**:ESP32开发板 + W5500 Ethernet Shield - **成本优势**:模块价格约$5-10,可通过SPI接口快速集成 - **推荐型号**:SeeedStudio的W5500 Ethernet Shield V1.0 ### 选型建议表格 | 型号 | 核心MCU | 网络方案 | 接口类型 | 开发环境 | |--------------------|------------|----------|----------|----------------| | W5500-EVB-Pico | RP2040 | 板载W5500| RJ45 | Arduino/MicroPython | | GD32奋斗者开发板 | GD32F103 | 外接模块 | SPI | Keil MDK | | STM32F407核心板 | STM32F407 | 板载W5500| RJ45 | STM32CubeIDE |
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

凌智君

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值