目录
=============STM32中的CAN外设=============
一、CAN通信简介
can通信只有两根信号线(CAN High)和CAN_L(CAN Low),所有设备都搭载在这两根信号线上,可以实现多设备之间的高速实时的通信。其中每个设备都可以是主机/从机,都有对can总线的控制权。
can通信使用差分信号,不容易受干扰。当两根通信线的电压相同时,属于隐形电平1,当CANH被拉高而CANL被拉低时,属于显性电平0。在没有进行通信时,can总线表现为隐性电平1,当需要进行数据传输时,有且只有一个设备对can总线进行控制,其他设备选择是否接收。(当出现错误、过载或者应答时,其他设备才可以对总线进行控制)
二、CAN数据帧类型
这里主要了解的是数据帧。
三、格式帧
SOF:帧起始,数据传输开始时,总线从隐性电平1转变成显性电平0;
ID:11位设备ID号,表示设备信息,用于仲裁;
RTR:远程传输请求,用于区分数据帧(0)和遥控帧(1)(数据帧优先级高)
IDE:区分标准格式帧和扩展格式帧(0:为标准格式)
RB0:保留位(默认逻辑0)
DLC:4位,表示数据长度(字节),最多表示8字节,即64位;
CRC:校验位,检测数据是否错误;
CRC界定符:恒为隐性1,表示发送结束;
ACK:应答处理,发送端表现为隐性1,如果有设备接收了数据,那个设备会表现为显性电平1,此时整个can总线表现为显性电平;
ACK界定符:为隐性1,表示应答结束;
EOF:帧结束,为7位的隐性电平1;
SRR:用于代替RTR,真正的RTR在扩展ID后面,由于标准格式优先级高于扩展格式优先级,所以这一位虽然没用,但是必须为隐性1;
RB1,RB0:保留位(总是显性电平)
关于位填充:
当发送数据连续五个位是相同的时,会自动发送一个相反位的数据,接收方接收时,也会自动去除这个位。
关于仲裁段:
如果有两个设备同时开始发送数据,则会进行仲裁,ID号小的会在此获胜,继续数据发送,ID号大的则会退出。如果ID号相同,则标准格式帧优先。
四、位同步
CAN总线没有时钟线,总线上的所有设备通过约定波特率的方式确定每一个数据位的时长;
发送方以约定的位时长每隔固定时间输出一个数据位;
接收方以约定的位时长每隔固定时间采样总线的电平,输入一个数据位;
理想状态下,接收方能依次采样到发送方发出的每个数据位,且采样点位于数据位中心附近。
传输数据时可能遇到的问题
一个是接收设备的采样点可能位于跳变沿周围,导致采样信号不准确;一个是接收设备和发送设备的时钟有一点点偏差,导致采样信号不准确。
为了避免这两个问题,有硬同步和再同步两个方法。
最小时间单位
为了灵活调整每个采样点的位置,使采样点对齐数据位中心附近,CAN总线传播时间段对每一个数据位的时长进行了更细的划分,分为同步段(SS)(PTS)、相位缓冲段1(PBS1)和相位缓冲段2(PBS2)每个段又由若干个最小时间单位(Tq)构成。后面三个数据可以自己指定长度。
其中PTS用于处理网络延迟,PBS1和PBS2长度可以改变,用于再同步。
硬同步
当有设备需要发送数据时,它会选择在自身时钟周期的ss段进行发送,此时其他设备接收到跳变信号,会将自己的时钟之间调整到ss段,实现同步。
再同步
为了解决设备时钟有偏差的问题,接收设备可以对自己的时间进行补偿,通过补偿宽度值(SWJ)加长PBS1或缩短PBS2对时序进行补偿。