单片机应用入坑记录——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看看寄存器配置值就知道原因了。但是因为是新设计的硬件,所以当时调试的时候一直重点在怀疑我硬件电路问题。疏忽了,没有闪。。。。
哈哈哈,多多踩坑是好事啊,好事多磨啊。顺便帮厂家找找bug。 其实,总线上外设没那么多时,可以考虑把波特率配的更高,我当时配到3M了,亲测可行哦,总线挂载了7个外设 142207103117 发表于 2020-12-5 14:27
其实,总线上外设没那么多时,可以考虑把波特率配的更高,我当时配到3M了,亲测可行哦,总线挂载了7个外设 ...
我也试过loopback模式配高于1M的波特率,确实通信没问题。不过要是跟外部设备通信的话,受限于收发器限制,外部设备能设置的波特率这些,也没有什么必要弄高于1M的波特率吧。还是按照CAN协议来就好,波特率低于1M. 国产的细节还得打磨 很不错了CAN能到1M。这里其实st也得行为也是一样,使用时,要多看RM. 不好意思啊,我只是想分享一下使用心得,是我没描述清楚,导致大家可能误解了
其实针对这点内容有特意去比对过AT于与ST的行为,是一样的。所以也可以看出,其实AT细节做得还是很到位的,至少我目前用到的CAN/SPI/USART/TMR/PWR/GPIO等外设的行为i表现以及使用方法上都有完全兼容。 哈哈哈,从坑中成长。 感谢楼主分享入坑经验,哈哈哈。 我感觉这样计算不是很准确吧,我也试验一下。
楼主写得挺好的 很多坑我也没有发现 踩的坑越多学到的东西越多 感谢分享坑,感谢分享坑。
多谢楼主分享 我也并不知道这些坑的原因 bug 希望你耗子尾治 学会自己把自己修复了
页:
[1]