简介

CAN (Controller Area Network )是 ISO 国际标准化的串行通信协议。1986 年德国电气商博世公司开发出面向汽车的 CAN 通信协议。此后,CAN 通过 ISO11898 及 ISO11519 进行了标准化,现在在欧洲已是汽车网络的标准协议。现在,CAN 的高性能和可靠性已被认同,并被广泛地应用于工业自动化、船舶、医疗设备、工业设备等方面。现场总线是当今自动化领域技术发展的热点之一,被誉为自动化领域的计算机局域网

CAN 控制器根据两根线上的电位差来判断总线电平。总线电平分为显性电平和隐性电平,二者必居其一。发送方通过使总线电平发生变化,将消息发送给接收方。

特点

  1. 多主控制

    在总线空闲时,所有单元都可以发送消息(多主控制),而当两个以上的单元同时开始发送消息时,根据标识符(ID)决定优先级。两个以上的单元同时开始发送消息时,对各消息 ID 的每个位进行逐个仲裁比较。仲裁获胜(被判定为优先级最高)的单元可继续发送消息,仲裁失利的单元则立刻停止发送而进行接收工作。

  2. 系统的柔软性

    与总线相连的单元没有类似于“地址”的信息。因此在总线上增加单元时,连接在总线上的其它单元的软硬件及应用层都不需要改变

  3. 通信速度较快,通信距离远

    最高 1Mbps(距离小于40M),最远可达10KM(速率低于 5Kbps)。

  4. 具有错误检测、错误通知和错误恢复功能

    所有单元都可以检测错误(错误检测功能),检测出错误的单元会立即同时通知其他所有单元(错误通知功能),正在发送消息的单元一旦检测出错误,会强制结束当前的发送。强制结束发送的单元会不断反复地重新发送此消息直到成功发送为止(错误恢复功能)。

  5. 故障封闭功能

    CAN 可以判断出错误的类型是总线上暂时的数据错误(如外部噪声等)还是持续的数据错误(如单元内部故障、驱动器故障、断线等)。由此功能,当总线上发生持续数据错误时,可将引起此故障的单元从总线上隔离出去。

  6. 连接节点多

    CAN 总线是可同时连接多个单元的总线。可连接的单元总数理论上是没有限制的。但实际上可连接的单元数受总线上的时间延迟及电气负载的限制。单元数增加,通信速度降低;单元数减少,通信速度提高。

物理连接

下图是ISO11898 标准的物理层特征图 ,CAN通信只需要两根线连接,在 CAN 总线的起止端都有一个 120Ω的终端电阻,来做阻抗匹配,以减少回波反射。

从该特性可以看出:

  • 显性电平对应逻辑 0,CAN_H 和 CAN_L 之差为 2.5V左右

  • 隐性电平对应逻辑 1,CAN_H 和 CAN_L 之差为 0V

    (助记:显性->两线电压差明显->其中一根是低电压->逻辑0)

在总线上显性电平(逻辑0)具有优先权,只要有一个单元输出显性电平,总线上即为显性电平。而隐形电平则具有包容的意味,只有所有的单元都输出隐性电平,总线上才为隐性电平(显性电平比隐性电平更强)。

实际使用CAN通信时,需要连接CAN收发芯片,可以选用JTA105082C250等类似的CAN收发芯片。

另外,STM32微控制芯片里面集成了CAN控制器(名为bxCAN),如果是使用51单片机,需要外接MCP2515(SPI接口)或SJA1000(并行,速度快)等类似的CAN控制器芯片。

CAN协议

CAN 协议通过以下 5 种类型的帧进行:

帧类型 帧用途
数据帧 用于发送单元向接收单元传送数据的帧
遥控帧 用于接收单元向具有相同 ID 的发送单元请求数据的帧
错误帧 用于当检测出错误时向其它单元通知错误的帧
过载帧 用于接收单元通知其尚未做好接收准备的帧
间隔帧 用于将数据帧及遥控帧与前面的帧分离开来的帧

