GD32E503Vxx SPI W5500通信

国产替代和ETH网关开发,用到了GD32E503Vxx和W5500,首先在W5500 Evaluation board V1.0上,也就是基于STM32F103RCT6的评估板上,移植了DHCP,DNS,MQTT等功能,跑起来很顺利。后续移植到GD32E503VET6自己的板卡上,出现了奇怪的问题。上电配置后,dhcp发送的数据抓包根本看不到,所以收到的llen = getSn_RX_RSR(SOCK_DHCP)一直是0,而跳过dhcp,配置个默认的ip,直接跑后面的dns和mqtt,完全没有问题,这个问题折腾了我快一周,仔细查找问题,原来问题真的是让人意想不到。

先贴GD32E503VET6上SPI的配置吧,我是用的SPI1,要使能复用时钟RCU_AF。

 SPI GPIO 初始化:

SPI1初始化:

 

main函数初始化,不执行复位 ,由于跑了Freertos,所以等系统跑起来默认状态后进行硬件复位和初步的配置。

 

配置好spi,上电后可以先写mac和读mac验证SPI通信是否正常。 

初始上电状态的复位和配置:

下面,重头戏来了:

DHCP_Run ()函数 ,发现运行DHCP时发送DISCOVER报文,抓不到包,说明数据没有发送成功,要么发送成功后数据是异常的,wireshark没法正确解析,

仿真慢慢跟吧,看是哪里出的问题,毕竟同样的程序和驱动,在ST上跑的没问题。

最后发现在send_DHCP_DISCOVER()函数出现问题,下面贴代码:

先贴ST的:

乍一看就是个结构体和数组赋值,没啥高级的骚操作啊,仿真就看出问题了,在GD平台上运行时, 在执行pDHCPMSG->OPT[k++] = strlen((char*)host_name)后,惊奇的是数组索引k变成了0,等于后续赋值又是从0开始,把前面的数据覆盖了。这个问题真是奇葩。。。。

然后贴GD改之后的代码:

 红色是修改后的,既然你算不过来把k清零了,那我再定义个变量,在strlen之前备份一下,strlen之后再把备份值还给K。

完美,抓包可以收到报文了:

 同理,在DHCP所需要发送的报文中,还有send_DHCP_REQUEST函数也要改一下,同样的改法,就不贴图和代码了,然后都改好之后,编译下载:

wireshark上抓包的数据有了,再看看程序的串口打印部分:

DHCP和后续功能全部正常运行,完美。

那么这个bug,也是比较让人无语的,话说GD32E503VET6 是基于ARM Cortex-M33 内核,我百度了下,相比于STM32F103 的cortex-M3,是个增强版本,但是不知道这个增强在实际应用中却是属于倒退。。。

这个坑,踩的着实让人无语。。。 ̄□ ̄||

这个bug折腾一周,慢慢分析,属于原创,如需转载,请注明出处,谢谢。

  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
### 回答1: gd32e503是一款高性能的单片机芯片。它具有丰富的外设资源,其中包括多个串口接口。 串口是一种通信接口,通过串行的方式将数据传输到目标设备。gd32e503芯片上的串口接口支持多种通信协议,如UART、SPI和I2C等。它们分别用于不同的应用场景。 UART是最常用的串口通信协议之一。gd32e503芯片上具备多个UART接口,可以连接到外部设备,如传感器、显示屏等。通过UART,我们可以实现数据的双向传输,从而完成与外部设备的通信SPI是一种同步串行接口协议,适用于在芯片之间进行高速数据传输。gd32e503芯片上的SPI接口支持主从模式,可以与其他SPI设备进行通信SPI通信速度较快,适用于要求高速传输的场景。 I2C是一种串行通信接口,可以连接多个设备,通过唯一的地址来进行数据传输。gd32e503芯片上的I2C接口可以作为主设备或从设备,与其他I2C设备进行通信。I2C通信方式简单、灵活,适用于连接多个设备的应用场景。 总之,gd32e503串口接口的丰富性能使得它在各种通信场景下都能够灵活应用。不同的串口协议适用于不同的通信需求,可以实现与外部设备的可靠、高效通信。 ### 回答2: gd32e503是一款高性能的串口芯片。该芯片具有强大的功能和稳定的性能,适合于各种串口通信应用。 gd32e503具有多个高速串口接口,支持多种串口协议,如RS232、RS485、UART等。这些接口具有高数据传输速率和低延迟,能够满足高速数据传输的需求。 gd32e503内置了丰富的串口功能模块,包括数据缓冲区、数据校验、错误检测和纠正等。这些功能模块能够提供稳定可靠的数据传输,并保证数据的完整性和准确性。 gd32e503还支持多种串口通信模式,包括全双工和半双工模式。全双工模式可以同时进行发送和接收操作,适用于需要双向通信的应用。半双工模式则通过切换发送和接收操作,实现双向通信,适用于只需要单向通信的应用。 gd32e503还具有低功耗的特点,能够在低功耗模式下工作,并支持低功耗唤醒功能。这样可以有效减少能耗,延长电池寿命,适用于对功耗要求较高的应用。 总之,gd32e503是一款功能强大、性能稳定的串口芯片,适用于各种串口通信应用,能够满足不同场景下的需求。 ### 回答3: GD32E503是一款高性能的串口通信芯片。它采用高性能的ARM Cortex-M4内核,运行主频可达到108MHz,配备了丰富的外设资源,包括多个UART串口接口。 GD32E503的串口功能非常强大,可以满足各种通信需求。它支持多种串口通信模式,包括异步串口通信模式和同步串口通信模式。异步串口通信模式常用于数据传输较少的场景,而同步串口通信模式常用于高速数据传输和实时通信GD32E503内置了多个UART接口,每个UART接口都支持可编程的波特率和数据位数设置,可以满足不同的通信需求。此外,GD32E503还提供了丰富的UART功能配置选项,如奇偶校验、停止位数和数据位数等,以及硬件流控制功能,如RTS/CTS流控制和DTR/DSR流控制,可以提高通信的稳定性和可靠性。 GD32E503的串口接口还支持中断和DMA传输方式,可以极大地提高数据传输的效率。中断方式适用于数据传输较少的情况,而DMA方式适用于数据传输较多和实时性要求较高的情况。 总而言之,GD32E503的串口功能强大且灵活,适用于各种串口通信应用场景。无论是单片机与外部设备的数据交互,还是与其他设备的通信GD32E503的串口都能满足要求,并提供稳定可靠的数据传输。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值