CAN

CAN通讯

1. CAN通讯介绍

CAN(Controller Area Network 控制器局域网,简称CAN或者CAN bus)是一种功能丰富的车用总线标准。被设计用于在不需要主机(Host)的情况下,允许网络上的单片机和仪器相互通信。

它基于消息传递协议,设计之初在车辆上复用通信线缆,以降低铜线使用量,后来也被其他行业所使用。

CAN拥有了良好的弹性调整能力,可以在现有网络中增加节点而不用在软、硬件上做出调整。除此之外,消息的传递不基于特殊种类的节点,增加了升级网络的便利性。

image-20250506174608985

2. 物理层

CAN网络节点:

  • 一个CAN控制器

    • 一般MCU提供。STM32内部提供了1个CAN控制器。
  • 一个CAN收发器

    • 收发器一般需要专门芯片提供。
  • 控制器与收发器之间通过 CAN_Tx及CAN_Rx信号线相连。

  • 收发器与CAN总线之间使用CAN_High及CAN_Low 信号线相连。

CAN网络节点发数据:

  • 当CAN节点需要发送数据时,控制器把要发送的二进制编码通过CAN_Tx线发送到收发器。

  • 收发器把这个普通的逻辑电平信号转化成差分信号,通过差分线CAN_High和 CAN_Low线输出到CAN总线网络

CAN网络节点收数据:

  • 通过收发器接收总线上的数据到控制器时,则是相反的过程。
  • 收发器把总线上收到的 CAN_High及CAN_Low信号转化成普通的逻辑电平信号。
  • 通过CAN_Rx输出到控制器中。

根据接法不同,总线网络分2种:

  • 闭环总线网络
  • 开环总线网络

2.1 闭环总线网络

image-20250506182604416

遵循 ISO11898标准的高速、短距离闭环网络

  • 最大传输距离40m。
  • 通信速度最高为1Mbps。
  • 总线的两端各要求有一个120欧的电阻。

2.2 开环总线网络

image-20250506182649144

遵循 ISO11519-2标准的低速、远距离开环网络

  • 最大传输距离1Km。
  • 通信速度最高为125Kbps。
  • 两根总线是独立的、不形成闭环,要求每根总线上各串联有一个2.2 千欧的电阻。

2.3 差分信号

image-20250506211528078

  • CAN_High和CAN_Low 走的是一对差分信号。
  • 传统的单端信号传输:一根信号线一根地线。
  • 差分传输是一种信号传输的技术,差分传输在这两根线上都传输信号,这两个信号的振幅相同,相位相反。
  • 信号接收端比较这两个电压的差值来判断发送端发送的逻辑状态。
  • 在电路板上,差分走线必须是等长、等宽、紧密靠近、且在同一层面的两根线。

差分信号优缺点:

  • 优点:

    • 抗干扰能力强。

      干扰噪声一般会等值、同时的被加载到两根信号线上,而其差值为0,即,噪声对信号的逻辑意义不产生影响。

    • 能有效抑制电磁干扰(EMI)。

      由于两根线靠得很近且信号幅值相等,这两根线与地线之间的耦合电磁场的幅值也相等,同时他们的信号极性相反,其电磁场将相互抵消。因此对外界的电磁干扰也小。

  • 缺点:

    • 差分信号一定要走两根等长、等宽、紧密靠近、且在同一层面的线。对电路板比较小,走线比较紧张的情况下,给布线带来挑战。

CAN中的差分信号:

image-20250506212445885

以高速CAN协议为例

逻辑1(隐性电平):

  • CAN_High =CAN_Low = 2.5V
  • 电压差 VH-VL=0V

逻辑 0 (显性电平):

  • CAN_High=3.5V,CAN_Low =1.5V
  • 电压差为 VH-VL=2V

3. 协议层

CAN总线是广播类型的总线。这意味着所有节点都可以侦听到所有传输的报文。无法将报文单独发送给指定节点;所有节点都将始终捕获所有报文。但是CAN硬件能够提供本地过滤功能,让每个节点对报文有选择性地做出响应。

CAN使用短报文,最大实用负载是94位。报文中没有任何明确的地址;

可以认为报文是通过内容寻址,报文的内容隐式地确定其地址。