其中数据帧遥控帧有标准格式(11位标识符ID)和扩展格式(29位标识符ID)两种格式。最常用、最复杂的是数据帧。

数据帧详解

数据帧一般由 7 个段构成:

  • 帧起始:表示数据帧开始的段
  • 仲裁段:表示该帧优先级的段
  • 控制段:表示数据的字节数及保留位的段
  • 数据段:数据的内容,一帧可发送 0~8 个字节的数据
  • CRC 段:检查帧的传输错误的段
  • ACK 段:表示确认正常接收的段
  • 帧结束:表示数据帧结束的段

数据帧的构成下图所示,图中D表示显性电平,R表示隐性电平。

  • 帧起始:标准帧和扩展帧都是由1个位的显性电平表示帧起始。

  • 仲裁段:表示数据优先级的段,标准帧和扩展帧格式在本段有所区别。

    标准格式的 ID 有 11 个位。从 ID28 到 ID18 被依次发送。禁止高 7 位都为隐性(禁止设定:ID = 1111111 XXXX)。

    扩展格式的 ID 有 29 个位。基本ID从 ID28 到 ID18,扩展 ID 由ID17 到 ID0 表示。基本 ID 和标准格式的 ID 相同。禁止高 7 位都为隐性(禁止设定:基本ID=1111111XXXX)。

    其中 RTR 位用于标识是否是远程帧(0:数据帧;1:远程帧),IDE 位为标识符选择位(0:使用标准标识符;1:使用扩展标识符),SRR 位为代替远程请求位,为隐性位,它代替了标准帧中的 RTR 位。

  • 控制段:由 6 个位构成,表示数据段的字节数。标准帧和扩展帧的控制段稍有不同。

    r0 和 r1 为保留位,必须全部以显性电平发送,但是接收端可以接收显性、隐性及任意组合的电平。DLC 段为数据长度表示段,高位在前,DLC 段有效值为 08,但是接收方接收到 915 的时候并不认为是错误。

  • 数据段:该段可包含0~8 个字节的数据。从最高位(MSB)开始输出,标准帧和扩展帧在这个段的定义都是一样的。

  • CRC 段:该段用于检查帧传输错误。由 15 个位的 CRC 顺序和 1 个位的 CRC 界定符(用于分隔的位)组成,标准帧和扩展帧在这个段的格式也是相同的。

    CRC 的值计算范围包括:帧起始、仲裁段、控制段、数据段。接收方以同样的算法计算 CRC 值并进行比较,不一致时会通报错误。

  • ACK 段:此段用来确认是否正常接收。由 **ACK 槽(ACK Slot)**和 **ACK 界定符 **2 个位组成。标准帧和扩展帧在这个段的格式也是相同的。

    发送单元的 ACK,发送 2 个位的隐性位,而接收到正确消息的单元在 ACK 槽(ACK Slot)发送显性位,通知发送单元正常接收结束,这个过程叫发送 ACK/返回 ACK。发送 ACK 的是在既不处于总线关闭态也不处于休眠态的所有接收单元中,接收到正常消息的单元(发送单元不发送 ACK)。所谓正常消息是指不含填充错误、格式错误、CRC 错误的消息。

  • 帧结束:标准帧和扩展帧在这个段格式一样,由 7 个位的隐性位组成。

STM32F4的bxCAN的主要特点

  • 支持 CAN 协议 2.0A 和 2.0B 主动模式
  • 波特率最高达 1Mbps
  • 支持时间触发通信
  • 具有 3 个发送邮箱
  • 具有 3 级深度的 2 个接收 FIFO
  • 可变的过滤器组(28 个,CAN1 和 CAN2 共享)

未完待续。。。

参考:【正点原子】 手把手教你学STM32 系列视频之 STM32F4-基于探索者F407