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

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

[复制链接]
  • 打卡等级:初来乍到
  • 打卡总天数:1
  • 最近打卡:2025-05-16 11:56:09

2

主题

186

回帖

1058

积分

金牌会员

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

使用道具 举报 送花

  • 打卡等级:常住居民II
  • 打卡总天数:99
  • 最近打卡:2025-06-16 09:28:47

733

主题

1万

回帖

1万

积分

管理员

积分
16648
发表于 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
回复 支持 反对

使用道具 举报 送花

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

2

主题

29

回帖

214

积分

中级会员

积分
214
发表于 2024-4-24 13:46:13 | 显示全部楼层
神*** 发表于 2024-4-24 12:47
大家帮忙下楼主

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

使用道具 举报 送花

  • 打卡等级:以坛为家I
  • 打卡总天数:312
  • 最近打卡:2025-03-11 13:20:13

54

主题

1327

回帖

5499

积分

荣誉版主

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

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

使用道具 举报 送花

  • 打卡等级:以坛为家I
  • 打卡总天数:312
  • 最近打卡:2025-03-11 13:20:13

54

主题

1327

回帖

5499

积分

荣誉版主

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

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

使用道具 举报 送花

  • 打卡等级:初来乍到
  • 打卡总天数:1
  • 最近打卡:2025-05-16 11:56:09

2

主题

186

回帖

1058

积分

金牌会员

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

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

使用道具 举报 送花

  • 打卡等级:初来乍到
  • 打卡总天数:1
  • 最近打卡:2025-05-16 11:56:09

2

主题

186

回帖

1058

积分

金牌会员

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

点评

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

使用道具 举报 送花

  • 打卡等级:常住居民II
  • 打卡总天数:99
  • 最近打卡:2025-06-16 09:28:47

733

主题

1万

回帖

1万

积分

管理员

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

使用道具 举报 送花

  • 打卡等级:初来乍到
  • 打卡总天数:7
  • 最近打卡:2025-06-09 10:19:44

18

主题

91

回帖

784

积分

高级会员

积分
784
发表于 2024-4-24 17:25:49 | 显示全部楼层
LAO*** 发表于 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
回复 支持 反对

使用道具 举报 送花

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

2

主题

29

回帖

214

积分

中级会员

积分
214
发表于 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, 2025-6-16 20:06 , Processed in 0.140319 second(s), 108 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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