CAN总线上有5种不同的报文类型(或“帧”):数据帧、远程帧、错误帧、过载帧和帧间隔。

image-20250506233727585

3.1 数据帧

数据帧是最常见的报文类型,用于发送单元向接收单元发送数据

有2种数据帧:

  • 标准帧

image-20250506213447815

  • 扩展帧

image-20250506213535225

扩展帧与标准帧的不同在于仲裁段和控制段,其他完全一样。

标准帧:

  • 帧起始(Start Of Frame-SOF):

    • 1bit,显性信号(逻辑0)。
    • 表示数据帧(或远程帧)的开始。
    • 只能在总线空闲的时候才可以发送帧起始。
  • 仲裁段(Arbitration Field)包括两部分:

    • 标识符位(Identifier field-ID):
      • 长度为11位(11 bits),ID10ID0。按照ID10ID0的顺序进行传输。
      • 是一个功能性的地址(Functional address), CAN接收器通过标识符来过滤数据帧。
      • 不同节点的标识符位是不能相同的。
    • 远程发送请求位(Remote Transfer Request-RTR):
      • 用于区分该帧是数据帧还是远程帧。
      • 显性信号(0)代表数据帧(Data Frame)。
      • 隐性信号(1)代表远程帧(Remote Frame)。
  • 控制段(Control Field)一共6位:

    • IDE位(Identifier Extension):

      • 1位。区分标准格式与扩展格式。
      • 显性电平时表示标准格式。
      • 隐性电平时表示扩展格式。
    • DLC段(Data Length Code):

      • 4位。表示本报文中的数据段含有多少个字节。

      • 用于DLC段表示的数字为0~8。

    • R0位:

      • 1位。保留位,以后使用。

image-20250506214034892

  • 数据段(DATA Field):

    • 数据帧的核心内容,它是节点要发送的原始信息。
    • 由 0~8个字节组成。
    • 高位先行。
  • CRC段(CRC Field)包含2部分:

    • CRC校验码:
      • 15 bits,用于校验传输是否正确。
    • 界定符:
      • 隐性位,表示校验码的结束。
  • ACK段(ACK Field):

    • ACK确认位:
      • 发送端的ACK确认位是隐性位。
      • 接收端收到正确的CRC校验位后,把这一位置为显性位。
    • 界定符:
      • 1位隐性位,用于与后面的帧结束隔开。
  • EOF段( End Of Frame ):

    • 帧结束,帧结束段由发送节点发送的 7 个隐性位表示结束。

扩展帧:

  • SRR(Substitute Remote Request Bit)替代远程请求位(RTR),隐性信号。
  • IDE表示扩展帧还是标准帧。
  • 18位扩展ID。
  • RTR表示数据帧还是远程帧。
  • R1R0保留位。

3.2 远程帧(遥控帧)

远程帧用于接收单元向具有相同id的发送单元请求发送数据。

远程帧与数据帧相比没有数据段

image-20250506220040305

3.3 错误帧

错误帧当检测出错误时向其他单元通知错误的帧。

3.4 过载帧

过载帧并不常用,因为当今的CAN控制器会非常智能化地避免使用过载帧。

3.5 帧间隔

用于将数据帧及遥控帧与前面的帧分离开来的帧

其中错误帧、过载帧、帧间隔都是由硬件自动完成的,没有办法用软件来控制。对于一般使用者来说,只需要掌握数据帧与遥控帧。数据帧和遥控帧有标准格式与扩展格式。标准格式有11位标识符,扩展格式有29位标识符。

3.6 CAN总线仲裁

CAN总线处于空闲状态的时候,最先发送消息的单元获得发送权。

多个单元同时开始发送时,从仲裁段(报文id)的第一位开始进行仲裁。连续输出显性电平最多的单元可以继续发送,即首先出现隐性电平的单元失去对总线的占有权变为接收。(即报文id小的优先级高)。

竞争失败,会自动检测总线空闲,在第一时间再次尝试发送。

3.7 位时序

CAN中提出了位同步的方式来确保通讯时序。

image-20250506223233988

一帧中包含了很多个位。

