打印

GD32C103/E103如何判断CAN外设正在接收数据?

[复制链接]
1311|10
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
imdx|  楼主 | 2022-1-3 15:13 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
AD, AN, adca, dc, CAN
CAN的一帧数据是比较长的,250k波特率下,一个8字节的数据帧时间大约460us,在硬件接收完成数据放到FIFO内部,或者触发接收中断之前,软件要判断CAN硬件是否在接收数据是比较难的,只能借助硬件提供某个寄存器位查询。
GD32E103的状态寄存器CAN_STAT第9位RS感觉应该是提供这个功能的,文档英文描述为:
9  RS  Receiving state
0: CAN is not working in the receiving state
1: CAN is working in the receiving state

这个英文描述比较清晰,RS=1表示CAN当前是接收状态,正在接收数据。RS=0说明么有接收数据,要么是发送数据要么是空闲的。
中文手册为:
9  RS  接收状态
0:CAN当前不是接收器

1:CAN当前是接收器
中文描述有点让人困惑,RS=1时是接收器,但是接收器除了在接收状态,还可能是空闲的。
实际测试发现,CAN初始化以后,CAN总线上无数据通讯,CAN_STAT寄存器为0x00000E00,也就是RS=1,和预想中完全不一样,无法用这一位来判断CAN是否正在接收数据。

STM32F103的CAN外设寄存器分布和GD32C103/E103除了FD以外几乎完全一样,实测STM32F103的CAN初始化以后,CAN总线上无数据通讯,CAN_STAT寄存器为0x00000C00,也就是RS=0,接收数据的话,CAN_STAT寄存器的RS位数值会变,可以用这一位来判断CAN外设是否在接收数据。

使用特权

评论回复
沙发
dxfshsh| | 2022-1-4 09:52 | 只看该作者
这个问题我很早就提出来过,可一直也没有得到一个解决办法。

使用特权

评论回复
板凳
imdx|  楼主 | 2022-1-4 10:27 | 只看该作者
dxfshsh 发表于 2022-1-4 09:52
这个问题我很早就提出来过,可一直也没有得到一个解决办法。

测试过GD32F303也有同样的问题,应该是CAN硬件的bug,他们芯片卖了那么多了,不可能改了。
还有一个USB的bug,用CAN这个特性是为了规避USB的哪个bug,结果CAN这个特性也有bug,同时踩上两个芯片硬件bug,我这运气也是没谁了。

使用特权

评论回复
地板
dxfshsh| | 2022-1-4 10:45 | 只看该作者
哈哈,您是在研发USB转CAN之类的模块吧?我也是在做这个时发现的这个BUG,您USB的BUG大概是个啥,我感觉USB端还好,是不是我们没有使用DMA的缘故。

使用特权

评论回复
5
imdx|  楼主 | 2022-1-4 11:01 | 只看该作者
dxfshsh 发表于 2022-1-4 10:45
哈哈,您是在研发USB转CAN之类的模块吧?我也是在做这个时发现的这个BUG,您USB的BUG大概是个啥,我感觉USB ...

对,做USBCAN设备,才会同时使用USB和CAN两个外设。USB这个问题触发极其隐蔽而且随机,几十万帧可能触发一次,因为USB寄存器众多,目前还不能100%确认是硬件bug。不像CAN这个bug是100%复现的。

使用特权

评论回复
6
dxfshsh| | 2022-1-4 13:48 | 只看该作者
imdx 发表于 2022-1-4 11:01
对,做USBCAN设备,才会同时使用USB和CAN两个外设。USB这个问题触发极其隐蔽而且随机,几十万帧可能触发 ...

就我们研发的模块来讲,好像没有遇到您说的那种情况。是没有启用DMA的情况,我们曾经在NXP上使用DMA总是有问题,后了弃用了DMA,在这个GD上也没有使用DMA,虽然通讯效率略有降低,U口持续速率可达接近5M,但其可靠性确是很高的。(启用DMA时也只有5M多一点,但出现的问题也比较多,也可能是我们学艺不精。)

使用特权

评论回复
7
dxfshsh| | 2022-1-4 13:49 | 只看该作者
本帖最后由 dxfshsh 于 2022-1-4 13:52 编辑

就我们研发的模块来讲,好像没有遇到您说的那种情况。是没有启用DMA的情况,我们曾经在NXP上使用DMA总是有问题,后了弃用了DMA,在这个GD上也没有使用DMA,虽然通讯效率略有降低,U口持续速率可达接近5M,但其可靠性确是很高的。(启用DMA时也只有5M多一点,但出现的问题也比较多,也可能是我们学艺不精。)

使用特权

评论回复
8
imdx|  楼主 | 2022-1-4 15:48 | 只看该作者
本帖最后由 imdx 于 2022-1-4 15:54 编辑
dxfshsh 发表于 2022-1-4 13:48
就我们研发的模块来讲,好像没有遇到您说的那种情况。是没有启用DMA的情况,我们曾经在NXP上使用DMA总是 ...

CAN的这个RS位我找原厂确认过了,就是这样的,不过原厂不承认这是bug,所以也没打算修正。
结论就是GD32的CAN无法通过软件来判断CAN是否在接收数据。好消息是他们的CAN IP是自研的,所以这个bug应该是GD32芯片独有的,不会影响其它厂商的产品。
GD32原厂技术人员对待技术的严谨程度方面确实不敢恭维。


使用特权

评论回复
9
imdx|  楼主 | 2022-1-4 15:50 | 只看该作者
dxfshsh 发表于 2022-1-4 13:49
就我们研发的模块来讲,好像没有遇到您说的那种情况。是没有启用DMA的情况,我们曾经在NXP上使用DMA总是有 ...

我没用DMA,USB的这个bug复现非常困难,如果不是100%通讯成功,那么很大概率就是这个问题引起的了。
我们的CAN总线负载率接100%,几十万帧才会出现一次,才会出现这个问题。

使用特权

评论回复
10
发呆二极管| | 2022-1-5 08:22 | 只看该作者
imdx 发表于 2022-1-4 15:48
CAN的这个RS位我找原厂确认过了,就是这样的,不过原厂不承认这是bug,所以也没打算修正。
结论就是GD32的 ...

笑死我了,这不是bug是什么?都承认can无法通过软件来实现功能了,还不承认是bug?
不过也可能是他们无法代表公司,就算技术人员认为是bug也不敢说,怕给“大厂”丢脸吧?

使用特权

评论回复
11
小猪siyuan| | 2022-3-1 19:33 | 只看该作者
问下 这个有在中断之前判断 是否接收数据 实际用到吗

使用特权

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

本版积分规则

116

主题

890

帖子

7

粉丝