打印

请教GD32F107 以太网half-duplex 模式异常、full-duplex模式正常

[复制链接]
3273|13
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
workmanxxx|  楼主 | 2022-7-26 17:02 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 workmanxxx 于 2022-7-26 17:09 编辑

大佬们,请教一下GD32F107这颗芯片的以太网问题。同一版本PCB,一个板用STM32F107,另一个用GD32F107,使用STM32F107的各个模式下都能正常工作(10M、100M、单工及双工模式)。使用GD32F107的双工模式下10M和100M都能正常工作,当使用单工模式下10M和100M都无法正常工作了。
请问大家都是否遇到过这样的问题,是芯片问题还是配置不到位导致?

      
      下载视频         



使用特权

评论回复
沙发
workmanxxx|  楼主 | 2022-7-27 10:28 | 只看该作者
咋没人碰到过这现象吗?大佬们有没有兆易的技术支持的联系方式,想去请教一下他们呢。

使用特权

评论回复
板凳
lifeforrent| | 2022-7-27 15:24 | 只看该作者
MAC配置加上ENET_MAC_CFG|=ENET_MAC_CFG_CSD,关闭载波侦听功能试试~

使用特权

评论回复
地板
workmanxxx|  楼主 | 2022-7-28 12:50 | 只看该作者
本帖最后由 workmanxxx 于 2022-7-28 13:23 编辑
lifeforrent 发表于 2022-7-27 15:24
MAC配置加上ENET_MAC_CFG|=ENET_MAC_CFG_CSD,关闭载波侦听功能试试~

首先感谢您的回复!试了一下,关闭了载波侦听还是无法ping通。并且测试时,是使用PC直连到GD32的板,没有通过路由交换机或集线器。

尝试用STM32的程序直接写入GD32,GD32无法工作在单工模式。
程序改用GD32的库重写后,GD32还是无法工作在单工模式。

使用特权

评论回复
5
lifeforrent| | 2022-7-28 14:31 | 只看该作者
可以把代码发下看看吗

使用特权

评论回复
6
workmanxxx|  楼主 | 2022-7-28 16:09 | 只看该作者
lifeforrent 发表于 2022-7-28 14:31
可以把代码发下看看吗

感谢感谢,需要点时间从GD32的例子里整理出来一个以太网的demo,稍微晚点传上来。

使用特权

评论回复
7
workmanxxx|  楼主 | 2022-7-28 17:46 | 只看该作者
lifeforrent 发表于 2022-7-28 14:31
可以把代码发下看看吗

不让上传大于2M的文件,压缩后还有5M多呢。
附上的是GD32F10x里的demo,稍微改动了一下。我这里用的是IAR IDE,KEIL没有试过是否能正常编译。

这里用的phy为LAN8720A,地址为0 。GD32用25MHz晶体,PA8使能MCO输出25M时钟给LAN8720A。
目前代码里IP为固定的192.168.2.100,phy设置为自动协商模式。

程序下载到GD32后,PC端的网口直连到GD32板的网口。
当PC端网口默认设置为自动协商模式时,用ping 192.168.2.100 能正常连通。
PC端网口设置为单工模式时,就无法连通了。
PC端网口设置为双工模式时,就正常连通了。

更改PC端网口的模式:
控制面板 -> 网络和 Internet -> 网络连接 -> 右键选择网卡 -> 单击弹出的菜单属性 -> 配置按钮 -> 高级页面 -> 单击属性列表的 Speed & Duplex -> 右边的值里选择相应的模式 -> 确定按钮
注意,每次更改网卡模式后,GD32板需要重新上电复位,因未加断线重连功能。

如果你们有现成的GD32的互联型的板,已经调通了以太网的,按上面的改动一下PC端网口的连接模式,看看单工模式下是否能正常连通,如果确实不能连通,那估计还是GD32互联型的芯片有BUG导致。
请大家帮忙试试,不管是否能连通,请回复一下,谢谢各位了。

使用特权

评论回复
8
lifeforrent| | 2022-7-28 19:16 | 只看该作者
这里修改了吗?enet_init_status = enet_init(ENET_100M_HALFDUPLEX, ENET_AUTOCHECKSUM_DROP_FAILFRAMES, ENET_BROADCAST_FRAMES_PASS);

使用特权

评论回复
9
workmanxxx|  楼主 | 2022-7-28 21:55 | 只看该作者
lifeforrent 发表于 2022-7-28 19:16
这里修改了吗?enet_init_status = enet_init(ENET_100M_HALFDUPLEX, ENET_AUTOCHECKSUM_DROP_FAILFRAMES,  ...

这里默认为自动协商模式,协商完成后读取phy的寄存器会和PC端设置的模式相同。
刚才也设置了成100M单工模式,还是无法连通。

使用特权

评论回复
10
lifeforrent| | 2022-7-29 09:48 | 只看该作者
我在GD32F107VCT6开发板上试了没问题,官网例程,PC端无需修改配置,enet_init_status = enet_init(ENET_100M_HALFDUPLEX, ENET_AUTOCHECKSUM_DROP_FAILFRAMES, ENET_BROADCAST_FRAMES_PASS);这里一定要改为ENET_100M_HALFDUPLEX,另外在enet_init函数最后添加ENET_MAC_CFG|=ENET_MAC_CFG_CSD,PC端ping成功~

使用特权

评论回复
评分
参与人数 1威望 +2 收起 理由
workmanxxx + 2 很给力!
11
workmanxxx|  楼主 | 2022-7-29 11:01 | 只看该作者
lifeforrent 发表于 2022-7-29 09:48
我在GD32F107VCT6开发板上试了没问题,官网例程,PC端无需修改配置,enet_init_status = enet_init(ENET_10 ...

真是感谢,按你的方法试过了,单工状态下确实能正常连通了。

主要是这个起作用ENET_MAC_CFG |= ENET_MAC_CFG_CSD,昨天也在enet_init()函数里增加了这句,不过增加到那自动协商部分的后面了,不是增加到enet_init()函数的最后面部分,估计内部还有其它参数设定,所以导致失败。

使用特权

评论回复
12
lifeforrent| | 2022-7-29 11:08 | 只看该作者
不用客气,CSD就是在enet_init()函数倒数第三个if中被清掉了~

使用特权

评论回复
13
workmanxxx|  楼主 | 2022-7-29 11:38 | 只看该作者
lifeforrent 发表于 2022-7-29 11:08
不用客气,CSD就是在enet_init()函数倒数第三个if中被清掉了~

我又用STM32的试了一下,调试时监控以太网MAC设置寄存器(ETH_MACCR)的CSD位,这位为0或1时,单工状态下确实能正常工作。

手册上写的内容如下,根据下面说法,按理应该是该位应该置1才对,为啥STM32为0还能正常工作,太奇怪了。
CSD:关闭载波侦听功能 (Carrier sense disable)位16
1:在半双工模式下,MAC的发送器在发送帧过程中忽略MII的CSR信号,发送过程中载波丢失或者没有载波都不会报错。
0:MAC在发送过程中如果发生上述情况会报错,甚至放弃发送。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

1

主题

8

帖子

0

粉丝