一、测试平台:凌跃智能奋斗者开发板

二、测试芯片: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);  // 发送引脚初始化 TXgpio_init(GPIOA, GPIO_MODE_IN_FLOATING, GPIO_OSPEED_50MHZ, GPIO_PIN_10);  // 接收引脚初始化  RXusart_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)));
#endifSSIZE[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奋斗者开发板W5500通信——01 基础移植相关推荐

  1. 嵌入式开发板CAN通信编程——伺服电机驱动

    嵌入式开发板CAN通信编程--伺服电机驱动 在实际的嵌入式项目开发过程中,若不涉及上位机与开发板的通信传输数据,那最关键的无非就是两个内容,读取传感器的数据并处理,驱动硬件设备工作.传感器数据的读取内 ...

  2. NUC980开发板Linux系统EC20模块 移植 串口 PPP拨号

    NUC980开发板Linux系统EC20模块 移植 串口 PPP拨号 1. EC20模块连接 2. Linux内核配置 3. 交叉编译PPP 4. 拨号脚本 5. 进行拨号 1. EC20模块连接 在 ...

  3. 2012 12 02 FL2440开发板的U-boot-2010.09版本移植(二)片上系统SoC初始化移植

    -------------------------------------------------------- 在"<2012 10 02> FL2440开发板的U-boot- ...

  4. Linux移植:正点原子阿尔法IMX6ULL开发板Linux内核源码移植详细步骤(4.1.15版本内核)

    Linux移植:正点原子阿尔法IMX6ULL开发板Linux内核源码移植详细步骤(4.1.15版本内核) 文章目录 Linux移植:正点原子阿尔法IMX6ULL开发板Linux内核源码移植详细步骤(4 ...

  5. esp8266与mega2560开发板串口通信

    使用的是esp8266 nodemcu和mega2560开发板 mega2560连接esp8266的目的是:实现开发板网络通信. 它们的通信方式为串口通信,esp8266通过串口(RX.TX)将数据发 ...

  6. m5stack——基于语音交互模块的物联居家管理系统 (STM32F103ZET6开发板+UART通信)

    前言:本项目为基于m5stack的校园物联网竞赛项目,以工程应用为主,不涉及前沿技术,期与大家共享. 1.产品功能 本产品是基于语音交互的物联家居管理系统.通过存入.处理.确认.保存.上传.反馈.分析 ...

  7. linux开发板蓝牙连接,开发板蓝牙通信问题,有这方面经验的请进

    该楼层疑似违规已被系统折叠 隐藏此楼查看此楼 我的板子是fl2440,系统版本2.6.12 主机是红帽5,各项服务都有开. [root@bogon ~]# hciconfig hci0: Type: ...

  8. 嵌入式linux蓝牙通讯,开发板蓝牙通信问题,有这方面经验的请进

    该楼层疑似违规已被系统折叠 隐藏此楼查看此楼 我的板子是fl2440,系统版本2.6.12 主机是红帽5,各项服务都有开. [root@bogon ~]# hciconfig hci0: Type: ...

  9. 黑金AX301开发板SPI通信详解

    前言: 对黑金的AX301开发板的SPI工程进行了波形仿真,写一下自己的理解. 背景: 项目地址: https://download.csdn.net/download/a792544191/1287 ...

最新文章

  1. 计算机基本知识培训稿,计算机基础知识培训稿.doc
  2. N - Tram POJ - 1847
  3. 运维-系统架构师经验总结:
  4. 【NLP】经典分类模型朴素贝叶斯解读
  5. linux vim编译命令行,LINUX VIM编译器常用命令总结
  6. python迭代法求解非线性方程_荐【数学知识】非线性方程求解的二分法以及牛顿迭代法...
  7. IT 企业稿阿米巴 失败
  8. rcp rapido_Rapido使用数据改善乘车调度
  9. java aes pbe_JAVA对称加密算法PBE定义与用法实例分析
  10. adb shell常用命令收录
  11. C#实现HttpUtility.UrlEncode输出大写字母
  12. Android---真机调试时不能识别手机的解决方案
  13. 你专属的程序员春节“大礼包”
  14. 基于pytorch卷积人脸表情识别--毕业设计
  15. ADA4939 ADA4930
  16. JavaScript系列(一):浏览器及内核介绍
  17. html5是什么语言,html5 css3是什么?
  18. UDP通信——使用python实现简单的UDP通信
  19. centos7安装pip
  20. 视频教程- 办公三部曲—零基础学WORD教程-Office/WPS

热门文章

  1. 征服统计学09|统计学里的p值有何意义
  2. SVN操作提示被锁定-清理命令Clean up
  3. 数据结构-二叉树入门Go语言实现
  4. 计算机专业的在职考研,2019年深造北京航空航天大学在职研究生计算机专业在职考研科目是什么...
  5. 谈一谈Coders Programmer Developer的区别
  6. Mac OS系统使用笔记
  7. _【超详细指北】python大作业!
  8. HCSA-03 Hillstone系统管理员分类、配置文件信息、版本升级、恢复出厂设置、许可证
  9. DirectX函数归纳总结
  10. 目标检测:EfficientDet(官方开源版)训练自己的数据