CAN把每1位分为4段(从时间角度划分):

  • 同步段(SS:Synchronization Segment)。
    • SS 段的大小固定为 1Tq。
    • 若通讯节点检测到总线上信号的跳变沿被包含在 SS 段的范围之内,则表示节点与总线的时序是同步的。
  • 传播时间段(PTS:Propagation Time Segment)。
    • CAN总线上数据的传输会受到各种物理延迟。
    • 比如发送单元的发送延迟、总线上信号的传播延迟、接收单元的输入延迟等。
    • PTS段就是用来补偿这些因素产生的时间延迟。
    • PTS段长度至少为1个Tq。一般1-8Tq。
  • 相位缓冲段 1(PBS1:Phase Buffer Segment 1)。
    • 主要用来补偿边沿阶段的误差。
    • 它的时间长度在重新同步阶段的时候可以被自动加长。
    • PBS1段的初始大小可以为1~8Tq。
  • 相位缓冲段 2(PBS2:Phase Buffer Segment 2)。
    • 另一个相位缓冲段,也是用来补偿边沿阶段误差的。
    • 它的时间长度在重新同步阶段时可以缩短。
    • PBS2 段的初始大小可以为 2~8Tq。

4段的总时间段构成了位时间(Bit Time),就是传输一个位所需的总时间。

位时间通常被分为若干等长的时间单元,称为时间量化器(Time Quanta, Tq)。

一个Tq的长度可以根据传输速率的需要设置。

在STM32的CAN外设中,通过设置波特率分频器的值来确定Tq的大小。

采样点:

  • 位于PBS1和PBS2的交界处。

3.8 数据同步

根据同步方式差异,CAN 的数据同步分为硬同步和再同步。

硬同步:

  • 当一个节点检测到起始位时,它会执行硬同步,以便将其内部的时间基准与数据帧的时间基准对齐。
  • 在硬同步过程中,控制器的时间基准会立即调整为与检测到的边沿对齐。

再同步:

  • 在检测到总线上的时序与节点使用的时序有相位差时(即总线上的跳变沿不在节点时序的 SS 段范围)。
  • 通过延长 PBS1 段或缩短 PBS2 段,来获得同步。

所有的同步都是由CAN控制器硬件自动完成的。

3.8 CAN的波特率

各个通讯节点约定好1个Tq 的时间长度以及每一位占据多少个 Tq,就可以确定CAN通讯的波特率。

image-20250506223900059

假设图中的1Tq=1us,而每个数据位由20个Tq 组成,则传输一位数据需要时间为20us,从而每秒可以传输的数据位个数为:

10^6 / 20 = 50,000

这个每秒可传输的数据位的个数即为CAN通讯的波特率。比如上面的波特率就是50kbps。

4. STM32的CAN外设

STM32的芯片中具有bxCAN控制器(Basic Extended CAN),它支持CAN协议2.0A 和2.0B Active标准。

CAN2.0A只能处理标准数据帧且扩展帧的内容会识别错误。而CAN2.0 B Active可以处理标准数据帧和扩展数据帧。CAN2.0 B Passive只能处理标准数据帧而扩展帧的内容会被忽略。

  • 该CAN控制器支持最高的通讯速率为1Mb/s。
  • 可以自动地接收和发送CAN报文,支持使用标准ID和扩展ID的报文。
  • 外设中具有3个发送邮箱,发送报文的优先级可以使用软件控制,还可以记录发送的时间。
  • 具有2个3级深度的接收FIFO,可使用过滤功能只接收或不接收某些ID号的报文。
  • 可配置成自动重发。
  • 不支持使用DMA进行数据收发。

4.1 三种工作模式

CAN控制器有3种工作模式:初始化模式、正常模式、睡眠模式。

image-20250506224309186

上电复位后CAN控制器默认会进入睡眠模式,作用是降低功耗。当需要将进行初始的时候(配置寄存器),会进入初始化模式。当需要通讯的时候,就进入正常模式。

4.2 三种测试模式

CAN控制器有3种测试模式:静默模式、环回模式、环回静默模式。

当控制器进入初始化模式的时候才可以配置测试模式。

  • 静默模式:

只收不发。

可以用于检测总线的数据流量。

image-20250506224937576

  • 环回模式:

只发不收。

可以用于自检(影响总线)。

image-20250506225025086

  • 环回静默模式

自发自收。

也是用于自检,不会影响到总线。

