这是我的第一篇技术博客,很久之前就萌生写技术博客的想法,一直没有付诸实践,典型的拖延症患者。最近在使用CAN总线的过程中遇到一些问题,就以此作开始,记录自己的技术成长之路,且方便以后查阅。
STM32F系列的CAN总线配置分为接收和发送两部分的配置;其中接收部分的过滤器以及CAN总线速率选择配置尤为重要。因带有测试性质,所以我选择的是1M的通信速率,看看能否达到40米的通信距离。CAN总线的基本配置:
1> 采用扩展帧格式,其中EXID的0-15位被看做是各个节点的地址,其余各位用于控制读 写操作以及命令标识ID,区分不同的操作命令
2> 通信速率为1M,使能自动重传
3> 接收过滤器采用标示符屏蔽模式,且只根据自定义的地址位进行屏蔽
下面重点总结一下关于速率与过滤器配置的注意事项。
位时间特性逻辑通过采样来监视串行的CAN总线,并且通过与帧起始位的边沿进行同步,及通过与后面的边沿进行重新同步,来调整其采样点。 它的操作可以简单解释为,如下所述把名义上的每位时间分为3段:
● 同步段(SYNC_SEG):通常期望位的变化发生在该时间段内。其值固定为1个时间单元(1 x Tcan)。
● 时间段1(BS1):定义采样点的位置。它包含CAN标准里的PROP_SEG和PHASE_SEG1。其值可以编程为1到16个时间单元,但也可以被自动延长,以补偿因为网络中不同节点的频
率差异所造成的相位的正向漂移。
● 时间段2(BS2):定义发送点的位置。它代表CAN标准里的PHASE_SEG2。其值可以编程为1到8个时间单元,但也可以被自动缩短以补偿相位的负向漂移。 重新同步跳跃宽度(SJW) 定义了,在每位中可以延长或缩短多少个时间单元的上限。其值可以编程为1到4个时间单元。有效跳变被定义为,当bxCAN自己没有发送隐性位时,从显性位到隐性位的第1次转变。如果在时间段1(BS1)而不是在同步段(SYNC_SEG)检测到有效跳变,那么BS1 的时间就被延长最多SJW那么长,从而采样点被延迟了。 相反如果在时间段2(BS2)而不是在SYNC_SEG检测到有效跳变,那么BS2 的时间就被缩短最多SJW那么长,从而采样点被提前了。
CAN总线的时钟为36MHz,根据如下图的位时间与波特率的关系,根据采样点设置 CiA 推荐的值:
75% when 波特率 > 800K
80% when 波特率 > 500K
87.5% when 波特率 <= 500K
CAN总线分频为4,分频后时钟9MHz,
BS1 = 6Tcan,BS2 = 2Tcan,采样点的值为(1 + 6)/(1 + 6 + 2) = 77.77%,满足采 样点的推荐值
关于接收过滤器的设置,采用32位屏蔽模式,屏蔽位为EXID0-EXID15,注意屏蔽 位的设置需要向左移3位,如下图所示。
CAN双绞线规格如下:
总线长度 |
导线电阻 |
导线横截面 |
终端电阻 |
最大通信速率 |
0-40m |
<70mΩ/m |
0.25-0.34mm2 AWG23、AWG22 |
124Ω %1 |
1Mbit/s at 40m |
40-300m |
<60mΩ/m |
0.34-0.6mm2 AWG22、AWG20 |
127Ω %1 |
>500Kbit/s at 100m |
300-600m |
<40mΩ/m |
0.5-0.6mm2 AWG20 |
127Ω %1 |
>100Kbit/s at 500m |
600-1000m |
<20mΩ/m |
0.75-0.8mm2 AWG18 |
127Ω %1 |
>50Kbit/s at 1000m |
位速率/kbps |
1000 |
500 |
250 |
125 |
100 |
50 |
20 |
10 |
最大距离/m |
40 |
130 |
270 |
530 |
620 |
1300 |
3300 |
6700 |
终端电阻采用双绞线传输时必须在干线的两端安装终端电阻,以避免出现信号反射。终端电阻要求如下:120偶姆1%金属膜1/4瓦
注意:终端电阻只能安装在干线两端,不可安装在支线末端。根据以上配置,选择家用的网线进行测试;1MHz速率下,已达到25米的距离。