文章目录
- 目的
- 控制器、收发器、总线
- 帧格式
- CAN2.0和CAN-FD
- 波特率与采样点
- 工作模式
- 总结
目的
CAN是非常常用的一种数据总线,被广泛用在各种车辆系统中。大多数时候CAN的控制器和收发器干了比较多的工作,从而对于写代码使用来说比较简单。这篇文章将对CAN使用上相关的基础内容做个说明。
控制器、收发器、总线
CAN的电气连接主要分 控制器、收发器、总线 。控制器目前很多单片机都内置有;收发器通常是外置的(常见的比如TJA1050);总线由 H、L 两条差分信号线构成,通常总线的两端需要有两个120Ω的终端电阻,使 H、L 间呈60Ω。
CAN的总线上可以挂载多个节点,节点并不分主从,想发数据发就行,CAN控制器会依据数据头部带的ID信息进行仲裁,优先级高的数据继续发送。大多数CAN控制器包含先进先出的发送和接收邮箱,可以设置发送失败后自动重发。CAN控制器可以设置接收消息ID过滤器,只有符合条件的ID并且CRC校验通过的数据(CAN的一条完整的数据是自带CRC校验的)才会存放到接收邮箱中。
CAN控制器硬件自带收发邮箱、接收带过滤器以及自带校验等,对于应用层写代码使用来说是比较方便的。
帧格式
CAN的数据是一帧一帧传输的,可以分为 数据帧、遥控帧、错误帧、过载帧、间隔帧 ,大多数时候我们只要关系数据帧即可。
一帧数据中头部是包含ID的,ID分为标准ID和扩展ID,区别只是位数不同。
CAN2.0和CAN-FD
目前来说在用的CAN主要分为 CAN2.0
和 CAN-FD
。 CAN2.0
数据帧一帧最大可以传输8字节,最高波特率为1000kbps。 CAN-FD
可以向下兼容 CAN2.0
,最大的变化在于数据段,一帧最大可以传输64字节,并且数据段波特率可以和其他部分不一样,最大可以到8000kbps。
很多情况下称 CAN2.0
为 bxCAN
。
波特率与采样点
CAN的波特率设置有点特别。经过分频后到达CAN控制器的的时钟信号以一个个 tq
来表示,CAN通讯中每个 bit
由多个时间段组成,每个时间段包含若干个 tq
。
SYNC_SEG
段固定占 1tq
, BS1
和 BS2
可以配置多个 tq
。通过调整时钟频率和 BS1
、 BS2
的 tq
数量可以调整CAN通讯波特率。另外需要注意的是 BS1
和 BS2
之间的时刻是真正采集数据值的时刻,通常需要控制 (SS + BS1) / (SS + BS1 + BS2)
在 75%~85%
之间。
上图的 SJW
用于控制动态调节 BS1
和 BS2
长短(总长度不变),从而提供一定的采样点冗余。
通常来有一种做法是固定CAN的时钟为40MHz,不进行分频,然后调节 BS1
和 BS2
来调整波特率。常用的波特率设置如下:
波特率 | BS1 | BS2 |
---|---|---|
125kbps | 239 | 80 |
250kbps | 119 | 40 |
500kbps | 59 | 20 |
1000kbps | 29 | 10 |
2000kbps | 14 | 5 |
4000kbps | 7 | 2 |
5000kbps | 5 | 2 |
8000kbps | 3 | 1 |
需要注意的是这里的 BS1
段只是STM32中的分段方式,很多时候该段其实可以细分为 PTS
和 BS1
两部段。
工作模式
CAN控制器通常可以工作在下面几种模式下(不同芯片对于各模式的叫法可能不同)。各个模式的区别只是输入输出信号连接不同。
总结
CAN本身东西是不少的,但如果只是需要使用CAN来进行数据收发的话需要了解的内容并不算多。