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

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

[复制链接]
  • TA的每日心情
    开心
    昨天 02:02
  • 签到天数: 7 天

    [LV.3]偶尔看看II

    1

    主题

    26

    回帖

    187

    积分

    注册会员

    积分
    187
    发表于 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数据。

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

    回复 送花

    使用道具 举报

    该用户从未签到

    550

    主题

    9328

    回帖

    1万

    积分

    管理员

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

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

    回复 支持 反对 送花

    使用道具 举报

  • TA的每日心情
    开心
    昨天 02:02
  • 签到天数: 7 天

    [LV.3]偶尔看看II

    1

    主题

    26

    回帖

    187

    积分

    注册会员

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

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

    点评

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

    使用道具 举报

    该用户从未签到

    550

    主题

    9328

    回帖

    1万

    积分

    管理员

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

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

    使用道具 举报

  • TA的每日心情
    开心
    昨天 02:02
  • 签到天数: 7 天

    [LV.3]偶尔看看II

    1

    主题

    26

    回帖

    187

    积分

    注册会员

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

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

    使用道具 举报

    该用户从未签到

    550

    主题

    9328

    回帖

    1万

    积分

    管理员

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

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

    使用道具 举报

  • TA的每日心情
    开心
    昨天 02:02
  • 签到天数: 7 天

    [LV.3]偶尔看看II

    1

    主题

    26

    回帖

    187

    积分

    注册会员

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

    回复 支持 反对 送花

    使用道具 举报

    该用户从未签到

    550

    主题

    9328

    回帖

    1万

    积分

    管理员

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

    截图202404232033135718.jpg

    回复 支持 反对 送花

    使用道具 举报

  • TA的每日心情
    开心
    昨天 02:02
  • 签到天数: 7 天

    [LV.3]偶尔看看II

    1

    主题

    26

    回帖

    187

    积分

    注册会员

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

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

    回复 支持 反对 送花

    使用道具 举报

  • TA的每日心情
    开心
    昨天 02:02
  • 签到天数: 7 天

    [LV.3]偶尔看看II

    1

    主题

    26

    回帖

    187

    积分

    注册会员

    积分
    187
     楼主| 发表于 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, 2024-5-6 05:16 , Processed in 0.069758 second(s), 68 queries .

    Powered by Discuz! X3.5

    © 2001-2024 Discuz! Team.

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