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数据。
以上是我的个人结论,如果有完美解决方案请告知。
接收数据频率太快会导致转发速度跟不上,
发送缓冲区只有16字节,只能发完一帧再发送下一帧。
1, 建议降低 CAN的速度;
2, 提高 CPU的频率到30MHz
神农鼎 发表于 2024-4-22 14:56
接收数据频率太快会导致转发速度跟不上,
发送缓冲区只有16字节,只能发完一帧再发送下一帧。
CAN速度不是我决定的,车上总线速率固定如此
CPU主频已经到32M了,根本原因还是不能提前写FIFO,或者增加增加fifo
采果农 发表于 2024-4-22 15:43
CAN速度不是我决定的,车上总线速率固定如此
CPU主频已经到32M了,根本原因还是不能提前写FIFO,或者增加 ...
对方要求你的 CAN 的速度是多少 神农鼎 发表于 2024-4-22 18:16
对方要求你的 CAN 的速度是多少
总线波特率是500K,我们这个是外挂模块没办法要求人家总线降速
没事,期待你们新的MCU,不要在只有一个BUFFER了
500K位/S /8 = 62.5K字节/S, 没问题啊
1秒向缓冲区送 62.5K字节,是很慢的需求啊
USB 是 12M位/S, 1.5M字节/秒
神农鼎 发表于 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,这样发送中断以来,就可以启动马上发送第二帧数据。
30MHz, 10uS, 就是 300个时钟
33MHz, 10uS, 就是 330个时钟
神农鼎 发表于 2024-4-23 20:21
30MHz, 10uS, 就是 300个时钟
33MHz, 10uS, 就是 330个时钟
你想表达什么,不懂你说的是什么意思
本帖最后由 采果农 于 2024-4-23 22:43 编辑
神农鼎 发表于 2024-4-23 20:21
30MHz, 10uS, 就是 300个时钟
33MHz, 10uS, 就是 330个时钟
帖子第二张图的16us和第张图的6us,你明白看明白什么意思了吗
接收的帧是间隔6秒一帧,发送的帧间隔是>16us 的接收100帧就有1ms的时差,这个时差累计久了我定义的发送缓冲区不久溢出了。