发新帖本帖赏金 30.00元(功能说明)我要提问
返回列表
打印
[APM32E1]

APM32E103系列CAN通讯受时钟精准影响的测试分析

[复制链接]
868|1
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
Alden|  楼主 | 2022-12-22 14:24 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 Alden 于 2022-12-22 14:24 编辑

#申请原创#  @21小跑堂
CAN简介:CAN 是控制器局域网络 Controller Area Network 的缩写,是 ISO 国际标准化的串行通信协议,支持 CAN 协议 2.0A 和 2.0B。在 CAN 协议中,发送者以广播形式把报文发送给所有接收者,节点在接收报文时,会经过过滤器组根据标识符决定是否需要该报文,这种设计节省了 CPU 的开销。

APM32E103系列支持CAN协议 2.0A 和 2.0B,通信波特率最大为 1Mbit/s,并且拥有双CAN接口,能适应更多的应用场合。

而CAN通讯作为一种异步通讯方式,没有时钟线来参照,对总线上各设备的CAN波特率精度会有一定要求,否则设备之间的CAN通讯波特率相差过大,必然会出现问题。而这个允许的偏差范围却没有资料给出准确的答案,所以我将用APM32E103ZET6开发板实际测试CAN通讯波特率偏移多少会对通讯有影响。

APM32E103的CAN波特率是基于APB1的频率分频配置得到的,E103的主频最高为120Mhz,APB1的频率最大为60Mhz。而想要比较精细的调整can的波特率,只能调整MCU的主频来实现。
这里使用内部高速晶振作时钟源,通过调整内部高速晶振的校准值来微调内部高速晶振的频率,从而调整CAN通讯的波特率。

HSITRM的默认值是0x10,可调整的范围为0x00到0x1F,每步的调整HSI的变化约40khz。该功能是可以根据调整在电压和温度变化的情况下调整HSI的频率。
这里就用来人为偏移主频来测试CAN通讯。

代码就使用之前用st库修改的E103双CAN例程的基础上修改,只使用CAN1来测试就行了。

首先要增加HSI作时钟源的初始化,HSI作时钟源需要二分频到4M,PLL最大倍频系数是16,APB1的最大频率是60Mhz。所以选择15倍频,主频和APB1频率都为60Mhz。

其中        RCC_AdjustHSICalibrationValue(0x10);就是用来对HSI进行校准调整,默认值为0x10,减小该值会降低主频,最大该值会增大主频。
初始化之后可以通过PA8引脚的MCO功能输出HSI的波形,用示波器计算频率。
使用示波器的频率统计。

初始状态下,HSI的频率约为8.038Mhz,配置CAN的波特率为500k,CAN接收到分析发送的特定信息后回复,并串口输出CAN1错误状态寄存器的值,看是否检测到总线通讯错误。

此时用CAN分析仪上位机和串口助手可以监测到CAN总线的收发状态是正常的。

而调整时钟初始化的校准值:        RCC_AdjustHSICalibrationValue(0x10);
校准值在下调到0x0B和上调0x12时,CAN通讯收发出现异常,CAN分析仪无法收到APM32E103发送的数据,E103的CAN错误状态寄存器也有错误计数,说明波特率相差过大无法正常通讯。


所以校准值在0x0C~0x11的时候,总线还可以正常通讯,相对应的HSI频率为7.911Mhz~8.077Mhz。
也就是说CAN通讯能容忍的波特率偏差范围大约是±1%。
CAN通讯有比较复杂的仲裁和错误帧判定机制,CAN要在各种工程应用中的稳定通讯对通讯质量的要求也比较高。在CAN通讯出现异常时,串口还是可以正确的传输数据,说明CAN对波特率精度的要求是比串口通讯要高的。
而MCU的内部高速晶振HSI精度是比较有限的,
一般3.3V供电,25°条件下就在±1%范围内,刚好满足CAN通讯需求。
而在全温全压下是会超过±1%范围的。建议在有温度范围要求的场景下使用外部高速晶振。

使用特权

评论回复

打赏榜单

21小跑堂 打赏了 30.00 元 2022-12-29
理由:恭喜通过原创审核!期待您更多的原创作品~

评论
21小跑堂 2022-12-29 15:52 回复TA
在做CAN通信时,因为其要求较高,且无时钟线,对系统的时钟要求则较高,使用时最好使用外部晶振,保证其通信质量。作者的试验也恰恰证实这这一点,继续加油! 
发新帖 本帖赏金 30.00元(功能说明)我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

37

主题

84

帖子

1

粉丝