目录
STM32F427芯片的CAN通讯解析及驱动代码
一、关于CAN通讯
CAN是控制器局域网络(Controller Area Network)的简称,它是由研发和生产汽车电子产品著称的德国BOSCH公司开发的,并最终成为国际标准(ISO11519以及ISO11898),是国际上应用最广泛的现场总线之一。 CAN总线由于在通讯上具有高可靠性以及良好的错误检测能力,目前逐渐成为汽车计算机控制系统和嵌入式工业控制局域网的标准总线。
二、CAN通讯网络的拓扑结构

上图摘录自STM32F4系列的中文参考手册,从图中我们可以知道: 1、CAN网络的通讯节点由CAN控制器和CAN收发器组成。 2、CAN控制器是包含在MCU内部的,对于STM32F427来说就是我们配置的CAN外设。而我们通常使用的CAN芯片,例如TJA1050,这类芯片就是一种CAN总线收发器。 3、CAN控制器使用CAN_TX和CAN_RX两根信号线与CAN收发器相连。 4、CAN收发器使用CAN_HIGH和CAN_LOW两根线连接到CAN总线上。 5、CAN通讯网络不同于I2C,SPI等总线,它在通讯时没有使用时钟线,因此它属于异步通信。 6、CAN通讯网络中的节点个数理论上不受限制,只要总线的负载足够即可,并且可以通过中继器来增强负载。 这里需要特别注意的是: 与CAN总线相连的CAN_HIGH和CAN_LOW是一对差分线。也就是说CAN总线上的高低电平信号是通过差分线之间的电压差来表示的。之所以使用差分线来传输数据,主要是因为差分线的抗干扰能力强,同时能够有效抑制外部的电磁干扰。
三、CAN总线的电平
1、CAN总线上的电平有显性电平和隐性电平两种。其中显性电平对应着逻辑0,隐性电平对应逻辑1。 2、以高速CAN为例,在CAN协议中,表示逻辑0(显性电平)时,CAN_HIGH的电平为3.5V,CAN_LOW的电平为1.5V,它们之间的电压差为2V。而表示逻辑1(隐性电平)时,CAN_HIGH和CAN_LOW的电平均为2.5V,它们之间的电压差为0V。 3、总而言之,对于高速CAN来说,可以简单理解为: 当使用CAN总线发送逻辑0时,就让两根总线之间电压差为2V,而发送逻辑1时,就让两根总线的电压差为0即可。 4、从之前的分析我们知道,CAN总线网络上可以挂载很多节点。而在同一个时间点,假设一个节点输出显性电平,另外的一个节点输出隐性电平,由于CAN总线有“线与”的特性,因此,最后总线上的表现的电平是显性电平。即连接CAN总线的许多节点中,只要有一个节点使得总线电平为显性电平,那么总线就表现为显性电平。 5、由于CAN总线使用差分线之间的电压差表示逻辑信号,因此在一个时间点只能表示一个信号,因此CAN通讯是半双工的,数据的收发需要分时进行。在整个网络的同一时刻,只能有一个节点发送,其他的节点都只能接收。
四、CAN协议分析
CAN通讯没有时钟线,属于异步通信。因此节点之间进行通讯时会约定好波特率。同时也会采用“位同步”的方式来确保通讯的正常进行。
在CAN协议中,把每个数据位分为4段,分别为SS段,PTS段,PBS1段和PBS2段(每段的时间单位为Tq)。这四段的总长度为一个CAN总线数据位的长度。如下图表示为一个位数据的时序:

SS段: SS是同步段,若通讯节点检测到总线上信号的跳变沿被包含在SS段的范围之内,则表示节点与总线的时序是同步的,当节点与总线同步时,采样点采集到的总线电平即可被确定为该位的电平。SS段的大小固定为1Tq。 PTS段: PTS是传播时间段,这个时间段是用于补偿网络的物理延时时间。是总线上输入比较器延时和输出驱动器延时总和的两倍。PTS段的大小可以为1~8Tq。 PBS1段: PBS1是相位缓冲段,主要用来补偿边沿阶段的误差,它的时间长度在重新同步的时候可以加长。PBS1段的初始大小可以为1~8Tq。 PBS2段: PBS2是另一个相位缓冲段,也是用来补偿边沿阶段误差的,它的时间长度在重新同步时可以缩短。PBS2段的初始大小可以为2~8Tq。
CAN的数据同步功能分为硬同步和重新同步。 1、硬同步: 简单来讲,硬同步就是某个节点想要通过总线发送数据时,它会发送一个帧起始信号,表示通讯开始。而总线上的其他节点不发送数据时会时刻监测总线上的信号变化。当监测到总线起始信号不在内部时序的SS段内时,就把自己的SS段平移到帧起始信号的位置获得同步。这种同步一般在存在帧起始信号时才会起作用。 2、重新同步: 2.1 当传输数据的过程中,总线上的信号与节点本身的信号可能会有偏移。此时就需要使用重新同步了。重新同步是使用普通数据位从高到低的跳变沿来同步的。 2.2 它根据相位超前和相位滞后两种不同的情况采取不同的处理方式。 2.3 简单来说就是,当节点本身的信号的相位超前于总线上的信号相位时,控制器会在下一个位时序中的PBS1段增加对应的时间长度,使得节点与总线时序重新同步。而当节点本身的信号的相位滞后于总线上的信号相位时,控制器会在前一个位时序中的PBS2段减少对应的时间长度,从而获得同步。而PBS1和PBS2中增加或减少的这段时间长度被定义为 “重新同步补偿宽度SJW(reSynchronization Jump Width)。一般来说控制器会限制补偿宽度的最大值,因此每次同步时调整的时间宽度不能超过该值。若有需要,控制器会通过多次调整来进行同步。
五、CAN协议帧
CAN协议一共规定了5种类型的帧,它们分别为数据帧、遥控帧、错误帧、帧间隔和过载帧。如下图所示:

这里我们主要看数据帧。数据帧的结构如下图:

从上图可以知道,数据帧的组成为: 起始帧SOF + 仲裁字段 + Ctrl字段 + 数据字段 + CRC校验字段 +


827

被折叠的 条评论
为什么被折叠?



