嵌入式硬件之CAN总线

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_33894122/article/details/81942092

CAN简介

  • 与IIC,SPI不同,是异步通信,不需要时钟线,对芯片内时钟要求比较高。
  • 与UART不同,CAN是半双工的,UART可以同时接受和发送,但是CAN却不行,由于是差分信号CAN_H与CAN_L。
  • 物理层分为开环总线和闭环总线两种,开环适合于长距离低速通信,闭环适合于短距离告诉通信。

闭环网络

开环网络
+ 与UART IIC SPI不一样,CAN不是点对点通信,不区分设备地址,也没有片选啥的,其实只要在CAN总线上的设备,都可以接收总线上所有的数据帧。
+ CAN控制器出来的引脚是CAN_TX 、CAN_RX,经过收发器后变为CAN_H 、CAN_L差分信号。

CAN物理层

  • CAN的逻辑信号(因为涉及到仲裁协议,是线与的关系,所以0是显性电平)
    逻辑1(隐性电平):CAN_H - CAN_L = 0v
    逻辑0(显性电平):CAN_H - CAN_L = 2v

  • CAN的波特率和同步
    与串口类似,由于是异步通信必定会涉及到波特率,波特率不仅跟CAN的控制器配置有关系,还跟SOC片上时钟有关系
    特别的是CAN还有个位同步的机制,很好地抗干扰,吸收误差,实现对总线电平的正确采样。
    因为通信涉及到总线电平采样,还由于是异步通讯,更是依赖于时钟。

  • CAN位同步
    CAN一个位时序分解成为SS、PBS1、PBS2段,电平采样发生在PBS1、PBS2之间,SS段占1个Tq,PBS1与PBS2长度是根据接收时序动态变化的。

CAN协议层

当CAN通讯的时候需要对数据,命令以及同步信号进行打包,打包后的内容称为报文。

有很多格式、用途的帧:
数据帧:用于节点想歪传输数据
遥控帧:用于向远端节点请求数据
错误帧:用于向远端节点通知校验错误,请求重发
过载帧:用于通知远端节点,本节点尚未做好接收准备
帧间隔:将数据帧、遥控帧与前面的帧间隔开来

其实还可以按标准帧和扩展帧来区分每一帧。

数据帧的帧结构

其中数据帧最为复杂
CAN数据帧结构

标准帧

  • SOF:起始位以一个显性位(逻辑0)开始
  • 仲裁段:主要包括11位的ID帧号(包含帧的优先级,紧急程度,类型等信息)和一位的RTR位,主要用来区分遥控帧(RTR = 1)和数据帧(RTR = 0),所以数据帧优先级比遥控帧要高。
  • 控制段:包括1位IDE段,标识符扩展位,显性的话为标准格式,隐性为扩展格式
    和1位r0保留位和4位DLC数据长度段。
  • 数据段:就是需要传输的数据,长度为字节
  • CRC段:15位CRC序列,根据前面这些数据计算校验15位校验,一般由硬件自动完成。
    和1位CRC界定符,为隐性电平,将CRC与后面ACK隔开。
  • ACK段:1位ACK槽 + 1位ACk界定符。ACK槽发送点是隐性的,而接收点发送应答的时候是显性的,ACK界定符将ACK位和帧结束位间隔开来
  • 帧结束段:以7位隐性电平表示帧结束。

扩展帧

  • SOF:起始位以一个显性位(逻辑0)开始
  • 仲裁段:主要包括11位的ID帧号(包含帧的优先级,紧急程度,类型等信息)和一位的SRR位(默认隐性),1位IDE位(区分标准帧和扩展帧)和18位扩展ID号和RTR帧(数据遥控帧区分)
  • 控制段:包括2位r1,r0保留位和4位DLC数据长度段。
  • 数据段:就是需要传输的数据,长度为字节
  • CRC段:15位CRC序列,根据前面这些数据计算校验15位校验,一般由硬件自动完成。
    和1位CRC界定符,为隐性电平,将CRC与后面ACK隔开。
  • ACK段:1位ACK槽 + 1位ACk界定符。ACK槽发送点是隐性的,而接收点发送应答的时候是显性的,ACK界定符将ACK位和帧结束位间隔开来
  • 帧结束段:以7位隐性电平表示帧结束。

猜你喜欢

转载自blog.csdn.net/qq_33894122/article/details/81942092