image-20250506225052081

4.3 功能框图

image-20250506232740635

  • 主动内核

含各种控制/状态/配置寄存器,可以配置模式、波特率等。在STM32CubeMx中可以非常方便的配置。

  • 发送邮箱

用来缓存待发送的报文,最多可以缓存3个报文。发送调度决定报文的发送顺序。

  • 接收FIFO:

共有2个接收FIFO,每个FIFO都可以存放3个完整的报文。它们完全由硬件来管理。从而节省了CPU的处理负荷,简化了软件并保证了数据的一致性。应用程序只能通过读取FIFO输出邮箱,来读取FIFO中最先收到的报文。

  • 接收滤波器(过滤器):

作用:对接到的报文进行过滤,最后放入FIFO 0或FIFO 1。

当总线上报文数据量很大时,总线上的设备会频繁获取报文,占用CPU。过滤器的存在,选择性接收有效报文,减轻系统负担。

  • 有2种过滤模式:

    • 标识符列表模式,它把要接收报文的ID列成一个表,要求报文ID与列表中的某一个标识符完全相同才可以接收,可以理解为白名单管理。

    • 掩码模式(屏蔽位模式),它把可接收报文ID的某几位作为列表,这几位被称为掩码,可以把它理解成关键字搜索,只要掩码(关键字)相同,就符合要求,报文就会被保存到接收FIFO。

如果使能了过滤器,且报文的ID与所有过滤器的配置都不匹配,CAN外设会丢弃该报文,不存入接收FIFO。

每个CAN提供了14个位宽可变的、可配置的过滤器组(13~0)。每个过滤器组x由2个32位寄存器,CAN_FxR1和 CAN_FxR2组成。

image-20250506233044866

  • 说明:

    • 当工作于32位屏蔽位模式时,FR1保存标识符,FR2保存屏蔽。FR2某位是1表示来的ID的这位必须和FR1中对应的位一致,FR2某位是0,表示ID的这位不关心。

    • 当工作于32位标识符模式时。FR1和FR2分别保存两个标识符。这意味着将来只有两个ID会匹配成功。

  • 筛选优先级规则:

根据筛选组合的不同,可能存在一个标识符成功通过了几个筛选器的情况。在这种情况下,接收邮箱中存储的筛选器匹配值会根据以下优先级规则来选择:

  • 32位筛选器比16位筛选器优先。

  • 对于相同尺度的筛选器,标识符列表模式比标识符掩码模式优先。

  • 对于相同尺度和模式的筛选器,优先级由筛选器编号决定(编号越小,优先级越高)。

image-20250506233426167

4.4 位时序

STM32的位时序:把标准位时序的传播时间段和相位缓冲段1做了合并

image-20250506233555108

4.5 标志与中断

四个中断向量是专门用于bxCAN的。每个中断来源都可以通过CAN中断使能寄存器(CAN_IER)独立地开启或关闭。

image-20250506233854788

  • 传输中断可由以下事件生成:

    • 发送邮箱 0 变为空,CAN_TSR寄存器集中的 RQCP0 位。
    • 发送邮箱 1 变为空,CAN_TSR寄存器集中的 RQCP1 位。
    • 发送邮箱 2 变为空,CAN_TSR寄存器集中的 RQCP2 位。
  • FIFO 0 中断可由以下事件生成:

    • 接收新消息时,CAN_RF0R寄存器中的 FMP0 位不是 00。

    • FIFO0 完全条件,CAN_RF0R寄存器集中的 FULL0 位。

    • FIFO0 溢出条件,CAN_RF0R寄存器集中的 FOVR0 位。

  • FIFO 1 中断可由以下事件生成:

    • 接收新消息时,CAN_RF1R寄存器中的 FMP1 位不是 00。
    • FIFO1 完整条件,CAN_RF1R寄存器集中的 FULL1 位。
    • FIFO1 溢出条件,CAN_RF1R寄存器集中的 FOVR1 位。
  • 错误和状态更改中断可由以下事件生成:

    • 错误条件,有关错误条件的更多详细信息,请参阅 CAN 错误状态寄存器(CAN_ESR)。
    • 唤醒条件,在 CAN Rx 信号上监控 SOF。
    • 进入睡眠模式。