采果农 发表于 2024-4-22 14:03:51

STC32G的2组CAN模块的缓冲区读写不够快,后续CAN-FD新品建议优化提升

最近在做一个项目,基本功能就是把CAN2接收到的帧通过CAN1发送出去,中间做点转换。


搞了好几天了,始终有问题,我的程序一直提示发送队列溢出(我这边发送队列可存放30帧数据)。

今天仔细分析了一下,发现是CAN模块的发送BUFFER,只能存放一帧数据导致的,
在发送完一帧数据后进入发送完成中断,我们没办法直接启动下次发送,必须将新数据写入BUFFER后再启动发送。
写入数据的这段时间就是问题所在,写入数据需要16us,而接受数据的间隔只有6.4us。

请看下图:


通道0是处理发送中断的时间(进入发送中断后变为高电平,处理完中断变为电平)
通道1是CAN1发送引脚TX的波形图
通道2是CAN2接受引脚RX的波形图
通道3是CAN2处理接收中断的时间(与发送中断一样)



从通道0,1可以看出发送完成后过了16us才继续发送下一帧数据,这段时间在中断内部转载新数据到BUFFER
代码如下


而接收CAN2接收引脚RX两帧数据间隔仅6.4us。


待发送的数据比接收的慢,所以迟早会溢出。

由以上数据得出,
STC32G这款处理器只有一个发送BUFFER,没办法在发送完成数据之前更新BUFFER,
这样就使得发送数据帧的间隔拉长了,在高并发的数据下没办法完美转发所有CAN数据。

以上是我的个人结论,如果有完美解决方案请告知。

神农鼎 发表于 2024-4-22 14:56:35

接收数据频率太快会导致转发速度跟不上,
发送缓冲区只有16字节,只能发完一帧再发送下一帧。

1, 建议降低 CAN的速度;
2, 提高 CPU的频率到30MHz

采果农 发表于 2024-4-22 15:43:27

神农鼎 发表于 2024-4-22 14:56
接收数据频率太快会导致转发速度跟不上,
发送缓冲区只有16字节,只能发完一帧再发送下一帧。



CAN速度不是我决定的,车上总线速率固定如此
CPU主频已经到32M了,根本原因还是不能提前写FIFO,或者增加增加fifo

神农鼎 发表于 2024-4-22 18:16:23

采果农 发表于 2024-4-22 15:43
CAN速度不是我决定的,车上总线速率固定如此
CPU主频已经到32M了,根本原因还是不能提前写FIFO,或者增加 ...

对方要求你的 CAN 的速度是多少

采果农 发表于 2024-4-23 17:36:25

神农鼎 发表于 2024-4-22 18:16
对方要求你的 CAN 的速度是多少

总线波特率是500K,我们这个是外挂模块没办法要求人家总线降速
没事,期待你们新的MCU,不要在只有一个BUFFER了

神农鼎 发表于 2024-4-23 18:22:47

500K位/S /8 = 62.5K字节/S, 没问题啊
1秒向缓冲区送 62.5K字节,是很慢的需求啊

USB 是 12M位/S, 1.5M字节/秒

采果农 发表于 2024-4-23 19:36:19

神农鼎 发表于 2024-4-23 18:22
500K位/S /8 = 62.5K字节/S, 没问题啊
1秒向缓冲区送 62.5K字节,是很慢的需求啊



大哥,你仔细看帖好吗
我的诉求是你们没有两级发送buffer,只有一个发送buffer,在发送完一帧数据后,没有办法马上启动下一帧数据的发送,必须先写buffer再发送,写buffer的这个时间是16us,相比接收端,两帧数据间隔再6.4us,这中间就相差10us,多来几帧数据不就把我的发送缓存堆满了吗?

因为你们只有一个发送fifo,必须等到发送完成才可以写fifo,
如果你们设计的是两个fifo , 那我在开始发送第一帧数据的时候,就可以写第二帧的数据到fifo,这样发送中断以来,就可以启动马上发送第二帧数据。

神农鼎 发表于 2024-4-23 20:21:07

30MHz, 10uS, 就是 300个时钟
33MHz, 10uS, 就是 330个时钟



采果农 发表于 2024-4-23 20:51:46

神农鼎 发表于 2024-4-23 20:21
30MHz, 10uS, 就是 300个时钟
33MHz, 10uS, 就是 330个时钟

你想表达什么,不懂你说的是什么意思

采果农 发表于 2024-4-23 21:00:39

本帖最后由 采果农 于 2024-4-23 22:43 编辑

神农鼎 发表于 2024-4-23 20:21
30MHz, 10uS, 就是 300个时钟
33MHz, 10uS, 就是 330个时钟
帖子第二张图的16us和第张图的6us,你明白看明白什么意思了吗

接收的帧是间隔6秒一帧,发送的帧间隔是>16us 的接收100帧就有1ms的时差,这个时差累计久了我定义的发送缓冲区不久溢出了。
页: [1] 2 3 4 5 6 7 8 9
查看完整版本: STC32G的2组CAN模块的缓冲区读写不够快,后续CAN-FD新品建议优化提升