hoop 发表于 2020-12-1 19:36

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

最近在研究AT32F403A的CAN,发现CAN波特率计算公式计算出来的结果总是不对。花了点时间研究总结了一遍,具体成果如下:
1.问题
RM上介绍的算法如下图

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

jx_207 发表于 2020-12-7 10:10

国产的细节还得打磨

muyichuan2012 发表于 2020-12-7 22:10

很不错了CAN能到1M。这里其实st也得行为也是一样,使用时,要多看RM.

hoop 发表于 2020-12-8 09:29

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

zhouyong77 发表于 2020-12-9 20:54

哈哈哈,从坑中成长。

liangshuang95 发表于 2020-12-10 07:36

感谢楼主分享入坑经验,哈哈哈。

里面有晴雨 发表于 2020-12-11 17:57

我感觉这样计算不是很准确吧,我也试验一下。

函数不想导 发表于 2020-12-11 23:55

楼主写得挺好的 很多坑我也没有发现

daichaodai 发表于 2020-12-12 14:20

踩的坑越多学到的东西越多

名字是啥样 发表于 2020-12-12 16:55

感谢分享坑,感谢分享坑。

氧化二氢 发表于 2020-12-12 23:28

多谢楼主分享 我也并不知道这些坑的原因

尼罗河L 发表于 2020-12-12 23:37

bug 希望你耗子尾治 学会自己把自己修复了
页: [1]
查看完整版本: 单片机应用入坑记录——AT32 CAN波特率计算