找回密码
 立即注册
查看: 4446|回复: 82

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

[复制链接]
  • 打卡等级:偶尔看看I
  • 打卡总天数:10
  • 最近打卡:2025-01-01 20:46:17

2

主题

29

回帖

214

积分

中级会员

积分
214
发表于 2024-4-22 14:03:51 | 显示全部楼层 |阅读模式
最近在做一个项目,基本功能就是把CAN2接收到的帧通过CAN1发送出去,中间做点转换。


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

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

请看下图:
截图202404221341509459.jpg

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

截图202404221346497226.jpg

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

而接收CAN2接收引脚RX两帧数据间隔仅6.4us。
截图202404221357484482.jpg

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

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

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

回复

使用道具 举报 送花

  • 打卡等级:偶尔看看III
  • 打卡总天数:54
  • 最近打卡:2025-05-01 09:07:55

717

主题

1万

回帖

1万

积分

管理员

积分
15613
发表于 2024-4-22 14:56:35 | 显示全部楼层
接收数据频率太快会导致转发速度跟不上,
发送缓冲区只有16字节,只能发完一帧再发送下一帧。

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

回复 支持 反对

使用道具 举报 送花

  • 打卡等级:偶尔看看I
  • 打卡总天数:10
  • 最近打卡:2025-01-01 20:46:17

2

主题

29

回帖

214

积分

中级会员

积分
214
发表于 2024-4-22 15:43:27 | 显示全部楼层
神*** 发表于 2024-4-22 14:56
接收数据频率太快会导致转发速度跟不上,
发送缓冲区只有16字节,只能发完一帧再发送下一帧。

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

点评

对方要求你的 CAN 的速度是多少  详情 回复 发表于 2024-4-22 18:16
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:偶尔看看III
  • 打卡总天数:54
  • 最近打卡:2025-05-01 09:07:55

717

主题

1万

回帖

1万

积分

管理员

积分
15613
发表于 2024-4-22 18:16:23 | 显示全部楼层
采*** 发表于 2024-4-22 15:43
CAN速度不是我决定的,车上总线速率固定如此
CPU主频已经到32M了,根本原因还是不能提前写FIFO,或者增加 ...

对方要求你的 CAN 的速度是多少
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:偶尔看看I
  • 打卡总天数:10
  • 最近打卡:2025-01-01 20:46:17

2

主题

29

回帖

214

积分

中级会员

积分
214
发表于 2024-4-23 17:36:25 | 显示全部楼层
神*** 发表于 2024-4-22 18:16
对方要求你的 CAN 的速度是多少

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

使用道具 举报 送花

  • 打卡等级:偶尔看看III
  • 打卡总天数:54
  • 最近打卡:2025-05-01 09:07:55

717

主题

1万

回帖

1万

积分

管理员

积分
15613
发表于 2024-4-23 18:22:47 | 显示全部楼层
500K位/S /8 = 62.5K字节/S, 没问题啊
1秒向缓冲区送 62.5K字节,是很慢的需求啊

USB 是 12M位/S, 1.5M字节/秒
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:偶尔看看I
  • 打卡总天数:10
  • 最近打卡:2025-01-01 20:46:17

2

主题

29

回帖

214

积分

中级会员

积分
214
发表于 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,这样发送中断以来,就可以启动马上发送第二帧数据。

回复 支持 反对

使用道具 举报 送花

  • 打卡等级:偶尔看看III
  • 打卡总天数:54
  • 最近打卡:2025-05-01 09:07:55

717

主题

1万

回帖

1万

积分

管理员

积分
15613
发表于 2024-4-23 20:21:07 | 显示全部楼层
30MHz, 10uS, 就是 300个时钟
33MHz, 10uS, 就是 330个时钟

截图202404232033135718.jpg

回复 支持 反对

使用道具 举报 送花

  • 打卡等级:偶尔看看I
  • 打卡总天数:10
  • 最近打卡:2025-01-01 20:46:17

2

主题

29

回帖

214

积分

中级会员

积分
214
发表于 2024-4-23 20:51:46 | 显示全部楼层
神*** 发表于 2024-4-23 20:21
30MHz, 10uS, 就是 300个时钟
33MHz, 10uS, 就是 330个时钟

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

回复 支持 反对

使用道具 举报 送花

  • 打卡等级:偶尔看看I
  • 打卡总天数:10
  • 最近打卡:2025-01-01 20:46:17

2

主题

29

回帖

214

积分

中级会员

积分
214
发表于 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的时差,这个时差累计久了我定义的发送缓冲区不久溢出了。

点评

接收100帧应该是10us*100=1ms的累积时差吧  发表于 2024-4-23 21:43
回复 支持 反对

使用道具 举报 送花

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|手机版|小黑屋|深圳国芯人工智能有限公司 ( 粤ICP备2022108929号-2 )

GMT+8, 2025-5-2 04:34 , Processed in 0.121347 second(s), 109 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

快速回复 返回顶部 返回列表