找回密码
 立即注册
楼主: 采***

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

[复制链接]

该用户从未签到

1

主题

113

回帖

629

积分

高级会员

积分
629
发表于 2024-4-24 12:05:03 | 显示全部楼层
写发送缓冲区用汇编的话大概能到4us以内(32MHz主频),不能用官方提供的例程
回复 支持 反对 送花

使用道具 举报

该用户从未签到

550

主题

9311

回帖

1万

积分

管理员

积分
13872
发表于 2024-4-24 12:47:33 | 显示全部楼层
大家帮忙下楼主


明开会,STC32G96K256:
2组CAN-FD兼容CAN, 全部改成 DMA支持 CAN-FD,再P2P,
外设直接到外设/CAN-FD2<==>CAN-FD1, 让 CPU干其他事去
XFR 全部移到 edata

点评

XFR 全部移到 edata 没用, 问题依然存在. [attachimg]42322[/attachimg] 解决方案1: 将 CAN 两个 寄存器地址, 从 XFR 移到 SFR, CAN模块不用修改, 提速 N倍, 完美解决. 解决方案2: 修改CAN模块, 取消 CAN 两  详情 回复 发表于 2024-4-26 04:14
回复 支持 反对 送花

使用道具 举报

  • TA的每日心情
    开心
    半小时前
  • 签到天数: 7 天

    [LV.3]偶尔看看II

    1

    主题

    26

    回帖

    187

    积分

    注册会员

    积分
    187
     楼主| 发表于 2024-4-24 13:46:13 | 显示全部楼层

    加油,等你们的新型号,毕竟你们是最牛逼的51单片机
    回复 支持 反对 送花

    使用道具 举报

  • TA的每日心情
    开心
    前天 03:18
  • 签到天数: 137 天

    [LV.7]常住居民III

    37

    主题

    873

    回帖

    3992

    积分

    荣誉版主

    积分
    3992
    发表于 2024-4-24 13:50:02 | 显示全部楼层
    zxcv1973 发表于 2024-4-24 11:41
    XFR寄存器不支持字操作,并且CAN模块操作效率确实很低,这种外挂模块连地址自动增1都不支持 ...

    Keil  C251 有缺陷, 不支持 XFR寄存器 字操作, 但 汇编支持.
    回复 支持 反对 送花

    使用道具 举报

  • TA的每日心情
    开心
    前天 03:18
  • 签到天数: 137 天

    [LV.7]常住居民III

    37

    主题

    873

    回帖

    3992

    积分

    荣誉版主

    积分
    3992
    发表于 2024-4-24 15:25:59 | 显示全部楼层
    zxcv1973 发表于 2024-4-24 11:41
    XFR寄存器不支持字操作,并且CAN模块操作效率确实很低,这种外挂模块连地址自动增1都不支持 ...

    刚才实测了一下, c251 支持 XFR寄存器字操作(不支持SFR寄存器字操作).
    回复 支持 反对 送花

    使用道具 举报

    该用户从未签到

    1

    主题

    113

    回帖

    629

    积分

    高级会员

    积分
    629
    发表于 2024-4-24 15:52:09 | 显示全部楼层
    LAOXU 发表于 2024-4-24 15:25
    刚才实测了一下, c251 支持 XFR寄存器字操作(不支持SFR寄存器字操作).

    你怎么测的,我以前用汇编测过,字操作能执行,但执行结果不对,不过当时还是用的beta版测试的
    回复 支持 反对 送花

    使用道具 举报

    该用户从未签到

    1

    主题

    113

    回帖

    629

    积分

    高级会员

    积分
    629
    发表于 2024-4-24 15:55:29 | 显示全部楼层
    CAN写发送数据用C语言也能在4us以内(32MHz主频),还是不能用官方例程

    点评

    官方例程我看了, 标准帧 和 扩展帧 共用一个子函数, 执行时间略长, 粗步分析了一下汇编, 执行时间肯定不到 16US. 你说改写的C语言也能在4us以内(32MHz主频), 我相信没问题. 如再优化一下, 执行时间可更短.  详情 回复 发表于 2024-4-25 07:14
    回复 支持 反对 送花

    使用道具 举报

    该用户从未签到

    550

    主题

    9311

    回帖

    1万

    积分

    管理员

    积分
    13872
    发表于 2024-4-24 16:31:44 | 显示全部楼层
    帮楼主用 STC32G8K64-42I-LQFP48/32 算下,
    42MHz, 2个包之间要间隔多久
    回复 支持 反对 送花

    使用道具 举报

    该用户从未签到

    10

    主题

    39

    回帖

    380

    积分

    中级会员

    积分
    380
    发表于 2024-4-24 17:25:49 | 显示全部楼层
    LAOXU 发表于 2024-4-24 06:50
    我不知楼主的转换程序格式, 估计是这样写的,
    CAN2接收中断 --> CAN2接收到的帧 --> 读入+转换 --> 写入 CA ...

    他这个问题,我也遇到过:
    接收1帧的时间是固定的,因为速率固定
    1.   CAN2接收到中断 --> CAN2接收到的帧 --> 读入+转换 --> 写入 buff 缓冲区
    接收第1帧+6.4us 接收第2帧+6.4us

    2.   CAN1发送完中断 --> buff 缓冲区 ---> CAN1发送帧 --> 启动发送
    发送第1帧+16us,发送第2帧+16us
    这样的话,肯定溢出,问题是CAN没有发完,buffer不能装下一个数据
    如果 改成
    发送第1帧(buffer1) 同时装buffer2 + 发送第2帧(buffer2) 同时装入buffer1
    利用发送的同时,准备数据,发送的时间是远大于 装入时间的,把发送和装入同时进行

    点评

    我想不明白的是, 发送第1帧(+16us时间) 需要 16us时间? 到底做了些什么? 单纯的装载最多 十几字节到缓冲(包括前几个字节命令地址的检查), 用不了 16us 吧?  详情 回复 发表于 2024-4-25 07:06
    回复 支持 反对 送花

    使用道具 举报

  • TA的每日心情
    开心
    半小时前
  • 签到天数: 7 天

    [LV.3]偶尔看看II

    1

    主题

    26

    回帖

    187

    积分

    注册会员

    积分
    187
     楼主| 发表于 2024-4-24 18:45:09 来自手机 | 显示全部楼层
    zhx 发表于 2024-4-24 17:25
    他这个问题,我也遇到过:
    接收1帧的时间是固定的,因为速率固定
    1.   CAN2接收到中断 --> CAN2接收到的帧 - ...

    只有你是懂我的,所以现在他们能解决的方案,就是想尽办法减少写入buffer的时间,但是我觉得在发送完到响应中断就得有几us的时间,加上写入buf的时间估计还是来不及
    回复 支持 反对 送花

    使用道具 举报

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

    本版积分规则

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

    GMT+8, 2024-5-5 02:39 , Processed in 0.067475 second(s), 64 queries .

    Powered by Discuz! X3.5

    © 2001-2024 Discuz! Team.

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