USER GUIDE / CONNECTIVITY & NETWORKING / CAN FD / OVERVIEW

概述

CAN FD IP 是一个独立的灵活数据速率控制器局域网(CAN FD)协议控制器。它同时支持 CAN 2.0B 标准和 CAN FD 协议,并保持向后兼容性。仲裁阶段最高支持 1Mb/s,数据阶段最高支持 8Mbps,以提升吞吐量。它能够发送和接收标准帧、扩展帧以及 CAN FD 消息帧。它包含双缓冲发送缓冲区和 288 字节接收 FIFO,具有 4 个 ID 接收过滤和消息管理功能。MCU 通信通过 AHB-Lite 和 DMA 功能实现。

功能

  • 兼容 CAN 2.0B 与 CAN Flexible Data (FD) 混合模式
  • 仲裁阶段位速率最高支持 1Mbps
  • CAN FD 数据阶段位速率最高支持 8Mbps
  • 支持标准 11 位与扩展 29 位标识符
  • 提供 64 字节 FD 数据发送双缓冲
  • 内建 288 字节 SRAM 作为接收 FIFO
  • 提供从 DMA 接口用于接收数据传输
  • 支持 4 组接收验收 ID 滤波器及掩码
  • 支持总线错误处理与自动恢复
  • 监听模式
  • 自测试模式
  • 自环测试模式

简介

控制器局域网(CAN)是一种串行异步总线,允许多主通信。CAN 总线使用一对带终端电阻的双绞线,最大数据速率为 8Mbps。总线典型长度可达 40 米。CAN 协议的一个独特之处在于其基于消息的特性。总线上的节点没有特定地址,消息则具有唯一标识符,用于确定其优先级。每个节点根据其功能发送特定类型的消息,并对相关的特定消息作出响应。由于总线结构简单且通过大量错误检测具备容错能力,CAN 在汽车和工业应用中广泛用于连接电子控制模块、传感器和执行器。

典型 CAN 总线的物理介质是一对双绞线,两端各接有 120Ohm 终端电阻。该双绞线包含两个信号,即 CANH 和 CANL。CANH 和 CANL 形成 5V 伪差分信号,因此即使在高噪声环境下也能可靠传输。总线上有两种可能的逻辑状态。显性状态(逻辑 0)是指 CANH 被主动拉到 5V,CANL 被主动拉到 0V。隐性状态(逻辑 1)是指总线未被主动驱动,CANH 和 CANL 都由终端电阻拉向 2.5V。总线还具有线与特性,即只有当所有节点都处于隐性状态时,总线才为隐性状态;只要一个或多个节点处于显性状态,总线就为显性状态。由于这种伪差分特性,即使其中一根导线断开,也仍可保持正确的数据传输。

通常使用外部收发器来驱动 CAN 总线并提供隔离驱动。

CAN 总线
图 1 CAN 总线

CAN 协议是载波侦听多路访问/碰撞避免(CSMA/CA)的改进版本,类似于以太网。如果两个节点同时尝试发送,与其避免碰撞,不如由消息的 ID 字段自行完成仲裁,从而允许优先级更高的消息继续发送,而优先级较低的消息被延后。典型的标准 CAN 帧格式和扩展格式如下所示。

SFF与EFF
图 2 SFF与EFF

帧以 Start of Frame(SOF)的 bit 0 开始,随后是 11-bit 的 ID 字段。由于某个节点发送的 dominant 状态会覆盖其他节点发送的 recessive 状态,因此编号最小的消息 ID 将赢得总线仲裁。仲裁之后,RTR bit 指示该消息是发送消息(RTR=0)还是 Remote Transmission Request(RTR=1)消息。R1 和 R0 是两个保留位,均应为 0。Data Length Code(DLC)表示后续数据的字节数。DLC 必须小于 9。数据字段之后附加 15-bit CRC,而 CRC delimiter 是 CRC 字段的最后一位。接收节点会在 ACK slot 期间发送 0 以确认成功接收。ACK delimiter 以及至少 7 bit time 的 EOF 字段用于确保总线进入 bus IDLE 状态。此外,帧间间隔应使用至少 3 BT(通常实现为 7 BT)的 recessive 状态和 bus IDLE 状态。

消息格式还可进一步分为标准格式(SFF)或扩展格式(EFF)。SFF 与 EFF 的区别在于 IDE bit。如果 IDE=dominant,则消息为 SFF;如果 IDE=recessive,则消息为 EFF。扩展格式在 IDE bit 之后增加 18 bit ID,从而提供 29-bit ID 寻址。从消息用途来看,消息可分为 data frame 或 remote frame。data frame 携带由发送端发给接收端(此处为复数)的数据。remote frame 由某节点发送,用于请求其他节点使用相同消息 ID 的 data frame 进行响应。data frame 和 remote frame 都可以采用标准格式或扩展格式。

CAN 总线使用 NRZ 编码。为确保有足够的边沿用于同步,采用 Bit-Stuffing。在连续 5 个相同电平的 bit 之后插入一个相反极性的 bit。Bit-Stuffing 从 SOF 开始,到 CRC 结束(CRC delimiter 之前)。SOF 的初始下降沿为消息起始提供硬同步。

CAN 总线包含多种错误检测机制,以确保可靠运行。其中包括消息帧内建的 CRC 检查。CRC 针对去填充位后的比特流数据计算,起始于 SOF,结束于数据字段的最后一位。若 CRC 不匹配,则丢弃该帧,且不响应 ACK bit。总线上的节点还会检测帧格式错误和位填充错误。检测到这些错误后,节点将发送 error frame。error frame 由 6 个连续 dominant bits 构成的 error flag 组成,当多个节点对同一错误作出响应时,可能扩展到 12 bits。这种对 bit-stuffing 的违反(超过 5 个连续相同比特)将确保总线上的所有节点都能检测到错误,因此检测到同一错误的节点可能会将 error flag 进一步扩展到 12 bit time。error flag 之后,error frame 以至少 3 bit time 的 recessive 状态作为 error delimiter 结束。另一种与 error frame 格式相同的特殊帧 overload frame,当接收节点在响应 remote request message 时无法满足响应要求,就会发送该帧。当节点检测到违反帧间隔规则(每帧之间必须有 3 bit time 的 recessive bits)时,也会发送 overload frame。

每个 CAN 节点在错误处理上有三种基本状态,如下图所示。REC 为接收错误计数,TEC 为发送错误计数。

错误状态
图 3 错误状态

节点处于 Error Active 状态时为正常运行状态。在该状态下,节点可以发送所有帧,包括由 6 个连续“dominant”位组成的 active error flag。当错误计数达到 127 时,进入 Error Passive 状态,节点可以发送所有帧以及由 6 个连续“recessive”位组成的 passive error flag。当错误计数超过 255 时,节点进入 Bus Off 状态并与总线隔离。该机制确保故障节点不会导致总线死锁。退出 Bus Off 状态只能通过重新初始化完成,或者在启用自动恢复时,在出现 128 次连续 11 个 recessive bit 的情况下恢复。

框图

CAN FD框图
图 4 CAN FD框图