打印
[应用相关]

单片机应用入坑记录——AT32 CAN波特率计算

[复制链接]
1615|15
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
hoop|  楼主 | 2020-12-1 19:36 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
最近在研究AT32F403A的CAN,发现CAN波特率计算公式计算出来的结果总是不对。花了点时间研究总结了一遍,具体成果如下:
1.问题
RM上介绍的算法如下图

简化后的波特率公式为:Boudrate =Fpclk/((BRP[9:0] + 1)(3 + BS1[3:0] + BS2[2:0]))
但是实际使用BSP库的时候发现,拿结构体配置的CAN_BS1、CAN_BS2以及CAN_Prescaler的配置直接带进去计算出来的波特率时钟永远不对
2.问题原因
深入研究结构体配置与寄存器值关系后,发现
  BRP[9:0]为BSP代码中CAN_InitStructure.CAN_Prescaler的设定值减1;
  BS1[3:0]为BSP代码中CAN_InitStructure.CAN_BS1的设定值减1;
  BS2[2:0]为BSP代码中CAN_InitStructure.CAN_BS2的设定值减1。

因此从BSP库函数的角度出发,波特率公式应该为:Boudrate =Fpclk/((CAN_Prescaler)(1+ CAN_BS1+ CAN_BS2))
而我之前还一直都是按照Boudrate =Fpclk/((1+CAN_Prescaler)(3+ CAN_BS1+ CAN_BS2))这个公式来带入计算,所以必然出错
3.实际验证
当设定
SYSCLK=192M
APB1CLK=24M
CAN_InitStructure.CAN_BS1 = CAN_BS1_8tq;
CAN_InitStructure.CAN_BS2 = CAN_BS2_3tq;
CAN_InitStructure.CAN_Prescaler = 2;时
按照前述计算方法可以算出Boudrate = 24M/((2)(1+3+8))=1000K,且实测也是1000K

4.总结
其实是比较简单的一个问题,Debug看看寄存器配置值就知道原因了。但是因为是新设计的硬件,所以当时调试的时候一直重点在怀疑我硬件电路问题。疏忽了,没有闪。。。。

使用特权

评论回复
沙发
天意无罪| | 2020-12-2 08:09 | 只看该作者
哈哈哈,多多踩坑是好事啊,好事多磨啊。顺便帮厂家找找bug。

使用特权

评论回复
板凳
142207103117| | 2020-12-5 14:27 | 只看该作者
其实,总线上外设没那么多时,可以考虑把波特率配的更高,我当时配到3M了,亲测可行哦,总线挂载了7个外设

使用特权

评论回复
地板
林堪堪| | 2020-12-6 12:43 | 只看该作者
142207103117 发表于 2020-12-5 14:27
其实,总线上外设没那么多时,可以考虑把波特率配的更高,我当时配到3M了,亲测可行哦,总线挂载了7个外设 ...

我也试过loopback模式配高于1M的波特率,确实通信没问题。不过要是跟外部设备通信的话,受限于收发器限制,外部设备能设置的波特率这些,也没有什么必要弄高于1M的波特率吧。还是按照CAN协议来就好,波特率低于1M.

使用特权

评论回复
5
jx_207| | 2020-12-7 10:10 | 只看该作者
国产的细节还得打磨

使用特权

评论回复
6
muyichuan2012| | 2020-12-7 22:10 | 只看该作者
很不错了  CAN能到1M。这里其实st也得行为也是一样,使用时,要多看RM.

使用特权

评论回复
7
hoop|  楼主 | 2020-12-8 09:29 | 只看该作者
不好意思啊,我只是想分享一下使用心得,是我没描述清楚,导致大家可能误解了
其实针对这点内容有特意去比对过AT于与ST的行为,是一样的。所以也可以看出,其实AT细节做得还是很到位的,至少我目前用到的CAN/SPI/USART/TMR/PWR/GPIO等外设的行为i表现以及使用方法上都有完全兼容。

使用特权

评论回复
8
zhouyong77| | 2020-12-9 20:54 | 只看该作者
哈哈哈,从坑中成长。

使用特权

评论回复
9
liangshuang95| | 2020-12-10 07:36 | 只看该作者
感谢楼主分享入坑经验,哈哈哈。

使用特权

评论回复
10
里面有晴雨| | 2020-12-11 17:57 | 只看该作者
我感觉这样计算不是很准确吧,我也试验一下。

使用特权

评论回复
评论
hoop 2020-12-11 18:10 回复TA
其实我有Debug到实际寄存器值的,可以验证一下,算法是没啥问题啦 
11
函数不想导| | 2020-12-11 23:55 | 只看该作者
楼主写得挺好的 很多坑我也没有发现

使用特权

评论回复
12
daichaodai| | 2020-12-12 14:20 | 只看该作者
踩的坑越多学到的东西越多

使用特权

评论回复
13
名字是啥样| | 2020-12-12 16:55 | 只看该作者
感谢分享坑,感谢分享坑。

使用特权

评论回复
14
氧化二氢| | 2020-12-12 23:28 | 只看该作者
多谢楼主分享 我也并不知道这些坑的原因

使用特权

评论回复
15
尼罗河L| | 2020-12-12 23:37 | 只看该作者
bug 希望你耗子尾治 学会自己把自己修复了

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

80

主题

322

帖子

0

粉丝