<!-- 本文件由脚本自动转换生成，请勿手动编辑 -->

> **《LKS32MC45x User Manual》CAN-FD** . 完整目录见 [README.md](README.md)
>
> **声明**：本文档由芯片用户手册自动转换生成，仅供检索与查阅参考。Markdown 格式可被自由编译、修改，本文档不构成正式技术文件，相关内容以凌鸥创芯官方网站正式发布的手册为准。
>
> 南京凌鸥创芯电子有限公司 . (C) 2020, 版权归凌鸥创芯所有 . 机密文件，未经许可不得扩散

# CAN-FD

## 介绍

CAN总线控制器是符合CAN协议的串行通信控制器，满足 CAN
2.0B规范的所有约束，同时支持CAN-FD。

CAN
协议使用多主总线配置在网络节点之间传输帧（通信对象）并进行错误管理，以减少给CPU
带来额外负担。CAN总线控制器使用户能够在各种组件之间建立经济可靠的链接。
CAN总线控制器对微控制器来说是一个内存映射 I/O 设备。 CPU 访问
CAN总线控制器以通过两线CAN总线系统控制帧的发送或接收。与 CAN
总线的连接如下所示。

【图片已删除】为控制知识库体积，本文档不携带图片，相关图示请查阅凌鸥创芯官网发布的正式手册。

图
21-1 CAN总线的连接和CAN总线控制器的主要特性

### CAN 协议

CAN 通信是逐帧进行的。CAN协议存在两种类型的帧：标准帧和扩展帧。对于CAN
2.0，最大数据有效负载最多为8个字节，而对于CAN
FD，一帧最多可以传输64个字节。

所有CAN节点在总线上都是平等的。CAN是多主总线，不存在超级节点。

数据寻址是使用消息标识符完成的。在CAN网络中，只有一个节点可以传输带有特定标识符的消息。所有节点都接收所有发出的消息。为了减少CPU的负载，CAN控制器可以使用接收过滤器。这些过滤器将所有接收到的消息标识符与用户可选择的位掩码进行比较。只有当消息通过接收过滤器时，它才会存储在接收缓冲区中并发送给CPU。

帧的标识符也用于总线仲裁。当另一个CAN节点传输具有较高优先级标识符的消息时，CAN协议状态机停止传输具有低优先级标识符的消息，并自动尝试在下一个可能的时机重新传输停止的消息。小的标识符优先级更高。

CAN 2.0B定义了高达1Mbit/s的数据波特率。对于CAN FD，没有特定限制。CAN
FD标准定义了一种波特率切换的机制。如果启用波特率切换，帧有效载荷的传输可以以更高的速度完成，而帧头以较低的速度传输。

### CAN 2.0B以及如何启用CAN FD

CAN FD是CAN 2.0B 协议的向下兼容扩展。每个CAN FD节点都
能够接收和传输经典的CAN帧。

主机软件可以在运行时，使用发送缓冲区中的配置位，为每个帧选择是作为经典CAN或CAN
FD帧进行传输。对于接收，接收帧是经典CAN或CAN
FD帧，由接收缓冲区中的状态位进行指示。

### 时间戳

#### TTCAN（Time Trigger CAN）

根据 ISO 11898-4标准，CAN控制器可选择使用时间触发CAN通信机制
(TTCAN)。CAN控制器提供部分硬件支持，在此模式下需要主机软件与CAN控制器进行实时交互。

TTCAN的基本概念是存在一个定时器，用于为接收到的消息加上时间戳，并触发消息进行传输。
CAN网络中的一个节点是时间主机。时间主机发送参考帧。随着参考帧发送，循环时间开始。两个参考帧之间的时间是一个基本周期。基本周期内的消息可以在特定时间窗口中传输。
TTCAN系统管理节点在离线设置期间设定好每个时间窗口的开始和持续时间。

共有三种时间窗口类型：

- 独家时间窗口 （只允许一个节点发送一个具有特定ID的帧）
- 自由时间窗口 （未使用的时间窗口，用于未来扩展网络）
- 仲裁时间窗口 （几个节点可能会同时传输，可能导致仲裁发生）

如果接收到一帧，它会获取实际的循环时间作为时间戳。对于传输，CAN控制器提供了一个硬件触发机制，可以在预定义的时机开始传输事先准备好的消息。

CAN控制器在接收时自动检测参考帧并开始循环时间。硬件定时器是一个16位定时器，按照
ISO 11898-4 Level 1定义以CAN bit时间为单位运行。

除了用于消息传输的硬件触发之外，CAN控制器还提供了一个超时监测触发来检测参考帧丢失的情况。

主控制器需要为每个时间窗口配置节点的动作。例如，主机需要为下一次传输准备消息数据并为其定义触发时间。换句话说：主机需要对传输时空进行维护。

【图片已删除】为控制知识库体积，本文档不携带图片，相关图示请查阅凌鸥创芯官网发布的正式手册。
在规范603中定义了一种时间戳产生方法，CAN控制器支持该特性。CiA603可以与TTCAN一起使用。

CiA 603的基本概念是有一个独立运行的定时器，以系统时钟周期而不是CAN
bit时间进行计数。在CAN/CAN FD帧的SOF或EOF处获取时间戳。

CiA
603支持AUTOSAR的时间戳和时间同步。对于AUTOSAR，CAN网络中的一个节点是时间主机。时间主机发送同步消息（SYNC
消息）。 SYNC 消息的时间戳由时间主机和所有时间从机获取。指示
SYNC消息的发送与实际发送SYNC消息之间的时间差将由时间主机在follow-up
(FUP) 消息中传输。

## 特性

### 功能列表

- CAN规格
  - 支持2.0B（最多8个字节有效载荷，符合博世参考模型验证标准）
  - 支持FD（最多64字节有效载荷，ISO 11898-1:2015 或非ISO/博世）
- 可编程数据速度：
  - CAN 2.0B 定义数据速率高达 1Mbit/s
  - CAN FD受收发器限制
- 可编程波特率预分频器（1至1/256)
- 接收缓冲器 (RB)
  - 可容纳12帧(slot)
  - 类FIFO行为
  - “被滤除”或“不正确”的接收消息不会覆盖已存储的消息
- 两个发送缓冲器
  - 主发送缓冲器 (PTB)，可容纳1帧(slot)
  - 第二发送缓冲器 (STB)，可容纳4帧(slot)
- 独立可编程29bit接收过滤器
  - 共16个接收过滤器
- 扩展特征
  - 单次发传输模式（用于PTB、STB）
  - 监听模式
  - 环回模式（内部回环和外部回环）
- 扩展状态和错误报告
  - 捕获最后发生的错误和仲裁丢失位置
  - 可编程错误警告门限
- 可配置中断来源
- 时间戳：
  - ISO 11898-4 TTCAN
  - CiA 603 时间戳
- 兼容AUTOSAR

### 向上兼容

CAN协议中存在用于协议扩展的保留位，已用于在CAN 2.0B规范之上构建CAN
FD规范。如果不使用，保留位被传输为低（显性）。但CAN
2.0B规范定义了保留位为高（隐性）的行为。因此，如果使用此行为的CAN
2.0B节点接收到CAN FD帧（与CAN 2.0B帧相比具有不同帧格式），则这将导致 CAN
2.0B节点产生错误帧。这种行为称为“CAN FD不兼容”。

为了向上兼容新的协议规范，如果节点检测到保留位为高，则应发生所谓的协议异常事件。这适用于
CAN 2.0B 以及 CAN FD
节点。协议异常事件不会导致接收方采取任何行动。接收方只是忽略此帧，不回复ACK，等待总线空闲并可以发送或接收下一帧。对于
CAN 2.0B 节点，这称为“CAN FD 兼容”，可在一个网络中实现 CAN
2.0B和FD帧的共存。

### 消息缓冲区

#### 消息缓冲区概念

消息缓冲区的概念如下图所示。单个缓冲区消息槽（slot）应足以容纳最大帧长。

【图片已删除】为控制知识库体积，本文档不携带图片，相关图示请查阅凌鸥创芯官网发布的正式手册。

图
21-3消息缓冲区

#### 接收缓冲区

为了减少CPU的接收负载，CAN控制可以使用接收过滤器。
CAN总线控制器在接收过滤期间检查消息标识符。如果接收到的帧与其中一个接收过滤器的过滤标准匹配，则它将存储在接收缓冲区
(RB) 中，该缓冲区具有类似FIFO的行为。

根据可用消息槽的数量，主机控制器不需要立即读取接收到的消息。当RB已满或填充到软件选择的“几乎已满”门限时，CAN总线控制器能够在后续每次收到消息时生成中断。由于RB具有类似FIFO
的特性，主机控制器总是从RB读取最早的消息。

#### 发送缓冲器

CAN控制器配备了两个发送缓冲器 (TB)。Primary TB
(PTB)具有更高的优先级，但只能存储一帧。Secondary TB (STB)
的优先级较低，最多可以存储4帧。它可以在FIFO或优先级模式下运行。 PTB 和
STB
之间的优先级决定是固定的，完全独立于CAN总线仲裁。总线仲裁基于帧标识符的优先级决定。

STB可以被配置发送一帧或所有存储的帧。在FIFO模式下，每次发送都会先发送此缓冲区中最早的帧。在优先级模式中，缓冲区内具有最高优先级的帧（基于帧标识符）首先传输。

对于CAN协议状态机来说，PTB中的帧总是比STB中的帧具有更高的优先级，而不管帧标识符如何。PTB传输可以停止并延迟STB传输。PTB帧传输成功后，STB传输会自动重启。

PTB传输从下一个可能的传输时机开始（在下一个帧间隔之后）。但已取得仲裁并在实际进行传输的STB帧不会被打断，将先完成传输。

在以下情况下，可能会发生使用PTB传输中断STB传输：

1.  STB被命令输出所有存储的帧，并且主机控制器决定在所有STB传输完成之前配置PTB进行一帧的传输。
2.  STB被命令输出单个帧，并且主机控制器决定命令在STB传输完成之前配置PTB进行一帧的传输。

如果主机控制器一直等到每个命令的传输完成，那么它可以很容易地决定哪个缓冲区应该传输下一帧。但带有低优先级标识符的消息
可能会阻塞更重要的消息。主机可以选择取消消息传输。

【图片已删除】为控制知识库体积，本文档不携带图片，相关图示请查阅凌鸥创芯官网发布的正式手册。

图 21-4 CAN 控制器数据通路架构图

#### FIFO 模式下的发送缓冲器应用示例

在此示例中，CAN节点用于传感器测量。
CAN系统软件决定以低优先级处理这些传感器数据。

主控制器自动获取测量结果并将它们作为CAN帧放置在STB中。由于CAN总线上的高流量，可能会出现无法立即传输传感器数据帧并且在STB中保留若干帧的情况。稍后，如果CAN总线上的流量较少时，它们将被传输。

如果STB中已经保存了若干帧，主机控制器可能会有发送重要的高优先级帧的需求。在这种情况下，主机可以使用PTB。
PTB中的帧总是在STB之前传输。

拥有两个传输缓冲区的优点是可以选择保留所有消息。在高优先级事件的需要发送情况下，不必中止（丢弃）任何消息。

【图片已删除】为控制知识库体积，本文档不携带图片，相关图示请查阅凌鸥创芯官网发布的正式手册。

图
21-5发送缓冲器应用示例（TSALL=1）

如图，LPF_x是“低优先级帧”的缩写，HPF表示“高优先级帧”。可以看出，LPF_1被来自其他
CAN 节点的其他更高优先级帧阻塞。主控制器将第四帧放入STB
(LPF_4)，然后决定输出HPF。此后，CAN
总线可以自由传输LPF_1，然后是HPF、LPF_2等。

PTB和STB之间的优先级决策由CAN协议状态机完成，但CAN协议本身使用另一种独立的优先级决策机制，称为总线仲裁。对于总线仲裁，帧标识符定义了优先级。

在上面给出的示例中，可以将具有非常低优先级标识符的帧放置在PTB中，而较高优先级的帧保留在STB中。无论帧标识符如何，PTB总是优先发送。主机控制器的任务是将具有有意义的标识符优先级的帧放置在合适的缓冲区中。

#### 优先模式下的发送缓冲器应用示例

在STB的优先模式下，CAN控制器会自动更改STB内的帧顺序。具有最高优先级的帧首先被发送。**优先级决定与总线仲裁相同，因此具有较低值的帧标识符具有较高的优先级。**但PTB始终具有最高优先级。

一旦新帧准备好传输并写入STB，就会自动重新排序STB内的帧，选择具有最高优先级的帧进行传输。主机控制器只需要将新帧写入STB即可自动加入重排。

通常，具有较高优先级的帧永远不会中断活动传输。以图
21-3为例。在最左边的部分，帧 LPF_1 当前正在传输中，而 LPF_4 被写入
STB。即使 LPF_4 的优先级高于 LPF_1，LPF_1
仍然先会被传输完成，除非它在总线上失去仲裁。然后在节点失去仲裁后，将选择LPF_4进行传输，因为它具有更高优先级。

优先级重新排序在后台自动完成，但重排需要一些时间。当大量不同优先级的新帧写入STB，节点失去仲裁或总线出现错误时，有可能不是优先级最高的帧被选中。如果在决定下一帧的截止日期之前写入该帧，可能会发生这种情况。但这是一种非常罕见的情况，通常不需关心这一点。

如果将具有相同优先级的两个帧写入STB，则将首先传输最早的帧。

【图片已删除】为控制知识库体积，本文档不携带图片，相关图示请查阅凌鸥创芯官网发布的正式手册。

图 21-6 CAN Tx 常规事件与TTCAN时间驱动机制

#### 中止传输

如果出现这种情况，传输缓冲区中的消息由于其低优先级而无法发送，将阻塞缓冲区很长时间。为了避免这种情况，主控制器可以撤回传输请求并中止消息传输。
PTB和STB的单帧或所有帧传输都可以中止。

#### TTCAN 模式下的发送缓冲器

在
TTCAN模式下，STB中的每个消息槽都可以由主机寻址。每个消息槽都可以定义为已填充或空。因此，每个消息槽可以专用于一个特定的消息。

传输由硬件触发启动。每个触发都包含一个指向消息槽的指针。
PTB在TTCAN模式下没有特殊优先级，和STB消息槽进行相同处理。

主机应用程序处于方便考虑，可以将一条消息专用于一个缓冲槽。然后主机中的任务可以随时更新消息，然后如果该消息的触发时刻到达，则可以开始传输。但是为所有消息提供足够的消息槽需要大量硬件。因此可以在一个基本周期中为多个消息使用一个消息缓冲槽。因此，即使
STB 被禁用并且内核仅包含单个PTB消息槽，也可以支持ISO 11898-4协议。

### CAN 2.0和CAN FD帧

CAN FD是CAN 2.0的协议扩展。主要区别在于：

- 数据负载：CAN 2.0最多8个字节，CAN-FD最多64个字节
- CAN 2.0有一种可配置的波特率，而CAN FD有2种：仲裁阶段使用低速率，
  数据阶段使用高速率。

CAN规范中对缩写进行了说明。对于经典CAN帧(CAN
2.0)，一些位名称根据CAN FD
ISO规范进行了重命名，但这里仍然使用旧名称以便于向后引用兼容。

【图片已删除】为控制知识库体积，本文档不携带图片，相关图示请查阅凌鸥创芯官网发布的正式手册。

图
21-7 CAN 2.0 和 CAN FD 帧类型

表21-1
CAN 位缩写

|||||
|---|---|---|---|
|缩写|描述||评论|
|ID|IDentifier|标识符||
|RTR|Remote Transmission Request|远程传输请求|远程或数据帧|
|SRR|Substitute Remote Request|替代远程请求||
|RRS|Remote Request Substitution|远程请求替换||
|IDE|IDentifier Extension|标识符扩展|标准或扩展帧|
|DLC|Data Length Code|数据长度代码|有效负载字节数|
|EDL|Extended Data Length|扩展数据长度|CAN 2.0 或 CAN FD 帧|
|FDF|FD Format indicator (=EDL)|FD 格式指示符 (=EDL)|CAN 2.0 或 CAN FD 帧|
|BRS|Bit Rate Switch|波特率开关||
|ESI|Error State Indicator|错误状态指示器||
|r1, r0, res|Reserved bits|保留位||

Bosch (非ISO)的CAN FD规范使用EDL，而CAN FD
ISO规范使用FDF来表示同一位。本文档使用FDF。

对于CAN FD ISO帧，填充计数作为CRC字段的一部分传输。对于CAN
FD非ISO帧，填充计数不是帧的一部分。此外，CRC对非ISO和ISO帧有不同的初始化系数。因此，ISO和非ISO帧是不兼容的。

CAN控制中的CAN协议状态机自动发送和接收帧并嵌入适当的控制和状态位。软件需要选择所需的帧类型（IDE、RTR、FDF），选择标识符并设置有效的数据载荷。

### AUTOSAR 和 SAE J1939

AUTOSAR和SAE J1939软件协议栈可与CAN控制器一起使用。

对于AUTOSAR，传输缓冲区的数量应设置为至少3个消息槽，并且可以中止传输（寄存器TCMD中的TPA和TSA）。符合CiA
603协议，支持时间戳和时间同步。

SAE J1939使用扩展 ID（29
位）。为了便于处理，可以将接收过滤器配置为仅接收扩展ID（寄存器
CAN_ACF）。

表21-2
CAN 名称定义

|||
|---|---|
|缩写|描述|
|ACF|接收过滤器|
|PTB|主发送缓冲器（高优先级）|
|RB|接收缓冲区|
|RDC|接收器延迟补偿（与 TDC 相关）|
|RTS|接收时间戳|
|SP|采样点|
|SSP|二级采样点 (CAN FD)|
|STB|辅助发送缓冲器（低优先级）|
|TDC|发送器延迟补偿（CAN FD 规范）|
|TTCAN|时间触发 CAN (ISO 11898-4)|
|TTS|传输时间戳|
|TQ|时间量子（CAN 规范）|

## 寄存器（软件接口）

CAN-FD 基地址为0x40018800。

### 地址分配

CAN-FD模块寄存器的基地址是0x4001_8800，寄存器列表如下。

表21-3
CAN寄存器地址分配

||||
|---|---|---|
|名称|偏移|说明|
|CAN_RBUF_00|0x00|CAN Rx Buffer寄存器0|
|CAN_RBUF_01|0x04|CAN Rx Buffer寄存器1|
|CAN_RBUF_02|0x08|CAN Rx Buffer寄存器2|
|CAN_RBUF_03|0x0C|CAN Rx Buffer寄存器3|
|CAN_RBUF_04|0x10|CAN Rx Buffer寄存器4|
|CAN_RBUF_05|0x14|CAN Rx Buffer寄存器5|
|CAN_RBUF_06|0x18|CAN Rx Buffer寄存器6|
|CAN_RBUF_07|0x1C|CAN Rx Buffer寄存器7|
|CAN_RBUF_08|0x20|CAN Rx Buffer寄存器8|
|CAN_RBUF_09|0x24|CAN Rx Buffer寄存器9|
|CAN_RBUF_10|0x28|CAN Rx Buffer寄存器10|
|CAN_RBUF_11|0x2C|CAN Rx Buffer寄存器11|
|CAN_RBUF_12|0x30|CAN Rx Buffer寄存器12|
|CAN_RBUF_13|0x34|CAN Rx Buffer寄存器13|
|CAN_RBUF_14|0x38|CAN Rx Buffer寄存器14|
|CAN_RBUF_15|0x3C|CAN Rx Buffer寄存器15|
|CAN_RBUF_16|0x40|CAN Rx Buffer寄存器16|
|CAN_RBUF_17|0x44|CAN Rx Buffer寄存器17|
|CAN_RBUF_18|0x48|CAN Rx Buffer寄存器18|
|CAN_RBUF_19|0x4C|CAN Rx Buffer寄存器19|
|CAN_TBUF_00|0x50|CAN Tx Buffer寄存器0|
|CAN_TBUF_01|0x54|CAN Tx Buffer寄存器1|
|CAN_TBUF_02|0x58|CAN Tx Buffer寄存器2|
|CAN_TBUF_03|0x5C|CAN Tx Buffer寄存器3|
|CAN_TBUF_04|0x60|CAN Tx Buffer寄存器4|
|CAN_TBUF_05|0x64|CAN Tx Buffer寄存器5|
|CAN_TBUF_06|0x68|CAN Tx Buffer寄存器6|
|CAN_TBUF_07|0x6C|CAN Tx Buffer寄存器7|
|CAN_TBUF_08|0x70|CAN Tx Buffer寄存器8|
|CAN_TBUF_09|0x74|CAN Tx Buffer寄存器9|
|CAN_TBUF_10|0x78|CAN Tx Buffer寄存器10|
|CAN_TBUF_11|0x7C|CAN Tx Buffer寄存器11|
|CAN_TBUF_12|0x80|CAN Tx Buffer寄存器12|
|CAN_TBUF_13|0x84|CAN Tx Buffer寄存器13|
|CAN_TBUF_14|0x88|CAN Tx Buffer寄存器14|
|CAN_TBUF_15|0x8C|CAN Tx Buffer寄存器15|
|CAN_TBUF_16|0x90|CAN Tx Buffer寄存器16|
|CAN_TBUF_17|0x94|CAN Tx Buffer寄存器17|
|CAN_TTS_0|0x98|CAN 传输时间戳寄存器|
|CAN_TTS_1|0x9C|CAN 传输时间戳寄存器|
|CAN_CFG_STAT|0xA0|CAN配置和状态寄存器|
|CAN_TCMD|0xA1|CAN发送命令寄存器|
|CAN_TCTRL|0xA2|CAN发送控制寄存器|
|CAN_RCTRL|0xA3|CAN接收控制寄存器|
|CAN_RTIE|0xA4|CAN发送接收中断控制寄存器|
|CAN_RTIF|0xA5|CAN发送接收中断标志寄存器|
|CAN_ERRINT|0xA6|CAN错误中断使能和标志寄存器|
|CAN_LIMIT|0xA7|CAN警告寄存器|
|CAN_SBAUD|0xA8|CAN慢速波特率配置寄存器|
|CAN_FBAUD|0xAC|CAN快速波特率配置寄存器|
|CAN_EALCAP|0xB0|CAN错误信息和丢失仲裁信息记录寄存器|
|CAN_TDC|0xB1|CAN发送延时补偿寄存器|
|CAN_RECNT|0xB2|CAN接收错误计数器寄存器|
|CAN_TECNT|0xB3|CAN发送错误计数器寄存器|
|CAN_ACFCTRL|0xB4|CAN ID过滤器控制寄存器|
|CAN_TIMECFG|0xB5|CAN IDCiA603时间戳配置寄存器|
|CAN_ACFEN|0xB6|CAN ID过滤器使能寄存器|
|CAN_ACF|0xB8|CAN ID过滤器选择寄存器|
|CAN_TBSLOT|0xBE|TTCAN 发送缓冲区指针|
|CAN_TTCFG|0xBF|TTCAN配置寄存器|
|CAN_REF_MSG|0xC0|TTCAN参考帧寄存器|
|CAN_TRG_CFG|0xC4|TTCAN触发配置寄存器|
|CAN_TT_TRIG|0xC6|TTCAN触发时刻寄存器|
|CAN_TT_WTRIG|0xC8|TTCAN超时监测寄存器|
|CAN_CIAWDAT0|0xD0|CiA603时间戳低32位写入值|
|CAN_CIAWDAT1|0xD4|CiA603时间戳高32位写入值|

### CAN寄存器位分配表

访问定义使用 \<access\>-\<reset_value\> 形式的缩写给出。 \<access\>
属性：“r”表示读，“w”表示写，“rw”表示读/写访问。对于未初始化的寄存器，\<reset_value
\>属性可以是“0”、“1”和“u”。示例：“rw-0”表示“可读可写并重置为
0”，“ru”表示“可读且未初始化”。未使用的位总是r-0。

表21-4
CAN寄存器位分配表

||||||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|
|偏移|位置|||||||||||名称|
||7|6|5||4|3||2||1|0||
|0x00~0x4f|接收缓冲寄存器和接收时间戳|||||||||||RBUF（和RTS）|
|0x50~0x97|发送缓冲寄存器|||||||||||TBUF|
|0x98~0x9f|传输时间戳|||||||||||TTS|
|0xa0|RESET|LBME|LBMI||TPSS|TSSS||RACTIVE||TACTIVE|BUSOFF|CFG_STAT|
|0xa1|TBSEL|LOM|STBY||TPE|TPA||TSONE||TSALL|TSA|TCMD|
|0xa2|FD_ISO \*|TSNEXT|TSMODE||TTTBM|\-||||TSSTAT(1:0)||TCTRL|
|0xa3|SACK|ROM|ROV||RREL|RBALL||\-||RSTAT(1:0)||RCTRL|
|0xa4|RIE|ROIE|RFIE||RAFIE|TPIE||TSIE||EIE|TSFF|RTIE|
|0xa5|RIF|ROIF|RFIF||RAFIF|TPIF||TSIF||EIF|AIF|RTIF|
|0xa6|EWARN|EPASS|EPIE||EPIF|ALIE||ALIF||BEIE|BEIF|ERRINT|
|0xa7|AFWL(3:0)|||||EWL(3:0)||||||LIMIT|
|0xa8|S_Seg_1(7:0)|||||||||||S_Seg_1 \*|
|0xa9|\-|S_Seg_2(6:0)||||||||||S_Seg_2 \*|
|0xaa|\-|S_SJW(6:0)||||||||||S_SJW \*|
|0xab|S_PRESC(7:0)|||||||||||S_PRESC \*|
|0xac|\-||||F_Seg_1(4:0)|||||||F_Seg_1 \*|
|0xad|\-|||||F_Seg_2(3:0)||||||F_Seg_2 \*|
|0xae|\-|||||F_SJW(3:0)||||||F_SJW \*|
|0xaf|F_PRESC(7:0)|||||||||||F_PRESC \*|
|0xb0|KOER(2:0)||||ALC(4:0)|||||||EALCAP|
|0xb1|TDCEN|SSPOFF(6:0)||||||||||TDC \*|
|0xb2|RECNT|||||||||||RECNT|
|0xb3|TECNT|||||||||||TECNT|
|0xb4|\-||SELMASK||\-|ACFADR||||||ACFCTRL|
|0xb5|\-|||||||||TIMEPOS|TIMEEN|TIMECFG|
|0xb6|AE_7|AE_6|AE_5||AE_4|AE_3||AE_2||AE_1|AE_0|ACF_EN_0|
|0xb7|AE_15|AE_14|AE_13||AE_12|AE_11||AE_10||AE_9|AE_8|ACF_EN_1|
|0xb8|ACODE_x or AMASK_x (7:0)|||||||||||ACF_0 \*|
|0xb9|ACODE_x or AMASK_x (15:8)|||||||||||ACF_1 \*|
|0xba|ACODE_x or AMASK_x (23:16)|||||||||||ACF_2 \*|
|0xbb|\-|IDCMP|IDMASK||ACODE_x or AMASK_x (28:24)|||||||ACF_3 \*|
|0xbc|VERSION(7:0)|||||||||||VER_0|
|0xbd|VERSION(15:8)|||||||||||VER_1|
|0xbe|TBE|TBF|TBPTR(5:0)|||||||||TBSLOT|
|0xbf|WTIE|WTIF|TEIF||TTIE|TTIF||T_PRESC(1:0)|||TTEN|TTCFG|
|0xc0|REF_ID(7:0)|||||||||||REF_MSG_0|
|0xc1|REF_ID(15:8)|||||||||||REF_MSG_1|
|0xc2|REF_ID(23:16)|||||||||||REF_MSG_2|
|0xc3|REF_IDE|\-|||REF_ID(28:24)|||||||REF_MSG_3|
|0xc4|\-|||TTPTR(5:0)||||||||TRIG_CFG_0|
|0xc5|TEW(3:0)||||||\-||TTYPE(2:0)|||TRIG_CFG_1|
|0xc6|TT_TRIG(7:0)|||||||||||TT_TRIG_0|
|0xc7|TT_TRIG(15:8)|||||||||||TT_TRIG_1|
|0xc8|TT_WTRIG(7:0)|||||||||||TT_WTRIG_0|
|0xc9|TT_WTRIG(15:8)|||||||||||TT_WTRIG_1|
|0xca|\-|||||||||||\-|
|0xcb|\-|||||||||||\-|

\* 只有在寄存器CAN_CFG_STAT.RESET=1时，才能写入寄存器。

对寄存器映射中未显示的可寻址位置的写访问不会导致任何操作，读回为0x00。

### 寄存器说明

#### CAN_RBUF_00~CAN_RBUF_19 寄存器

地址：0x4001_8800~0x4001_884C

复位值：x

表21-5接收缓冲寄存器CAN_RBUF0~CAN_RBUF19

|||||||||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
|31|30|29|28|27|26|25|24|23|22|21|20|19|18|17|16|
|RDATA||||||||||||||||
|RO||||||||||||||||
|X||||||||||||||||
|15|14|13|12|11|10|9|8|7|6|5|4|3|2|1|0|
|RDATA||||||||||||||||
|RO||||||||||||||||
|X||||||||||||||||

||||
|---|---|---|
|位置|位名称|说明|
|\[31:0\]|RDATA|接收缓冲区寄存器，从Rx Buffer Slot中读出CAN帧的数据|

不同帧的类型及数据长度不同，CAN_RBUF0~CAN_RBUF19的数据内容不同。

表21-6
接收缓冲寄存器 RBUF - 标准格式 (r-0)

||||||||||||
|---|---|---|---|---|---|---|---|---|---|---|
|寄存器|地址|位||||||||功能|
|||7|6|5|4|3|2|1|0||
|CAN_RBUF_00|RBUF|ID\[7:0)||||||||Identifier|
||RBUF+1|\-|||||ID\[10:8\]|||Identifier|
||RBUF+2|\-||||||||Identifier|
||RBUF+3|ESI||||||||Identifier|
|CAN_RBUF_01|RBUF+4|IDE=0|RTR|FDF|BRS|DLC\[3:0\]||||Control|
||RBUF+5|KOER|||TX|||||Status|
||RBUF+6|CYCLE_TIME\[7:0\]||||||||TTCAN|
||RBUF+7|CYCLE_TIME\[15:8\]||||||||TTCAN|
|CAN_RBUF_02|RBUF+8|d1\[7:0\]||||||||Data byte 1|
||RBUF+9|d2\[7:0\]||||||||Data byte 2|
||…|…||||||||…|
|…|…|…||||||||…|
|CAN_RBUF_17|…|…||||||||…|
||RBUF+71|d64\[7:0\]||||||||Data byte 64|
||RBUF+72|RTS\[7:0\]||||||||CiA 603|
|…|…|…||||||||…|
|CAN_RBUF_19|…|…||||||||…|
||RBUF+79|RTS\[63:56\]||||||||CiA 603|

表21-7
接收缓冲寄存器 RBUF - 扩展格式 (r-0)

||||||||||||
|---|---|---|---|---|---|---|---|---|---|---|
|寄存器|地址|位||||||||功能|
|||7|6|5|4|3|2|1|0||
|CAN_RBUF_00|RBUF|ID\[7:0\]||||||||Identifier|
||RBUF+1|ID\[15:8\]||||||||Identifier|
||RBUF+2|ID\[23:16\]||||||||Identifier|
||RBUF+3|ESI|||ID\[28:24\]|||||Identifier|
|CAN_RBUF_01|RBUF+4|IDE=0|RTR|FDF|BRS|DLC\[3:0\]||||Control|
||RBUF+5|KOER|||TX|||||Status|
||RBUF+6|CYCLE_TIME\[7:0\]||||||||TTCAN|
||RBUF+7|CYCLE_TIME\[15:8\]||||||||TTCAN|
|CAN_RBUF_02|RBUF+8|d1\[7:0\]||||||||Data byte 1|
||RBUF+9|d2\[7:0\]||||||||Data byte 2|
||…|…||||||||…|
|…|…|…||||||||…|
|CAN_RBUF_17|…|…||||||||…|
||RBUF+71|d64\[7:0\]||||||||Data byte 64|
||RBUF+72|RTS\[7:0\]||||||||CiA 603|
|…|…|…||||||||…|
|CAN_RBUF_19|…|…||||||||…|
||RBUF+79|RTS\[63:56\]||||||||CiA 603|

RBUF寄存器（偏移0x00到0x4f）指向RB中接收到最早消息所在的消息槽。所有
RBUF 寄存器都可以按任何顺序读取。

RBUF中的KOER与寄存器EALCAP中的KOER位具有相同的含义。如果RBALL=1，RBUF中的
KOER才有意义。

如果CAN控制器处于回环模式并且内核已接收到自己的传输帧，则RBUF中的状态位TX置1。这一特性在当LBME=1并且网络中的其他节点也进行传输时很有用。

时间戳CYCLE_TIME将仅在TTCAN模式下存储在RBUF中。参考帧的循环时间始终为0。

CiA 603时间戳的接收时间戳 (RTS)
储在RBUF地址范围末尾的每个接收到的消息中。因此，与
TTS相比，RTS与实际选择的RBUF消息槽有关。

【图片已删除】为控制知识库体积，本文档不携带图片，相关图示请查阅凌鸥创芯官网发布的正式手册。

图
21-6 类似FIFO的RB示意图（6个消息槽示例）

#### CAN_TBUF_00~CAN_TBUF_17 寄存器

地址：0x4001_8850~0x4001_8894

复位值：x

表21-8写入寄存器CAN_TBUF0/1/2/3

|||||||||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
|31|30|29|28|27|26|25|24|23|22|21|20|19|18|17|16|
|WDATA||||||||||||||||
|WO||||||||||||||||
|X||||||||||||||||
|15|14|13|12|11|10|9|8|7|6|5|4|3|2|1|0|
|WDATA||||||||||||||||
|WO||||||||||||||||
|X||||||||||||||||

||||
|---|---|---|
|位置|位名称|说明|
|\[31:0\]|WDATA|发送数据寄存器，写入数据到Tx Buffer Slot中（PTB或者STB）|

不同帧的类型及数据长度不同，CAN_TBUF的数据内容也不同。根据文档对发送帧的结构解析即可。

表21-9
发送缓冲寄存器TBUF 标准格式 (rw-u)

||||||||||||
|---|---|---|---|---|---|---|---|---|---|---|
|寄存器|地址|位||||||||功能|
|||7|6|5|4|3|2|1|0||
|CAN_TBUF_00|TBUF|ID\[7:0\]||||||||Identifier|
||TBUF+1|\-|||||ID\[10:8\]|||Identifier|
||TBUF+2|\-||||||||Identifier|
||TBUF+3|TTSEN||||||||Identifier|
|CAN_TBUF_01|TBUF+4|IDE=0|Control|FDF|BRS|DLC\[3:0\]||||Control|
||TBUF+5|\-||||||||Unused|
||TBUF+6|\-||||||||Unused|
||TBUF+7|\-||||||||Unused|
|CAN_TBUF_02|TBUF+8|d1\[7:0\]||||||||Data byte 1|
||TBUF+9|d2\[7:0\]||||||||Data byte 2|
||…|…||||||||…|
|…|…|…||||||||…|
|CAN_TBUF_17|…|…||||||||…|
||TBUF+70|d63\[7:0\]||||||||Data byte 63|
||TBUF+71|d64\[7:0\]||||||||Data byte 64|

表21-10
发送缓冲寄存器TBUF 扩展格式 (rw-u)

||||||||||||
|---|---|---|---|---|---|---|---|---|---|---|
|寄存器|地址|位置||||||||功能|
|||7|6|5|4|3|2|1|0||
|CAN_TBUF_00|TBUF|ID\[7:0\]||||||||Identifier|
||TBUF+1|ID\[15:8\]||||||||Identifier|
||TBUF+2|ID\[23:16\]||||||||Identifier|
||TBUF+3|TTSEN|||ID\[28:24\]|||||Identifier|
|CAN_TBUF_01|TBUF+4|IDE=1|Control|FDF|BRS|DLC\[3:0\]|||||
||TBUF+5|\-||||||||Unused|
||TBUF+6|\-||||||||Unused|
||TBUF+7|\-||||||||Unused|
|CAN_TBUF_02|TBUF+8|d1\[7:0\]||||||||Data byte 1|
||TBUF+9|d2\[7:0\]||||||||Data byte 2|
||TBUF+10|d3\[7:0\]||||||||Data byte 3|
||TBUF+11|d4\[7:0\]||||||||Data byte 4|
|…|…|…||||||||…|
|CAN_TBUF_17|…|…||||||||…|
||TBUF+71|d64\[7:0\]||||||||Data byte 64|

如果TBSEL=1，TBUF寄存器指向STB中的下一个空消息槽或指向PTB。
TBUF寄存器可以任意顺序访问。
对于STB，需要设置TSNEXT来指示一个消息槽已满并令指针跳转到下一条消息槽。

为了更好地对齐地址段，TBUF在TBUF+5到TBUF+7的寻址范围内留有地址间隙。间隙中的存储单元可以读写，但无实际意义。

TBUF写入访问需要作为32位写入执行。

【图片已删除】为控制知识库体积，本文档不携带图片，相关图示请查阅凌鸥创芯官网发布的正式手册。

图
21-7 FIFO模式下的PTB和STB示意图（6个STB消息槽）

RBUF和TBUF都包括一些单独的帧控制位。对于RBUF，这些位指示的是接收帧的状态。对于TBUF这些位是待发送帧的控制位。

与RTS不同，如果TTSEN=1，TTS储存的是最后一个发送帧的时间戳。
TTS与实际选择的TBUF消息槽无关。

表21-11
RBUF 和 TBUF 中的控制位

|||
|---|---|
|名称|描述|
|IDE|标识符扩展0 - 标准格式：ID(10:0)1 - 扩展格式：ID(28:0)|
|RTR|远程传输请求0 - 数据帧1 - 远程帧只有CAN 2.0帧可以是远程帧。CAN FD没有远程帧。因此，如果在TBUF和RBUF中 FDF =1，则RTR被强制为0。如果接收到RRS=1的CAN FD帧，则忽略该帧，RBUF中的RTR被覆盖，但帧的CRC是用RRS=1计算的。|
|FDF|CAN FD 帧0 - CAN 2.0 帧（最多8字节有效负载）1 - CAN FD 帧（最多64字节有效载荷）|
|BRS|波特率开关0 - 标准/慢速波特率帧1 - 数据/快速波特率的数据有效载荷和 CRC只有 CAN FD 帧可以切换波特率。因此，如果FDF =0，BRS被强制为0。|
|ESI|错误状态指示在RBUF中为只读状态位，在TBUF中不可用。协议状态机自动将正确的ESI值嵌入到传输的帧中。ESI仅包含在CAN FD帧中，不存在于CAN 2.0帧中。0 - CAN 节点error active1 - CAN 节点error passive对于CAN 2.0帧，RBUF中的ESI始终为低。传输的错误状态由寄存器ERRINT中的位EPASS显示。|
|TTSEN|发送时间戳启用对于CiA 603时间戳，可以在TBUF中选择传输时间戳TTS：0 - 未获取此帧的传输时间戳1 - 启用TTS更新|

RBUF 和 TBUF 中的数据长度代码 (DLC)
定义了有效载荷的长度----帧中的有效载荷字节数。有关详细信息，请参见表21-12。

远程帧（仅适用于FDF = 0的CAN
2.0帧）始终以0有效载荷字节传输，但DLC的内容在帧头中传输。因此，可以将一些信息编码到远程帧的DLC位中。但是，如果允许不同的CAN节点传输具有相同ID的远程帧，则需要注意。在这种情况下，所有发射器都需要使用相同的DLC，否则会产生无法解决的冲突。

表21-12
DLC 的定义（根据 CAN 2.0 / FD 规范）

||||
|---|---|---|
|DLC（二进制）|帧类型|有效负载（以字节为单位）|
|0000~1000|CAN 2.0/CAN FD|0~8|
|1001~1111|CAN 2.0|8|
|1001|CAN FD|12|
|1010|CAN FD|16|
|1011|CAN FD|20|
|1100|CAN FD|24|
|1101|CAN FD|32|
|1110|CAN FD|48|
|1111|CAN FD|64|

#### CAN_TTS_0 发送时间戳寄存器0

地址：0x4001_8898

复位值：0x00

表21-13发送时间戳寄存器0
CAN_TTS0

|||||||||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
|31|30|29|28|27|26|25|24|23|22|21|20|19|18|17|16|
|TTS||||||||||||||||
|RO||||||||||||||||
|0||||||||||||||||
|15|14|13|12|11|10|9|8|7|6|5|4|3|2|1|0|
|TTS||||||||||||||||
|RO||||||||||||||||
|0||||||||||||||||

||||
|---|---|---|
|位置|位名称|说明|
|\[31:0\]|TTS|64位传输时间戳低32位TTS 保存最后传输帧的时间戳。 如果TTSEN=1，每个新帧都会覆盖TTS。TTS旨在供时间主机用于获取SYNC消息的时间戳|

#### CAN_TTS_1 发送时间戳寄存器1

地址：0x4001_889C

复位值：0x00

表21-14发送时间戳寄存器1
CAN_TTS1

|||||||||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
|31|30|29|28|27|26|25|24|23|22|21|20|19|18|17|16|
|TTS||||||||||||||||
|RO||||||||||||||||
|0||||||||||||||||
|15|14|13|12|11|10|9|8|7|6|5|4|3|2|1|0|
|TTS||||||||||||||||
|RO||||||||||||||||
|0||||||||||||||||

||||
|---|---|---|
|位置|位名称|说明|
|\[31:0\]|TTS|64位传输时间戳高32位TTS 保存最后传输帧的时间戳。 如果TTSEN=1，每个新帧都会覆盖TTS。TTS旨在供时间主机用于获取SYNC消息的时间戳|

#### CAN_CFG_STAT 配置和状态寄存器

地址：0x4001_88A0

复位值：0x80

表21-15配置和状态寄存器CAN_CFG_STAT

|||||||||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
|15|14|13|12|11|10|9|8|7|6|5|4|3|2|1|0|
|||||||||RESET|LBME|LBMI|TPSS|TSSS|RACTIVE|TACTIVE|BUSOFF|
|||||||||RW|RW|RW|RW|RW|RO|RO|RW|
|||||||||1|0|0|0|0|0|0|0|

||||
|---|---|---|
|位置|位名称|说明|
|\[7\]|RESET|1：CAN模块复位模式0：CAN模块正常工作模式复位模式下，CAN模块部分电路处于复位状态，部分寄存器只能在复位模式下配置；正常工作模式下，可以收发CAN帧。注意，从复位模式切换到正常工作模式，需要等待11个CAN Bit Time的时间（例如波特率为500K，一个Bit Time就是2us，需要等待22us才能发送或者接收CAN帧）|
|\[6\]|LBME|外部回环模式使能位1：使能0：关闭注意：正常通信中，禁止使能该位，使能外部回环时，注意打开CAN_RCTRL.SACK（自应答使能位）。应在CAN初始化和ID滤波设置之后再使能。|
|\[5\]|LBMI|内部回环模式使能位1：使能0：关闭注意：正常通信中，禁止使能该位。应在CAN初始化和ID滤波设置之后再使能。|
|\[4\]|TPSS|PTB单次传输模式使能位1：使能0：关闭注意：应在CAN初始化和ID滤波设置之后再使能。|
|\[3\]|TSSS|STB单次传输模式使能位1：使能0：关闭注意：应在CAN初始化和ID滤波设置之后再使能。|
|\[2\]|RACTIVE|接收状态标志位0：本CAN设备，接收空闲，总线空闲1：本CAN设备，正在接收CAN帧|
|\[1\]|TACTIVE|发送状态标志位0：本CAN设备，发送空闲1：本CAN设备，正在发送CAN帧注意：发送错误帧时，该位会拉高|
|\[0\]|BUSOFF|本CAN设备总线关闭状态位（Bus Off）0：本CAN设备，不在总线关闭状态位1：本CAN设备，处于总线关闭状态位注意：BUSOFF写1可以清零TECNT和RECNT寄存器，但仅限于项目调试。正常使用时需要禁止对CANx_CFG_STAT.BUSOFF写1。软件操作 CANx_CFG_STAT 寄存器时需要避免使用或等于（\|=）以及与等于符号（&=），因为使用这两个符号操作 CANx_CFG_STAT 寄存器时可能会将 CANx_CFG_STAT.BUSOFF 字段误写 1，从而导致将 BUSOFF 误清零，导致BUSOFF提前恢复。|

注意：软件操作CANx_CFG_STAT寄存器时需要避免使用或等于（\|=）以及与等于符号（&=），因为使用这两个符号操作CANx_CFG_STAT寄存器时可能会将CANx_CFG_STAT.BUSOFF字段误写1，从而导致将BUSOFF误清零。

举例说明，不可使用CANx_CFG_STAT \|=
BIT4，需要用变量先读取CANx_CFG_STAT的值，然后再将读取的值BIT0屏蔽之后，再和BIT4相或，最后写入CANx_CFG_STAT寄存器。

DEMO =CANx_CFG_STAT ;

DEMO = DEMO&(~BIT0);

DEMO=DEMO \| BIT4;

CANx_CFG_STAT = DEMO;

#### CAN_TCMD 发送命令寄存器

地址：0x4001_88A1

复位值：0x0

表21-16发送命令寄存器CAN_TCMD

|||||||||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
|15|14|13|12|11|10|9|8|7|6|5|4|3|2|1|0|
|||||||||TBSEL|LOM|--|TPE|TPA|TSONE|TSALL|TSA|
|||||||||RW|RW|--|RW|RW|RW|RW|RW|
|||||||||0|0|0|0|0|0|0|0|

||||
|---|---|---|
|位置|位名称|说明|
|\[7\]|TBSEL|Tx Buffer选择位，通过CAN_TBUF写入到对应Buffer中1：STB0：PTB注意在写入CAN_TBUF过程中，TBSEL的值不能改变；同时，在写入STB的时候，完成一帧的写入，需要更新TSNEXT。|
|\[6\]|LOM|监听模式使能位1：使能0：关闭如果设置了TPE、TSONE或TSALL，则无法设置LOM。如果LOM启用且LBME禁用，则无法启动传输。LOM=1和LBME=0禁止所有传输。LOM=1和LBME=1禁止应答相应接收到的帧和错误帧，但可以发送本设备的帧注意：正常通信中，禁止使能该位|
|\[5\]|--|保持默认值|
|\[4\]|TPE|PTB发送使能位1：触发PTB发送0：不触发PTB发送配置TPE，在下一个可以发送的窗口，优先STB发送PTB的数据（除非当前已经在发送STB，否则先发PTB）。该位写1后将保持为1直到PTB发送完成或者通过TPA取消发送。软件不能通过写0清除该位。TPE可以被清除的另外几种情况：CAN_CFG_STAT.RESET=1CAN_TCMD.LOM=1同时CAN_CFG_STAT.LBME=0|
|\[3\]|TPA|PTB发送取消位1：取消已经通过TPE置1请求但还未开始的PTB发送0：不取消软件置位，硬件自动清零。设置TPA会自动清零TPE，一般TPA和TPE不同时置位。CAN_CFG_STAT.RESET=1可清零TPA。|
|\[2\]|TSONE|发送一帧STB数据控制位（Transmit Secondary ONE Frame）1：发送一帧STB数据0：不发送TSONE配置为1，触发发送，成功发送或者TSA终止发送可实现硬件清零，否则一直保持1。CAN_CFG_STAT.RESET=1，也可清零。|
|\[1\]|TSALL|发送多帧STB数据控制位（Transmit Secondary All Frames）1：发送多帧STB数据0：不发送TSALL配置为1，触发发送，成功发送或者TSA终止发送可实现硬件清零，否则一直保持1。CAN_CFG_STAT.RESET=1，也可清零。|
|\[0\]|TSA|STB发送取消位1：取消已经通过TSONE或者TSALL置1请求但还未开始的STB发送，软件写1，硬件清零。写1可以清零TSONE或者TSALL位0：不取消一般TSA和TSONE/TSALL，不同时置位。CAN_CFG_STAT.RESET=1可清零TSA|

#### CAN_TCTRL 发送控制寄存器

地址：0x4001_88A2

复位值：0x90

表21-17发送控制寄存器CAN_TCTRL

|||||||||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
|15|14|13|12|11|10|9|8|7|6|5|4|3|2|1|0|
|||||||||FD_ISO|TSNEXT|TSMODE|TTTBM|Recv.||TSSTAT||
|||||||||RW|RW|RW|RW|RO||RO||
|||||||||1|0|0|1|0||0||

||||
|---|---|---|
|位置|位名称|说明|
|\[7\]|FD_ISO|CAN FD ISO 模式0 - 博世 CAN FD（非 ISO）模式1 - ISO CAN FD 模式 (ISO 11898-1:2015)ISO CAN FD模式具有不同的CRC初始化值和额外的填充位计数。两种模式不兼容，不能在一个CAN网络中混合使用。该位对CAN 2.0B没有影响。该位仅在 RESET=1时可写。|
|\[6\]|TSNEXT|更新STB Slot位置1：更新0：不更新当前的STB Slot填满数据后，软件置位TSNEXT，硬件自动指向下一个STB Slot，此时，TSONE/TSALL置位，即可发送被填满的STB Slot。可以同时设置TSNEXT和TSONE或TSALL。如果TBSEL=0，则设置TSNEXT没有意义，TSNEXT的配置将被忽略并自动清除。如果STB的所有Slot都已填满，则TSNEXT将保持置位状态，直到Slot有空闲，才会被硬件清零。|
|\[5\]|TSMODE|发送缓冲器STB工作模式0 - FIFO模式1 - 优先级模式在FIFO模式下，帧按照写入STB的顺序传输。 在优先级模式下，STB 中优先级最高的帧会先发送。 帧的ID用于优先级判定。较小的ID意味着帧的优先级更高。PTB中的帧始终具有最高优先级，与ID无关。只有当 STB为空时，才可以切换TSMODE。|
|\[4\]|TTTBM|TTCAN 发送缓冲模式如果TTEN=0，则忽略TTTBM，如果TTEN=1，根据TTTBM不同值：0 - 单独的PTB和STB，由TSMODE定义缓冲区行为1 - 完整的TTCAN支持：消息槽可由TBPTR 和TTPTR选择对于事件驱动的 CAN 通信 (TTEN=0)，系统提供PTB和STB，STB 的行为由TSMODE定义，忽略TTTBM设定。对于支持时间触发传输在内的所有功能的TTCAN 通信 (TTEN=1)，需要选择TTTBM=1。 此时使用TTPTR和TBPTR可寻址所有TB消息槽。对于仅支持接收时间戳的时间触发CAN通信 (TTEN=1)，可以选择 TTTBM=0。发送缓冲器在事件驱动模式下工作，并且可以通过 TSMODE 选择缓冲区行为。只有当TBUF为空时，才可以切换TTTBM。|
|\[3:2\]|Resv.||
|\[1:0\]|TSSTAT|STB状态位3：STB满2：STB大于半满1：STB小于等于半满0：STB空|

#### CAN_RCTRL 接收控制寄存器

地址：0x4001_88A3

复位值：0x0

表21-18接收控制寄存器CAN_RCTRL

|||||||||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
|15|14|13|12|11|10|9|8|7|6|5|4|3|2|1|0|
|||||||||SACK|ROM|ROV|RREL|RBALL||RSTAT||
|||||||||RW|RW|RO|RW|RW||RO||
|||||||||0|0|0|0|0||0||

||||
|---|---|---|
|位置|位名称|说明|
|\[7\]|SACK|自应答1：LBME=1时，使能自应答功能0：无自应答|
|\[6\]|ROM|Rx Buffer满，溢出控制位1：新接收到的数据不被存储0：最早接收到的数据被覆盖|
|\[5\]|ROV|Rx Buffer溢出标志位1：溢出，最少有一帧数据丢失。通过写RREL为1清零0：无溢出|
|\[4\]|RREL|释放Rx Buffer Slot1：软件已经取走当前Rx Buffer Slot数据，可释放当前Rx Buffer Slot，硬件指向下一个Rx Buffer Slot0：无释放操作|
|\[3\]|RBALL|接收Rx Buffer存储通过ID滤波的帧1：存储所有的CAN帧，包括错误的帧0：正常模式，仅存储正确的CAN帧|
|\[2\]|--|保持默认值|
|\[1:0\]|RSTAT|Rx Buffer状态位3：满（溢出状态下，保持此值）2：Rx Buffer已经接收的帧的数量大于等于AFWL的值，但未满1：Rx Buffer已经接收的帧的数量小于AFWL的值0：Rx Buffer已经接收的帧的数量为0，空|

#### CAN_RTIE 发送接收中断控制寄存器

地址：0x4001_88A4

复位值：0xFE

表21-19发送接收中断控制寄存器CAN_RTIE

|||||||||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
|15|14|13|12|11|10|9|8|7|6|5|4|3|2|1|0|
|||||||||RIE|ROIE|RFIE|RAFIE|TPIE|TSIE|EIE|TSFF|
|||||||||RW|RW|RW|RW|RW|RW|RW|RO|
|||||||||1|1|1|1|1|1|1|0|

||||
|---|---|---|
|位置|位名称|说明|
|\[7\]|RIE|接收中断使能（Receive Interrupt Enable）1：使能0：禁止|
|\[6\]|ROIE|接收溢出中断使能（Receive Overrun Interrupt Enable）1：使能0：禁止|
|\[5\]|RFIE|Rx Buffer满中断使能（Rx Buffer Full Interrupt Enable）1：使能0：禁止|
|\[4\]|RAFIE|Rx Buffer将满中断使能（Rx Buffer Almost Full Interrupt Enable）1：使能0：禁止|
|\[3\]|TPIE|PTB发送中断使能（Transmission Primary Interrupt Enable）1：使能0：禁止|
|\[2\]|TSIE|STB发送中断使能（Transmission Secondary Interrupt Enable）1：使能0：禁止|
|\[1\]|EIE|错误中断使能（Error Interrupt Enable）1：使能0：禁止|
|\[0\]|TSFF|Tx Buffer标志位1：STB Slot被全部填满0：STB Slot没有被全部填满|

#### CAN_RTIF 发送接收中断标志寄存器

地址：0x4001_88A5

复位值：0x0

表21-20发送接收中断标志寄存器CAN_RTIF

|||||||||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
|15|14|13|12|11|10|9|8|7|6|5|4|3|2|1|0|
|||||||||RIF|ROIF|RFIF|RAFIF|TPIF|TSIF|EIF|AIF|
|||||||||RW|RW|RW|RW|RW|RW|RW|RW|
|||||||||0|0|0|0|0|0|0|0|

||||
|---|---|---|
|位置|位名称|说明|
|\[7\]|RIF|接收中断标志位（Receive Interrupt Flag）1：接收到有效帧（数据帧或者远程帧），写1清零0：没有接收到有效帧|
|\[6\]|ROIF|接收溢出中断标志位（Receive Overrun Interrupt Flag）1：Rx Buffer至少有一帧未读走的数据被覆盖0：Rx Buffer无覆盖溢出时ROIF和RFIF同时置1，写1清零|
|\[5\]|RFIF|Rx Buffer满中断标志位（Rx Buffer Full Interrupt Flag）1：Rx Buffer满，写1清零0：Rx Buffer未满|
|\[4\]|RAFIF|Rx Buffer将满中断标志位（Rx Buffer Almost Full Interrupt Flag）1：被填充的Rx Buffer Slot数目大于等于AFWL设定值0：被填充的Rx Buffer Slot数目小于AFWL设定值|
|\[3\]|TPIF|PTB发送中断标志（Transmission Primary Interrupt Flag）1：触发PTB发送，发送成功完成。写1清零0：无PTB发送请求，无完成标志|
|\[2\]|TSIF|STB发送中断标志（Transmission Secondary Interrupt Flag）1：触发STB发送，发送成功完成。写1清零0：无STB发送请求，无完成标志|
|\[1\]|EIF|错误中断标志（Error Interrupt Flag）1：错误计数器的值发生变化，大于或者小于错误警告寄存器的设定值。写1清零0：无错误计数器的值从小于错误警告寄存器的设定值变为大于设定值，或者从大于设定值变为小于设定值，均会触发中断标志。另外，进入Bus Off或从Bus Off退出，也会触发。|
|\[0\]|AIF|取消发送中断标志（Abort Interrupt Flag）1：通过TPA和TSA请求的发送消息被成功取消。写1清零0：未取消发送数据AIF没有对应的使能寄存器|

**注：对应使能寄存器使能后，中断标志位才会置位；AIF例外。**

要重置中断标志，软件需要将1写入该标志。
写入0无效。如果在写访问处于活动状态时发生新的中断事件，则该事件将设置标志并覆盖复位。这确保不会丢失任何中断事件。只有在设置了相关的中断使能位时，才会设置中断标志。

#### CAN_ERRINT 错误中断使能和标志寄存器

地址：0x4001_88A6

复位值：0x0

表21-21错误中断使能和标志寄存器CAN_ERRINT

|||||||||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
|15|14|13|12|11|10|9|8|7|6|5|4|3|2|1|0|
|||||||||EWARN|EPASS|EPIE|EPIF|ALIE|ALIF|BEIE|BEIF|
|||||||||RW1C|R|RW|RW|RW|RW|RW|RW|
|||||||||0|0|0|0|0|0|0|0|

||||
|---|---|---|
|位置|位名称|说明|
|\[7\]|EWARN|错误计数值超过门限中断标志位1：RECNT或者TECNT大于等于EWL设定值，写1清零0：RECNT或者TECNT小于EWL设定值|
|\[6\]|EPASS|CAN设备处于被动错误状态1：CAN设备处于被动错误状态0：CAN设备处于主动错误状态|
|\[5\]|EPIE|被动错误中断使能（Error Passive Interrupt Enable）1：使能0：禁止|
|\[4\]|EPIF|被动错误中断标志（Error Passive Interrupt Flag） 1：发生主动错误到被动错误（或者相反）的改变，写1清零0：未发生|
|\[3\]|ALIE|仲裁失败中断使能（Arbitration Lost Interrupt Enable）1：使能0：禁止|
|\[2\]|ALIF|仲裁失败中断标志位（Arbitration Lost Interrupt Flag）1：仲裁失败，写1清零0：仲裁成功|
|\[1\]|BEIE|总线错误中断使能（Bus Error Interrupt Enable）1：使能0：禁止|
|\[0\]|BEIF|总线错误中断标志（Bus Error Interrupt Flag）1：总线错误，写1清零0：无总线错误|

要重置中断标志，软件需要向对应位写1。
写入0无效。如果在写访问处于活动状态时发生新的中断事件，则该事件将令中断标志置位（写清零被覆盖）。这确保不会丢失任何中断事件。只有在设置了相关的中断使能位时，才会令中断标志置位。

#### CAN_LIMIT 错误&警告门限值寄存器

地址：0x4001_88A7

复位值：0x1B

表21-22错误&警告门限值寄存器CAN_LIMIT

|||||||||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
|15|14|13|12|11|10|9|8|7|6|5|4|3|2|1|0|
|||||||||AFWL||||EWL||||
|||||||||RW||||RW||||
|||||||||0x1||||0xB||||

||||
|---|---|---|
|位置|位名称|说明|
|\[7:4\]|AFWL|Rx Buffer快满警告配置值AFWL同Rx Buffer实际接收到的消息数量进行比对，实际数量超过AFWL，触发RAFIF。AFWL=0，无意义，硬件强制配置为1；AFWL超过Rx Buffer实际容量，无意义，硬件强制配置为Rx Buffer实际容量|
|\[3:0\]|EWL|可编程错误警告限值=(EWL+1)×8。可能的极限值：8，16，…128。EWL的值控制EIF。|

#### CAN_SBAUD 慢速波特率配置寄存器

地址：0x4001_88A8

复位值：0x01020203

表21-23慢速波特率配置寄存器CAN\_
SBAUD

|||||||||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
|31|30|29|28|27|26|25|24|23|22|21|20|19|18|17|16|
|S_PRESC|||||||||S_SJW|||||||
|RW|||||||||RW|||||||
|1|||||||||2|||||||
|15|14|13|12|11|10|9|8|7|6|5|4|3|2|1|0|
||S_SEG_2|||||||S_SEG_1||||||||
||RW|||||||RW||||||||
||2|||||||3||||||||

||||
|---|---|---|
|位置|位名称|说明|
|\[31:24\]|S_PRESC|慢速时间量子（Time Quanta）TQ预分频设定值（S_Prescaler），主要配置TQ的大小。慢速TQ = system clock period \*(S_PRESC+1)|
|\[23\]|--|保持默认值|
|\[22:16\]|S_SJW|再同步补偿宽度时间设定（Bit Timing Segment 2） 再同步补偿宽度时间=(S_SJW+1)\*TQ|
|\[15\]|--|保持默认值|
|\[14:8\]|S_SEG_2|慢速bit时间段2时间单元设定（Bit Timing Segment 2）慢速bit时间段2时间=(S_SEG_2+1)\*TQ|
|\[7:0\]|S_SEG_1|慢速bit时间段1时间单元设定（Bit Timing Segment 1）慢速bit时间段1时间=(S_SEG_1+2)\*TQ|

#### CAN_FBAUD 快速波特率配置寄存器

地址：0x4001_88AC

复位值：0x01010101

表21-24快速波特率配置寄存器CAN\_
FBAUD

|||||||||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
|31|30|29|28|27|26|25|24|23|22|21|20|19|18|17|16|
|F_PRESC||||||||||||F_SJW||||
|RW||||||||||||RW||||
|1||||||||||||1||||
|15|14|13|12|11|10|9|8|7|6|5|4|3|2|1|0|
|||||F_SEG_2|||||||F_SEG_1|||||
|||||RW|||||||RW|||||
|||||1|||||||1|||||

||||
|---|---|---|
|位置|位名称|说明|
|\[31:24\]|F_PRESC|快速时间量子TQ预分频率设定值（F_Prescaler），主要配置TQ的大小。快速TQ = system clock period \*(F_PRESC+1)|
|\[23\]|--|保持默认值|
|\[22:16\]|F_SJW|再同步补偿宽度时间设定（Bit Timing Segment 2） 再同步补偿宽度时间=(F_SJW+1)\*TQ|
|\[15\]|--|保持默认值|
|\[3:0\]|F_SEG_2|快速bit时间段2时间单元设定（Bit Timing Segment 2）快速bit时间段2时间=(F_SEG_2+1)\*TQ|
|\[4:0\]|F_SEG_1|快速bit时间段1时间单元设定（Bit Timing Segment 1）快速bit时间段1时间=(F_SEG_1+2)\*TQ|

#### CAN_EALCAP 错误信息和丢失仲裁信息记录寄存器

地址：0x4001_88B0

复位值：0x0

表21-25错误信息和丢失仲裁信息记录寄存器CAN_EALCAP

|||||||||||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
|15|14|13|12|11|10|9|8|7|6|5|4|||3|2|1|0|
|||||||||KOER||||ALC||||||
|||||||||RO||||RO||||||
|||||||||0||||0||||||

||||
|---|---|---|
|位置|位名称|说明|
|\[7:5\]|KOER|错误类别（Kind Of Error）0：无错误1：位错误2：形式错误3：填充错误4：应答错误5：CRC错误6：其他错误7：保留有错误时KOER位更新，正常发送接收时KOER位保持不变。|
|\[4:0\]|ALC|仲裁失败位置捕捉（Arbitration Lost Capture）仲裁失败时ALC记录一帧数据仲裁失败时的bit位置|

#### CAN_TDC 发送延迟补偿寄存器

地址：0x4001_88B1

复位值：0x0

表21-26发送延迟补偿寄存器CAN_TDC

|||||||||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
|15|14|13|12|11|10|9|8|7|6|5|4|3|2|1|0|
|||||||||TDCEN|SSPOFF|||||||
|||||||||RW|RW|||||||
|||||||||0|0|||||||

||||
|---|---|---|
|位置|位名称|说明|
|\[7\]|TDCEN|发送延迟补偿使能如果TDCEN=1，BRS处于活动状态，则TDC将在CAN FD帧的数据阶段被激活。有关TDC的更多详细信息，请参见21.7.6。|
|\[6:0\]|SSPOFF|次采样点偏移发送延迟加上SSPOFF定义了TDC的辅助采样时间点。SSPOFF的计数单位为TQ。|

仅当CAN_CFG_STAT.RESET=1时，才能写入S_Seg_1、S_Seg_2、S_SJW、S_PRESC、F_Seg_1、F_Seg_2、F_SJW、F_PRESC和TDC。

其中的所有时序参数均针对慢速（前缀“S\_”）和快速（前缀“F\_”）给出。慢速用于CAN
2.0和CAN FD 仲裁阶段。快速用于CAN FD数据阶段。

#### CAN_RECNT 接收错误计数器寄存器

地址：0x4001_88B2

复位值：0x00

表21-27接收错误计数器寄存器CAN\_
RECNT

|||||||||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
|15|14|13|12|11|10|9|8|7|6|5|4|3|2|1|0|
|||||||||RECNT||||||||
|||||||||RO||||||||
|||||||||0||||||||

||||
|---|---|---|
|位置|位名称|说明|
|\[7:0\]|RECNT|接收错误计数器（Receive Error Count）接收错误计数器根据CAN协议规定的错误计数增加或者减少。该计数器不存在上溢，255为最大值|

#### CAN_TECNT 发送错误计数器寄存器

地址：0x4001_88B3

复位值：0x00

表21-28发送错误计数器寄存器CAN\_
TECNT

|||||||||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
|15|14|13|12|11|10|9|8|7|6|5|4|3|2|1|0|
|||||||||TECNT||||||||
|||||||||RO||||||||
|||||||||0||||||||

||||
|---|---|---|
|位置|位名称|说明|
|\[7:0\]|TECNT|发送错误计数器（Transmit Error Count）发送错误计数器根据CAN协议规定的错误计数增加或者减少。该计数器不存在上溢，255为最大值|

#### CAN_ACFCTRL ID 过滤器控制寄存器

地址：0x4001_88B4

复位值：0x00

表21-29
ID过滤器控制寄存器CAN\_ ACFCTRL

|||||||||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
|15|14|13|12|11|10|9|8|7|6|5|4|3|2|1|0|
|||||||||||SELMASK||ACFADR||||
|||||||||||RW||RW||||
|||||||||||0||0||||

||||
|---|---|---|
|位置|位名称|说明|
|\[7:6\]|--|保持默认值|
|\[5\]|SELMASK|选择ID过滤器的屏蔽寄存器（Select Acceptance MASK） 1：ACF指向ID过滤器掩码AMR寄存器（MASK）0：ACF指向ID过滤器ACR寄存器通过ACFADR选择具体的筛选寄存器组|
|\[4\]|--|保持默认值|
|\[3:0\]|ACFADR|ID过滤器地址（Acceptance Filter Address）ACFADR指向具体的ID过滤器，通过SELMASK去区分ACR和AMR。0：指向ACF_01：指向ACF_12：指向ACF_23：指向ACF_34：指向ACF_45：指向ACF_56：指向ACF_67：指向ACF_78：指向ACF_89：指向ACF_910：指向ACF_1011：指向ACF_1112：指向ACF_1213：指向ACF_1314：指向ACF_1415：指向ACF_15|

通过接收过滤器寄存器CAN_ACF访问接收过滤器选通ACODE_x和接收过滤器掩码AMASK_x时，取决于SELMASK的设置。仅当CAN_CFG_STAT.RESET=1时才能对CAN_ACF进行写访问。

【图片已删除】为控制知识库体积，本文档不携带图片，相关图示请查阅凌鸥创芯官网发布的正式手册。

图 21-10
接收过滤器

#### CAN_TIMECFG CiA603 时间戳配置寄存器

地址：0x4001_88B5

复位值：0x02

表21-30
CiA603时间戳配置寄存器CAN_TIMECFG

|||||||||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
|15|14|13|12|11|10|9|8|7|6|5|4|3|2|1|0|
|||||||||||||||TIMEPOS|TIMEEN|
|||||||||||||||RW|RW|
|||||||||||||||1|0|

||||
|---|---|---|
|位置|位名称|说明|
|\[7:2\]|--|保持默认值|
|\[1\]|TIMEPOS|时间戳位置0 - SOF1 - EOFTIMEPOS只能在TIMEEN=0时更改，但可以在设置TIMEEN=1的同时修改TIMPOS。|
|\[0\]|TIMEEN|时间戳使能0 - 禁用1 - 启用|

#### CAN_ACFEN ID 过滤器使能寄存器

地址：0x4001_88B6

复位值：0x1

表21-31
ID过滤器使能寄存器CAN_ACFEN

||||||||||||||||||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
|15||14||13||12||11||10||9||8||7||6|5|4|3|2|1|0|
|AE_15|AE_14||AE_13||AE_12||AE_11||AE_10||AE_9||AE_8||AE_7||AE_6||AE_5|AE_4|AE_3|AE_2|AE_1|AE_0|
|RW|RW||RW||RW||RW||RW||RW||RW||RW||RW||RW|RW|RW|RW|RW|RW|
|0|0||0||0||0||0||0||0||0||0||0|0|0|0|0|1|

||||
|---|---|---|
|位置|位名称|说明|
|\[31:16\]||未使用|
|\[15\]|AE_15|ACF_15使能（Acceptance Filter 15 Enable）1：使能0：禁止|
|\[14\]|AE_14|ACF_14使能（Acceptance Filter 14 Enable）1：使能0：禁止|
|\[13\]|AE_13|ACF_13使能（Acceptance Filter 13 Enable）1：使能0：禁止|
|\[12\]|AE_12|ACF_12使能（Acceptance Filter 12 Enable）1：使能0：禁止|
|\[11\]|AE_11|ACF_11使能（Acceptance Filter 11 Enable）1：使能0：禁止|
|\[10\]|AE_10|ACF_10使能（Acceptance Filter 10 Enable）1：使能0：禁止|
|\[9\]|AE_9|ACF_9使能（Acceptance Filter 9 Enable）1：使能0：禁止|
|\[8\]|AE_8|ACF_8使能（Acceptance Filter 8 Enable）1：使能0：禁止|
|\[7\]|AE_7|ACF_7使能（Acceptance Filter 7 Enable）1：使能0：禁止|
|\[6\]|AE_6|ACF_6使能（Acceptance Filter 6 Enable）1：使能0：禁止|
|\[5\]|AE_5|ACF_5使能（Acceptance Filter 5 Enable）1：使能0：禁止|
|\[4\]|AE_4|ACF_4使能（Acceptance Filter 4 Enable）1：使能0：禁止|
|\[3\]|AE_3|ACF_3使能（Acceptance Filter 3 Enable）1：使能0：禁止|
|\[2\]|AE_2|ACF_2使能（Acceptance Filter 2 Enable）1：使能0：禁止|
|\[1\]|AE_1|ACF_1使能（Acceptance Filter 1 Enable）1：使能0：禁止|
|\[0\]|AE_0|ACF_0使能（Acceptance Filter 0 Enable）1：使能0：禁止Filter 0 默认开启|

每个接收过滤器 (AMASK / ACODE)
可以单独启用或禁用。硬件复位后，默认仅启用Filter
0。禁用的过滤器拒绝接收任何消息。只有启用的过滤器进行适当的AMASK/ACODE配置才能接收消息。

要接收所有消息，须设置AE_x=1来启用一个过滤器x，同时AMASK_x=0xFF和ACODE_x=0x00。这是Filter
0硬件复位后的默认配置，而所有其他过滤器都被禁用。

#### CAN_ACF ID 过滤器寄存器

地址：0x4001_88B8

复位值：0x0

表21-32
ID过滤器寄存器CAN_ACF

|||||||||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
|31|30|29|28|27|26|25|24|23|22|21|20|19|18|17|16|
||IDCMP|IDMASK|ID ACR \[28:16\] or AMR \[28:16\]|||||||||||||
||RW|RW|RW|||||||||||||
||0|0|0|||||||||||||
|15|14|13|12|11|10|9|8|7|6|5|4|3|2|1|0|
|ID ACR \[15:00\] or AMR \[15:00\]||||||||||||||||
|RW||||||||||||||||
|0||||||||||||||||

||||
|---|---|---|
|位置|位名称|说明|
|\[31\]|--|保持默认值|
|\[30\]|IDCMP|SELMASK=1时有效，ID AMR（MASK）选择作用范围1：ID过滤器只接收标准帧或者扩展帧，由IDMASK进一步指定0：ID过滤器接收标准帧和扩展帧两种格式|
|\[29\]|IDMASK|IDCMP位为1时，MASK选择哪种帧格式1：ID过滤器仅接收扩展帧格式0：ID过滤器仅接收标准帧格式|
|\[28:0\]|ID CODE/MASK|CAN_ACFCTRL.ACFADR选择具体的ID过滤器组SELMASK=0，表示ID过滤器选择的是ID ACRSELMASK=1，表示ID过滤器选择的是ID AMR标准帧格式时ID ACR/AMR的范围是Bit10-Bit0，扩展帧格式时的范围是Bit28-Bit0|

#### CAN_TBSLOT TTCAN 发送缓冲区指针寄存器

地址：0x4001_88BE

复位值：0x00

表21-33
TTCAN 发送缓冲区指针CAN_TBSLOT

|||||||||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
|15|14|13|12|11|10|9|8|7|6|5|4|3|2|1|0|
|||||||||TBE|TBF|TBPTR||||||
|||||||||RW|RW|RW||||||
|||||||||0|0|0||||||

||||
|---|---|---|
|位置|位名称|说明|
|\[7\]|TBE|将PTB/STB消息槽设置为“空”1 - 将TBPTR选择的消息标记为“空的”0 - 无动作一旦消息槽被标记为空且TSFF=0，TBE就会自动重置为0。如果消息正在被发送，则只要发送完成或在传输错误或仲裁丢失之后传输不再进行，TBE就会保持置位状态。如果TBF和TBE同时被设置为1，则TBE优先。|
|\[6\]|TBF|将TB消息槽设置为“已填充”1 - TBPTR选择的消息应标记为 “填充”0 - 无动作一旦消息槽被标记为已满且TSFF=1，TBF就会自动重置为0。如果TBF 和TBE同时被设置为1，则TBE优先。|
|\[5:0\]|TBPTR|指向TB消息的指针。0x00 - 指向PTB其他 - 指向STB中的消息槽TBPTR 指向的消息槽可以使用TBUF寄存器读取/写入。只有在 TSFF=0 时才能进行写访问。将TBF设置为1将所选消息槽标记为已填充，将TBE设置为1将所选消息槽标记为空。TBSEL和TSNEXT在TTCAN模式下无意义。TBPTR 仅限于PTB和STB消息槽。如果TBPTR太大并指向一个不可用的消息槽，则TBF和TBE将自动重置并且不执行任何操作。|

#### CAN_TTCFG TTCAN 配置寄存器

地址：0x4001_88BF

复位值：0x90

表21-34
TTCAN 配置寄存器CAN_TTCFG

|||||||||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
|15|14|13|12|11|10|9|8|7|6|5|4|3|2|1|0|
|||||||||WTIE|WTIF|TEIF|TTIE|TTIF|T_PRESC||TTEN|
|||||||||RW|RW|RW|RW|RW|RW||RW|
|||||||||1|0|0|1|0|0||0|

||||
|---|---|---|
|位置|位名称|说明|
|\[7\]|WTIE|超时监测触发中断使能|
|\[6\]|WTIF|超时监测触发中断标志如果循环计数达到由TT_WTRIG 定义的门限值并且WTIE=1，则WTIF置位|
|\[5\]|TEIF|触发错误中断标志TEIF始终使能|
|\[4\]|TTIE|时间触发中断使能如果设置TTIE=1，则如果循环计数等于触发时间TT_TRIG，则TTIF置位。|
|\[3\]|TTIF|时间触发中断标志如果设置TTIE=1并且循环计数等于触发时间TT_TRIG，则TTIF置位。向TTIF写入1清零。写0无影响。TTIF将只设置一次。如果TT_TRIG没有更新，则在下一个基本周期中不会再次设置TTIF。|
|\[2:1\]|T_PRESC|TTCAN 定时器预分频设置00 - 101 - 210 - 411 - 8TTCAN时基是由S_PRES、S_SEG_1和S_SEG_2定义的CAN bit时间。使用T_PRESC定义了额外的预分频因子1、2、4 或 8。T_PRESC只能在TTEN=0时修改，但可以在修改T_PRESC的同时设置 TTEN=1。|
|\[0\]|TTEN|TTCAN启用1 - TTCAN启用，循环计数定时器开启计数0 - 禁用|

要重置中断标志，软件需要写入1。写入0无效。如果在写访问处于活动状态时发生新的中断事件，则该事件将置位中断标志（写清零被覆盖）。这确保了不会丢失任何中断事件。

在设置了相关的中断使能位时，才会设置中断标志。

#### CAN_REF_MSG TTCAN 参考帧寄存器

地址：0x4001_88C0

复位值：0x00

表21-35
TTCAN参考帧寄存器CAN_REF_MSG

||||||||||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
|31|30|29||28|27|26|25|24|23|22|21|20|19|18|17|16|
|REF_IDE|||REF_ID||||||||||||||
|RW|||RW||||||||||||||
|0|||0||||||||||||||
|15|14|13||12|11|10|9|8|7|6|5|4|3|2|1|0|
|REF_ID|||||||||||||||||
|RW|||||||||||||||||
|0|||||||||||||||||

||||
|---|---|---|
|位置|位名称|说明|
|\[31\]|REF_IDE|参考帧IDE位|
|\[30:29\]|||
|\[28:0\]|REF_ID|参考帧标识符。如果REF_IDE是1 - REF_ID(28:0) 有效（扩展 ID）0 - REF_ID(10:0) 有效（标准 ID）REF_ID在TTCAN模式下用于检测参考帧。这适用于时间从站（接收）以及时间主站（传输）。如果检测到参考帧并且没有错误，则该帧的 Sync_Mark将成为Ref_Mark。REF_ID(2:0)强制为0。CAN控制器仅通过ID识别参考帧。有效载荷未经测试。附加说明：时间主机发送参考帧的方式和正常帧相同。 REF_ID用于检测参考帧的成功传输。|

表21-4给出了REF_MSG_0到REF_MSG_2内REF_ID和REF_IDE的bit位置定义。

对CAN_REF_MSG的写访问将参考帧同步到CAN时钟域。在此期间对CAN_REF_MSG的再次写操作被禁用。

#### CAN_TRG_CFG TTCAN 触发配置寄存器

地址：0x4001_88C4

复位值：0x00

表21-36
TTCAN触发配置寄存器CAN_TRG_CFG

|||||||||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
|15|14|13|12|11|10|9|8|7|6|5|4|3|2|1|0|
|TEW|||||TTYPE|||||TTPTR||||||
|RW|||||RW|||||RW||||||
|0|||||0|||||0||||||

||||
|---|---|---|
|位置|位名称|说明|
|\[15:12\]|TEW|发送使能窗口对于单次发射触发，允许帧开始的循环时间最多有16个cycle。 TWE+1 定义了cycle数。见章节TTCAN Timin。TEW=0 将传输启用窗口缩短到1个cycle。|
|\[11\]||保留位|
|\[10:8\]|TTYPE|触发类型000 - 立即触发发送001 - 定时触发010 - 单次发射触发，针对独家时间窗口011 - 传输开始触发，针对合并仲裁时间窗口 100 - 传输停止触发，针对合并仲裁时间窗口其他- 无动作触发时间由TT_TRIG定义。TTPTR选择TB中的消息。|
|\[7:6\]||保留位|
|\[5:0\]|TT_PTR|TB发送消息指针如果TTPTR 太大并指向不可用的消息槽，则TEIF置位，并且在对 TT_TRIG进行写访问后无法产生新的触发。如果TTPTR指向一个空槽，那么TEIF将在触发发送时被设置。|

#### CAN_TT_TRIG TTCAN 触发时刻寄存器

地址：0x4001_88C6

复位值：0x00

表21-37
TTCAN触发时刻寄存器CAN_TT_TRIG

|||||||||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
|15|14|13|12|11|10|9|8|7|6|5|4|3|2|1|0|
|TT_TRIG||||||||||||||||
|RW||||||||||||||||
|0||||||||||||||||

||||
|---|---|---|
|位置|位名称|说明|
|\[15:0\]|TT_TRIG|触发时间TT_TRIG定义了触发时间。对于发送触发，相应帧的SOF的最早传输点将是 TT_TRIG+1。|

对 TT_TRIG的写操作会将触发相关配置同步到CAN
时钟域。如果触发正处于活动状态，则所有寄存器 TRIG_CFG、TT_TRIG
的写入都被禁止。当达到触发时间（TTIF 置位）或检测到错误（TEIF
置位）时，写锁定解除。

#### CAN_TT_WTRIG TTCAN 超时寄存器

地址：0x4001_88C8

复位值：0xFFFF

表21-38
TTCAN超时寄存器CAN_TT_WTRIG

|||||||||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
|15|14|13|12|11|10|9|8|7|6|5|4|3|2|1|0|
|TT_WTRIG||||||||||||||||
|RW||||||||||||||||
|0xFFFF||||||||||||||||

||||
|---|---|---|
|位置|位名称|说明|
|\[15:0\]|TT_WTRIG|超时触发时间TT_WTRIG定义了超时触发周期。初始值是最大周期时间0xFFFF。|

对
TT_WTRIG的写操作触发寄存器值同步到CAN时钟域，耗时6个CAN时钟。在此期间，寄存器TT_WTRIG禁止再次写入。

#### CAN_CIAWDAT0 CiA603 时间戳低32位写入值寄存器

地址：0x4001_88D0

复位值：X

表21-39
CiA603时间戳低32位写入值寄存器CAN_CIAWDAT0

|||||||||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
|31|30|29|28|27|26|25|24|23|22|21|20|19|18|17|16|
|WDATA||||||||||||||||
|RW||||||||||||||||
|X||||||||||||||||
|15|14|13|12|11|10|9|8|7|6|5|4|3|2|1|0|
|WDATA||||||||||||||||
|RW||||||||||||||||
|X||||||||||||||||

||||
|---|---|---|
|位置|位名称|说明|
|\[31:0\]|WDATA|CiA603时间戳低32位写入值|

#### CAN_CIAWDAT1 CiA603 时间戳高32位写入值寄存器

地址：0x4001_88D4

复位值：X

表21-40
CiA603时间戳高32位写入值寄存器CAN_CIAWDAT1

|||||||||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
|31|30|29|28|27|26|25|24|23|22|21|20|19|18|17|16|
|WDATA||||||||||||||||
|RW||||||||||||||||
|X||||||||||||||||
|15|14|13|12|11|10|9|8|7|6|5|4|3|2|1|0|
|WDATA||||||||||||||||
|RW||||||||||||||||
|X||||||||||||||||

||||
|---|---|---|
|位置|位名称|说明|
|\[31:0\]|WDATA|CiA603时间戳高32位写入值|

## 一般操作

本章介绍CAN通信操作。在进行通信之前，须配置CAN控制器以匹配CAN总线时序。

### 接收过滤器

为了减少CPU接收帧的负载，可以配置CAN控制器使用接收过滤器。
CAN控制器在接收过滤期间检查消息标识符。因此，每个接收过滤器的长度为29bit。

如果消息通过其中一个过滤器，那么它将被接收，并将存储到 RB
中，如果RIE=1，则RIF被置位。如果消息未被接收，则不设置RIF并且不增加RB
FIFO指针。未被接收的消息将被丢弃并被下一条消息覆盖。没有存储的有效消息将被后续消息覆盖。

独立于接收过滤的结果，CAN控制器检查总线上的每条消息并向总线发送确认或错误帧。

【图片已删除】为控制知识库体积，本文档不携带图片，相关图示请查阅凌鸥创芯官网发布的正式手册。

图
21-11 接收过滤示例

接收掩码定义了需要将过滤器的哪些位和接收消息ID进行比较判断。掩码位设置为0，则接收ID与相应的消息标识符位进行比较。掩码位设置为1则不进行接收检查，从而接收消息。

ID与相应的ACODE进行比较，如下所示：

- - - - 标准帧： ID(10:0) 与 ACODE(10:0)
      - 扩展帧： ID(28:0) 与 ACODE(28:0)

示例：如果AMASK_x(0)=0 且所有其他 AMASK_x 位为 1，则最后一个 ID
位的值必须等于 ACODE(0) 才能接收消息。过滤器忽略所有其他 ID 位。

图 21-8给出了一个使用多个过滤器的接收过滤示例。在此示例中，过滤器0和1由
ACF_EN_x
寄存器中的相应AE_x位启用。所有其他过滤器都被禁用，因此不接收任何消息。对于启用的过滤器，AMASX_x和ACODE_x的组合定义了消息是被接收（如过滤器0）还是不被接收（如过滤器1）。

注意：通过设置AE_x=0，被禁用过滤器会阻止消息被接收。相反，设置AMASK_x中的掩码位=1会禁用对该位的检查，从而允许接收消息。

AMASK和ACODE的定义不区分标准帧或扩展帧。如果CAN_ACF.IDCMP=1，则接收帧类型由CAN_ACF.IDMASK决定。如果CAN_ACF.IDCMP=0则两种类型帧都被接收。

上电复位后，CAN控制器被配置为接收所有消息。上电后复位后，过滤器0由AE_0=1启用，AMASK_0中的所有位都设置为1并且CAN_ACF.IDCMP=0。所有其他过滤器都被禁用。过滤器0是唯一为AMASK
/ ACODE 定义了复位值的过滤器，而所有其他过滤器都未定义复位值。

### 消息接收

接收到的数据将存储在RB中。RB具有类似FIFO的行为。如果启用RIE，则每条接收到的有效消息都会设置RIF=1。
RSTAT根据填充状态设置。当填充缓冲区的数量等于可编程值AFWL时，如果设置了RAFIE=1，则RAFIF置位。如果所有缓冲区都已满，若设置了RFIE=1，则RFIF置位。

【图片已删除】为控制知识库体积，本文档不携带图片，相关图示请查阅凌鸥创芯官网发布的正式手册。

图
21-12 类似FIFO的RB示意图（6个消息槽的示例）

RB总是将最早消息映射到RBUF寄存器。

CAN 2.0消息的最大有效负载长度为8个字节，CAN
FD消息为64个字节。每条消息的数据长度由DLC定义。RB为每个消息提供了消息槽，并且主机软件需要设置RREL以跳转到下一个RB消息槽。RBUF的所有字节都可以按任何顺序读取。

如果RB已满，则将临时存储下一个传入的消息。然后如果ROM=0，最早的消息将被最新的消息覆盖；如果ROM=1，则最新的消息将被丢弃。如果启用ROIE，则在这两种情况下都会导致ROIF置位。如果主机软件读取了一条消息，并在新消息传入之前设置RREL，则不会有消息被覆盖丢失。

如果没有接收过滤，CAN控制器每接收到每一帧，都会告知CPU。这将导致CPU的负载相当大。

可以通过禁用中断并使用接收过滤器来减少主机控制器的负载。如果启用RIE并且CAN控制器已接收到有效消息，则RIF被设置为1。为了减少接收中断的数量，可以使用RAIE/RAIF（RB几乎满中断）或RFIE
/ RFIF（RB 满中断）代替RIE / RIF（接收中断）。 “RB几乎满门限”可使用 AFWL
进行编程。

读取 RB 的步骤如下：

1.  使用RBUF寄存器从RB FIFO中读取最早的消息。
2.  设置RREL=1以释放RB消息槽。硬件会选择下一条消息（下一个FIFO槽）。
    RBUF 将会被自动更新。
3.  重复以上操作，直到RSTAT指示RB空。

如果RB FIFO已满并且新接收到的消息被识别为有效（6<sup>th</sup>
EOF），则将丢失一个消息。为了让主机控制器有足够的时间，能够在RB
FIFO被填满且发生中断之后从RB读取至少一帧，RB包含一个（隐藏）消息槽用于接收消息，验证它并在溢出发生之前检查它是否与接收过滤器匹配。

### 消息发送

在开始任何发送之前，至少有一个发送缓冲区（PTB 或
STB）已加载消息。TPE指示PTB
FIFO空满，TSSTAT指示STB的填充状态。TBUF寄存器提供对PTB和STB的访问。以下是推荐的编程流程：

【图片已删除】为控制知识库体积，本文档不携带图片，相关图示请查阅凌鸥创芯官网发布的正式手册。

图
21-13 FIFO模式下的PTB和STB示意图（空PTB和6个STB消息槽）

CAN 2.0消息的最大有效负载长度为8个字节，CAN
FD消息为64个字节。每条消息的长度由DLC定义。对于远程帧（RTR=1），DLC无意义，因为远程帧的数据长度始终为0字节。主机控制器需要设置TSNEXT以跳转到下一个STB消息槽。所有TBUF字节都可以按任何顺序写入。

如果TBSEL=0选择PTB，则设置TSNEXT=1没有意义。在这种情况下，TSNEXT会自动清零无其他影响。

使用PTB时应设置TPE=1启动传输。要使用STB，须设置TSONE=1开始传输单个消息或设置
TSALL=1以传输STB中的所有消息。

PTB的优先级总是高于STB。无论帧标识符如何，PTB
消息总是首先发送。如果来自STB的传输已经处于活动状态，它将在来自PTB的消息发送之前完成。在PTB传输完成或中止后，CAN控制器返回处理来自STB的其他消息。

发送完成后，设置以下传输中断：

对于PTB，如果TPIE=1，则TPIF置位

对于STB，如果TSONE=1，一条消息已完成且TSIE=1，则TSIF置位。

对于STB，如果TSALL=1，所有消息都已完成且TSIE=1，则TSIF置位。换句话说：STB发送完成后，则设置TSIF。如果主机控制器在TSALL传输开始后向STB写入附加消息，则附加消息也将在TSIF设置之前进行传输。

### 消息发送中止

实际应用中存在这种情况，传输缓冲区中的消息由于其低优先级而很久无法发送。为了避免这种情况发送，如果传输尚未开始，主控制器可以通过分别设置TPA=1或TSA=1来撤回发送请求。

设置TPA和 TSA都将产生一个中断标志： AIF。
CAN协议状态机只有在没有向CAN总线传输任何内容时才会执行中止。

- - - - 总线仲裁期间不能进行发送中止。
        - 如果节点仲裁失败，则后续执行中止。
        - 如果节点赢得仲裁，则该帧将被发送。
      - 帧传输时不会进行发送中止。
        - 如果一个帧被成功传输，则发送成功中断标志将通知CPU。在这种情况下，不会发生发送中止。
        - 在CAN节点没有收到ACK的情况下，属于传输不成功，错误计数器会增加，可以执行传输中止。
        - 如果STB中至少还剩一帧，而主机已下令发送所有帧
          (TSALL=1)，则将产生帧完成事件和中止事件。

中止传输可能需要一些时间，具体取决于CAN通信速度和帧长度。如果执行中止，则会导致以下动作：

- - - - TPA释放PTB导致TPE=0。
      - 释放PTB后，帧数据仍保存在PTB中。
      - TSA释放STB的单个消息槽或所有消息槽。这取决于是使用TSONE还是TSALL来启动传输。
        TSSTAT将被更新。
        释放STB中的消息将导致消息丢失，因为主机软件无法再访问此消息。

不建议同时设置TPA和TSA。如果主机软件这样做，则AIF置位，来自PTB和STB的传输都将被中止。如前所述，如果在执行中止之前完成一次传输，这将导致发送成功传输标志置位。因此，如果启用，则以下中断标志置位：

- - - - AIF（PTB和STB传输中止）
      - TPIF + AIF
      - TSIF + AIF
      - TPIF + TSIF（非常少见，只有在主机不立即处理TPIF时才会发生）
      - TPIF + TSIF + AIF
        （非常很少，只有在主机不立即处理TPIF和TSIF时才会发生）

要清空整个STB，可以设置TSALL和TSA。为了检测消息是否因为失去仲裁而无法长时间发送，主机可以使用ALIF/ALIE。

### STB空满

写入STB后，设置TSNEXT=1可以将当前缓冲区消息槽标记为已满，并跳转到下一个空闲消息槽。
TSNEXT 在此操作后由 CAN控制器自动复位为 0。

如果最后一个消息槽已被填满，所有消息槽都被占用，则TSNEXT保持为1，直到有新的消息槽空闲。当TSNEXT=1时，写入TBUF被CAN控制器禁止。

当消息槽空闲时，CAN控制器自动将TSNEXT重置为
0。如果STB的帧成功发送或主机请求中止
(TSA=1)，则消息槽变为空闲。如果TSALL传输被中止，则TSNEXT也被复位，并将整个STB标记为空。

### 错误处理

通常，CAN控制器可以自动进行错误处理，这意味着在大多数情况下主机控制器无须关心错误，包括自动重传消息和自动删除收到的错误消息。另一方面，如果主机需要，CAN控制器可以选择性地提供有关错误的详细信息，并通过中断向主机发送每个错误信号。使得能够在主机上运行诸如CAN
总线监视器之类的应用程序。

每个CAN节点都有3种错误处理状态：

1.  Error-Active：节点在检测到错误时自动发送活动错误帧。
2.  Error-Passive：节点在检测到错误时传输被动错误帧，即它不会将显性值传输到总线。
3.  总线关闭：在出现太多错误后，节点进入“总线关闭”状态，停止访问CAN总线。

为了处理这3种错误状态，每个CAN节点都有两个错误计数器：发送错误计数器和接收错误计数器。两者都按照CAN规范的定义递增和递减，并且在节点达到CAN规范定义的计数值时进入适当的错误状态。

如果有错误，错误计数器会增加。由该节点引起的严重错误将导致计数器加8，由其他节点引起的错误将导致计数器加1。有效帧发送或有效接收会令计数器减1。所有这些都由CAN规范定义并由
CAN控制器自动处理。

错误帧（或者更贴切的名称为：错误标志）与数据帧不同。它是至少6个连续显性位的显性脉冲，这对其他节点来说是填充位违规。主机控制器软件不能主动发送错误帧。它由CAN控制器全自动完成。

如果CAN控制器收到指令需要传输一帧，那么它会尝试传输并反复地自动重传，直到该帧被正确传输或节点关闭总线。如果接收到帧并且CAN控制器检测到错误，则丢弃接收到的数据，并发送错误帧，通知帧的发送者将重新传输该帧。
RBUF中的帧永远不会被有错误的帧覆盖。只有有效的接收帧可能导致RBUF溢出。

### BUS Off

“总线关闭”状态由寄存器CAN_CFG_STAT
中的BUSOFF来指示。如果CAN节点的发送错误计数\>255，则CAN节点自动进入“总线关闭”状态。然后它不会参与进一步的通信，直到它再次返回到错误激活状态。如果EIE使能，则BUSOFF置位的同时也会置位EIF中断。如果CAN节点被上电复位或接收到128个11个隐性位序列（恢复序列），则CAN节点返回到错误激活状态。请注意，在每个恢复序列之间，总线可能具有显性状态。

在“总线关闭”状态下，RECNT和TECNT保持不变。需要注意的是，在进入总线关闭状态时，TECNT自动置0，不会再变化。建议在节点进入总线关闭状态之前使用TECNT，之后使用状态位BUSOFF来判断总线状态。

当节点进入总线关闭状态时，TECNT和RECNT的值自动置零，且在总线关闭状态恢复之前，其值都不会有变化；当节点从“总线关闭”状态恢复，RECNT和TECNT重新启用，初始值为0。

如果一帧正在等待传输但CAN节点已进入总线关闭状态，则该帧保持等待状态。如果节点在总线关闭后返回到错误激活状态，则将尝试传输此帧。如果不希望这样做，则应由主机控制器中止该帧。

### 扩展状态和错误报告

在CAN总线通信期间，可能会出现传输错误。以下功能支持对其进行检测和分析。

#### 可编程错误警告门限值

接收/发送期间的错误由RECNT和TECNT计数。主控制器可以使用CAN_LIMIT中的可编程错误警告限制EWL对这些事件做出灵活反应。可以从8到128以8个错误为步长选择门限值：

错误计数门限值= (EWL+1)×8

如果在以下条件下EIE使能，则EIF中断将置位：

- - - - - RECNT 或 TECNT 超过错误警告门限，或超过后再递减至小于警告门限
        - BUSOFF 位被更改。

#### 仲裁丢失捕获 (ALC)

内核能够检测仲裁字段中仲裁丢失的确切位位置。如果启用了ALIF中断，则该事件被记录并且ALIF置位。如果节点能够赢得仲裁，则ALC
的值保持不变，保存上次仲裁失败的旧值。

ALC值定义如下： 一帧以SOF开始，然后开始传输ID的第1bit。
ID的第1bit对应ALC的值 为0，ID的第2bit对应ALC值为1，以此类推。

仲裁只允许在仲裁域中进行。因此，ALC的最大值为 31，即扩展帧中的RTR位。

附加提示：如果标准远程帧与扩展帧进行仲裁，扩展帧在IDE位失去仲裁，ALC将为12。发送标准远程帧的节点不会注意到已发生仲裁，因为这节点赢得了仲裁。

仲裁域之外的仲裁损失是不可能发生的。这样的事件实际是位传输错误。

#### 错误类型 (KOER)

CAN控制器识别 CAN 总线上的错误并将最后一个错误事件存储在 KOER
位中。如果启用了 BEIF 中断，则 CAN
总线错误可以发出中断信号。每个新的错误事件都会覆盖之前存储的 KOER
值。因此，主机控制器必须对错误事件做出快速反应。错误代码见表21-41。

每个新错误都会更新KOER。因此，当成功发送或接收帧时，它保持不变。以便于事后进行错误检查。

#### 接收所有数据帧 (RBALL)

如果
RBALL=1，那么所有接收到的数据帧都会被存储，即使是有错误的。这也适用于环回模式。只有数据帧存储在
RBUF 中。不存储错误帧或过载帧。

如果启用 CiA 603 时间戳 (TIMEEN=1) 功能并且采用EOF时刻为时间戳
(TIMEPOS=1)，则在出现错误的情况下，将在错误帧开始时获取时间戳。

大多数可能的错误只有在节点是帧的发送者时才会发生。在这种情况下，如果激活了环回模式，则帧将仅存储在
RBUF 中。根据错误的类型，存储在 RBUF
时隙中的帧的部分可能是有效的，而其他部分是未知的。

表21-41
RBALL和KOER

||||
|---|---|---|
|KOER|状况|描述|
|NO ERROR|All|接收成功。|
|BIT ERROR|Receiver|只能发生在 ACK中。所有存储的数据都是有效的。|
||Transmitter|有效载荷始终无效。包括ID的帧头可能是有效的。在仲裁阶段检测到错误位属于仲裁授权失败，因此不是位错误。但是如果在仲裁阶段的填充比特被帧的发送器检测到错误，那么则是一个比特错误，帧头是无效的。|
|FORM ERROR|All|仅涵盖数据帧中的FORM ERROR。这包括CRC定界符、ACK定界符或EOF位中的错误。所有存储的数据都是有效的。|
|STUFF ERROR|Receiver|STUFF ERROR的位置未知。所有存储的数据均无效。|
||Transmitter|只能在仲裁期间发生。所有存储的数据均无效。|
|ACK ERROR|Receiver|仅当节点在 LOM 中时才会发生。所有存储的数据都是有效的。|
||Transmitter|只能在没有自ACK的环回模式下发生。所有存储的数据都是有效的。|
|CRC ERROR|Receiver|所有存储的数据均无效。|

请注意，即使（部分）数据在被标志位指示为有效的，也存在可能是包含接收错误的消息数据。例如：如果节点的位时序配置错误，即没有正确同步，也可能收到无效数据。因此，数据（部分）有效的声明仅表明它可能是有效的。

### 扩展功能

#### 单次传输

有时不需要自动重新传输。因此，可以通过设置TPSS=1令发送缓冲器PTB发送一帧，或通过设置TSSS=1令发送缓冲器STB发送一次消息。在这种情况下，在传输发生错误或仲裁丢失时不会执行重新传输。

在立即成功传输的情况下，与正常传输没有区别。但在传输不成功的情况下，会发生以下情况：

- - - - - 如果TPIF=1，则设置相应的发送缓冲区消息槽被清空
        - 如果出现错误，KOER
          和错误计数器会被更新。如果BEI=1，则BEIF会被置位，其他相应错误中断标志将置位。
        - 在仲裁失败的情况下，如果ALIE=1，则ALIF置位。

因此，对于单次传输，TPIF本身并不能指示帧是否已成功传输。单发传输只能与BEIF和ALIF
一起使用。

如果单次传输与TSALL一起使用，并且STB中存在多于一帧，则对每一帧进行单次传输。无论是否有未成功传输（例如，
ACK
错误），CAN控制器都会前进到下一帧并在STB为空时停止。因此，在这种情况下，只有错误计数器可以指示成功发送了多少帧。如果两个帧之一出错，主机无法获知哪一帧被成功发送了。

如果总线被另一帧占用，如果开始单发传输，则CAN控制器等待总线空闲，然后尝试传输单发帧。

#### 监听模式 (LOM)

LOM模式提供了在不影响总线的情况下监控CAN总线的能力。CAN控制器的LOM与CAN
FD规范中定义的总线监控功能兼容。

另一个应用是自动波特率检测，主机控制器尝试不同的时序设置，直到没有错误发生。

在LOM模式中，错误（KOER、BEIF）情况仍被检测。

在LOM模式中，CAN控制器无法将显性位写入总线（没有活动的错误标志或过载标志，没有ACK）。遵从以下规则：

- - - - - 在LOM中，协议状态机就像处于错误被动模式一样，其中只有隐性错误标志被生成。状态寄存器可以被修改。
        - 在LOM中，协议状态机不会生成显性ACK。
        - 无论发生任何错误，错误计数器都保持不变。
        - 如果一个节点传输一帧，那么只有在至少一个附加节点连接到总线上。且不处于LOM模式时，才会在总线上生成一个可见的
          ACK。此时，就不会有 错误，所有节点（也包括 LOM
          中的节点）都将收到该ACK。
        - 如果在ACK错误后主动或被动错误标志置位，则节点会检测到ACK错误。

当节点正在发送时，不应设置成LOM模式。

如果启用LOM，则无法进行发送。

环回模式（外部）LBME对 LOM 的行为起着重要作用。如果禁用
LBME，则节点无法将任何显性位写入总线。但是如果LBME被激活，那么节点就被允许发送self-ACK
(SACK) 帧，但节点不会以 ACK
响应来自其他节点的帧，也不会生成错误或过载帧。总而言之，LOM和LBME的组合是“一个静默的接收器，可以在必要时进行传输”。

#### 总线连接测试

要检查节点是否连接到总线，可以执行以下步骤：

- - - - - 传送一帧。如果节点连接到总线，则在RX线路上可以观测到TX发送的消息。
        - 如果有其他节点连接到CAN总线，则可以预期有其他节点发送ACK。
        - 如果本节点是唯一连接到CAN总线的节点（但总线、收发器和
          CAN控制器内核之间的连接良好），则在ACK位发生错误，因为其他节点没有发送ACK。BEIF错误中断将
          置位并且KOER= “100” （ACK错误）。
        - 如果与收发器或总线的连接断开，则在SOF位之后BEIF错误中断将立即置位并且设置KOER=
          “001” (BIT错误）。

#### 环回模式（LBMI和LBME）

CAN控制器支持两种环回模式：内部回环(LBMI)和外部回环(LBME)。这两种模式都会导致接收到自己发送的帧，便于自检。

在LBMI中，CAN控制器与CAN总线断开连接，并且txd输出设置为隐性电平。输出数据流在内部反馈到输入端。在LBMI中，节点生成自ACK以避免ACK错误。

在LBME中，CAN控制器保持与收发器的连接，传输的帧将在总线上可见。借助收发器，CAN控制器也可以接收到自己发出的帧。在
LBME 中，节点在SACK=0时不生成Self-ACK，但在SACK=1
时生成Self-ACK。因此，在SACK=0的LBME中，帧传输有两种可能的结果：

1.  其他节点收到帧后发出ACK，从而完成一次成功的传输。
2.  总线上无其他节点，导致出现ACK错误。
    如果不了解总线上是否有其他节点，为避免重传和错误计数器递增，建议使用TPSS或TSSS进行发送。

【图片已删除】为控制知识库体积，本文档不携带图片，相关图示请查阅凌鸥创芯官网发布的正式手册。

图
21-14环回模式：内部和外部

在环回模式下，CAN控制会接收自己的消息，将其存储在RBUF中，并设置适当的接收和发送中断标志（如果启用）。

LBMI可用于芯片内部和软件测试，而LBME可以测试收发器及总线连接。

当传输处于活动状态时，不应设置LBMI=1或 LBME=1。主机软件应避免如此配置。
CAN控制器硬件没有额外的保护。

如果节点连接到CAN总线，则不能通过简单地设置LBMI=0来切换回正常操作，因为此时另一个CAN节点可能正在传输。在这种情况下，应通过将位
RESET设置为1来切换回正常操作，自动将LBMI清除为
0。最后设置RESET=0，CAN控制器恢复正常操作。与此相反，LBME每次都可以禁用。

LBME 可以与 LOM 结合使用。

#### 错误计数器复位

根据 CAN/CAN FD
标准RECNT计数接收错误，TECNT计数发送错误。在过多的传输错误之后，CAN节点必须进入总线关闭状态。RESET不会修改错误计数器或总线关闭状态。CAN/CAN
FD规范定义了如何禁用总线关闭状态和减少错误计数器的规则。如果只是发生一个临时错误，节点会自动从错误中恢复。经典的CAN
2.0B规范定义了这种无需主机控制器交互的自动行为。

CAN
FD规范更为灵活，允许主机控制器接管这种自动错误计数器处理机制。但这应该格外小心，建议仅用于调试目的。

向CAN_CFG_STAT.BUSOFF写入1会重置错误计数器，同时强制节点离开总线关闭状态，动作期间EIF不置位。

### 软件复位

CAN_CFG_STAT.RESET=1时，CAN控制器处于件复位状态。但不是CAN控制器内所有模块都被RESET复位。部分模块只会被硬件复位。对于软件和硬件复位，复位值相同。

表21-42
软件复位

||||
|---|---|---|
|寄存器|Reset|描述|
|ACFADR|No|\-|
|ACODE_x|No|如果RESET=1，寄存器可写，如果为0，则写锁定。|
|AE_x|No|\-|
|AFWL|No|\-|
|AIF|Yes|\-|
|ALC|Yes|\-|
|ALIE|No|\-|
|ALIF|Yes|\-|
|AMASK_x|No|如果RESET=1，寄存器可写，如果为0，则写锁定。|
|BEIE|No|\-|
|BEIF|Yes|\-|
|BUSOFF|(No)|写1清零BUSOFF，同时复位的错误计数器|
|EIE|No|\-|
|EIF|No|\-|
|EPASS|No|\-|
|EPIE|No|\-|
|EPIF|Yes|\-|
|EWARN|No|\-|
|EWL|Yes|\-|
|FD_ISO|No|如果RESET=1，寄存器可写，如果为0，则写锁定。|
|F_PRESC|No|如果RESET=1，寄存器可写，如果为0，则写锁定。|
|F_Seg_1|No|如果RESET=1，寄存器可写，如果为0，则写锁定。|
|F_Seg_2|No|如果RESET=1，寄存器可写，如果为0，则写锁定。|
|F_SJW|No|如果RESET=1，寄存器可写，如果为0，则写锁定。|
|KOER|Yes|\-|
|LBME|Yes|\-|
|LBMI|Yes|\-|
|LOM|No|\-|
|RACTIVE|Yes|即使正处于接收状态，接收也会立即取消。不会产生ACK。|
|RAFIE|No|\-|
|RAFIF|Yes|\-|
|RBALL|Yes|\-|
|RBUF|(Yes)|所有RB消息槽都标记为空。RBUF包含未知数据。|
|RECNT|No|通过设置CAN_CFG_STAT.BUSOFF=1可以复位错误计数器。|
|REF_ID|No|\-|
|REF_IDE|No|\-|
|RFIE|No|\-|
|RFIF|Yes|\-|
|RIE|No|\-|
|RIF|Yes|\-|
|ROIE|No|\-|
|ROIF|Yes|\-|
|ROM|No|\-|
|ROV|Yes|所有RB消息槽都标记为空。|
|RREL|Yes|\-|
|RSTAT|Yes|所有RB消息槽都标记为空。|
|SACK|Yes|\-|
|SELMASK|No|\-|
|STBY|No|\-|
|S_PRESC|No|如果RESET=1，寄存器可写，如果为 0，则写锁定。|
|S_Seg_1|No|如果RESET=1，寄存器可写，如果为 0，则写锁定。|
|S_Seg_2|No|如果RESET=1，寄存器可写，如果为 0，则写锁定。|
|S_SJW|No|如果RESET=1，寄存器可写，如果为 0，则写锁定。|
|TACTIVE|Yes|所有传输立即被RESET终止。如果传输正在进行，会引起其他节点会产生错误帧。|
|TBE|Yes|\-|
|TBF|Yes|\-|
|TBPTR|No|\-|
|TBSEL|Yes|TBUF固定指向PTB。|
|TBUF|(Yes)|所有STB消息槽都标记为空。因为TBSEL TBUF指向PTB。|
|TECNT|No|通过设置CAN_CFG_STAT.BUSOFF=1可以复位错误计数器。|
|TEIF|Yes|\-|
|TIMEEN|No|\-|
|TIMEPOS|No|\-|
|TPA|Yes|\-|
|TPE|Yes|\-|
|TSA|Yes|\-|
|TSALL|Yes|\-|
|TSMODE|No|\-|
|TSNEXT|Yes|\-|
|TSONE|Yes|\-|
|TPIE|No|\-|
|TPIF|Yes|\-|
|TPSS|Yes|\-|
|TSFF|Yes|所有STB消息槽都标记为空。|
|TSIE|No|\-|
|TSIF|Yes|\-|
|TSSS|Yes|\-|
|TSSTAT|Yes|所有STB消息槽都标记为空。|
|TTEN|Yes|\-|
|TTIF|Yes|\-|
|TTIE|No|\-|
|TTPTR|No|\-|
|TTS|No|\-|
|TTTBM|No|\-|
|TTYPE|No|\-|
|TT_TRIG|No|\-|
|TT_WTRIG|No|\-|
|T_PRESC|No|\-|
|WTIE|No|\-|
|WTIF|Yes|\-|

## 时间触发 CAN

时间触发 CAN (TTCAN)符合ISO
11898-4标准，帧仅在预定义的时间窗口传输。共有三种时间窗口类型：

- 独家时间窗口 （只允许一个节点传输特定ID的一帧）
- 空闲时间窗口 （未使用的时间窗口，用于进一步扩展网络）
- 仲裁时间窗口 （几个节点可以传输帧，可能发生总线仲裁）

发送时机由TTCAN系统管理节点离线定义。如图
21-12所示，一行称为一个基本循环，它以参考帧开始。参考帧由时间主机发送。包括时间主机在内的任何节点都可以传输其他消息。

【图片已删除】为控制知识库体积，本文档不携带图片，相关图示请查阅凌鸥创芯官网发布的正式手册。

图
21-15 TTCAN时空矩阵示例

消息的SOF时间是Sync_Mark。参考帧的Sync_Mark是Ref_Mark。使用一个16位定时器进行计时。计时器与Ref_Mark的值之间的差异就是循环时间。每个基本循环都在Ref_Mark
处开始一次循环。循环时间作为时间戳存储在RBUF中。

时间窗口的长度由TTCAN管理节点定义，其长度必须足够传输一条消息。消息必须以单发模式传输。该规则只有一个例外：如果合并了多个仲裁时间窗口，则可以启用重传。但需要尽早禁用，以免影响接下来的时间窗口。

为了在时间窗口中传输帧，CAN控制器提供了一个硬件触发机制。此触发时机需要由主机配置。所需的帧需要存储在TBUF消息槽中，等待触发。如果循环时间达到软件定义的触发时间，CAN控制器会自动以单次模式传输帧。

如果到达触发时间，将产生中断信号通知CPU为下一个时间窗口配置触发时间。因此需要CPU实时响应，在一个时间窗口内完成后续触发时机的配置和消息帧的填充。

如CAN控制器需要作为时间主机运行，则参考帧需要像所有其他消息一样放置在TBUF消息槽中，在到达硬件触发时间时发送。

参考帧的检测由所有时间从机和时间主机自动完成。通过在CAN_REF_MSG寄存器中设置参考帧的正确REF_ID和REF_IDE位来完成的。检测到参考帧之后，CAN控制器后会自动更新Ref_Mark，开启一个新的循环周期。

此外，对于消息的触发，CAN控制器提供了一种超时机制，用于检查自上次参考帧以来是否已经过了太长时间。如果超时，这将产生触发超时中断。

### TTCAN模式下的TBUF

#### TTTBM=1

在TTCAN模式下（TTTBM=1），STB被用作消息槽数组。每个消息槽可以由TBPTR寻址。主机可以使用TBF和TBE将消息槽标记为满或空。已填充的消息槽是无法再次写入的。TBSEL和TSNEXT
在TTCAN模式下无意义。

PTB可以通过TBPTR=0来寻址。TTCAN模式下，PTB没有特殊属性，与任何其他STB消息槽作用相同。PTB和STB消息帧的成功发送都由TSIF标志来指示。

TTCAN模式下TBUF没有FIFO或优先级行为。每次传输选择一帧。

消息触发时间定义了需要传输消息的时间（时间窗口的开始），并使用指针TTPTR选择消息。如果触发事件发生，则开始传输选择的消息。最后，触发中断被设置为向主机发出需要准备下一个动作的信号。

所有传输只能使用触发启动。TPE、TSONE、TSALL、TPSS和TPA固定为
0，在TTCAN模式下无意义。

#### TTTBM=0

在这种模式下，PTB和STB与TTEN=0时行为相同。PTB具有比STB更高的优先级，并且STB
可以在FIFO模式(TSMODE=0)或优先级模式(TSMODE=1)下运行。

### TTCAN 操作

上电后，时间主机需要按照 ISO 11898-4 中的定义进行初始化。 CAN
网络中可能有多达8个潜在的时间主机。每个主机都有自己的参考帧
ID（ID的最后3位）。潜在的时间主机可能会尝试根据他们的优先级来传输他们各自的参考帧。优先级较低的时间主机后稍后尝试传输其参考帧。

如果设置了TTEN=1，则16位定时器开启运行。如果检测到其他主机发送的参考帧或时间主机成功发送其参考帧，则CAN控制器将该消息的Sync_Mark复制到Ref_Mark，将循环时间设置为
0
。参考帧成功接收后，CAN_RTIF.RIF将置位，参考帧成功传输后CAN_RTIF.TPIF或CAN_RTIF.TSIF置位。主机需要为下一个动作配置触发时间。

触发事件可以是接收触发。只触发中断产生，可以用来检测是否收到预期的消息。这样的触发事件也可以用于其他操作，取决于主机应用程序。

另一种触发事件是传输触发。TTPTR指向待发送消息。如果TBUF槽标记为空，则不开始传输，但会置位触发中断。

按通用管理，一般一个消息槽专门用于一条消息，但如果没有足够的TBUF消息槽可用，则一个消息槽也可以由不同的消息共享。

ISO 11989-4 中的大多数操作都需要单次传输。

### TTCAN时序

CAN控制器支持ISO 11898-4 Level 1。这包括一个以CAN
bit时间为基本时间单位运行的16位定时器（CAN
bit时间由S_PRESC、S_SEG_1、S_SEG_2定义）。CAN bit时间预分频系数由T_PRESC
定义。如果TTEN=1，则计时器开启连续计数。

在消息的SOF位置，定时器值为Sync_Mark。如果该消息是参考帧，则将该值复制到Ref_Mark。循环时间是定时器值减去Ref_Mark，用作接收消息的时间戳或用作待传输消息的触发时间。由于存在溢出保护，因此循环时间在基本循环周期内始终是单调递增的。

ISO 11898-4不包括CAN
FD波特率切换。因此，CAN控制器始终以慢速波特率运行定时器。定时器不受同步或波特率切换的影响。

由于触发事件、接收或传输而产生的中断需要跨时钟域（从CAN控制器时钟域到MCU高速时钟域），因此存在一定延迟。在一般情况下，主机应用程序都有足够的时间为下一个触发事件（即下一个时间窗口）准备所有操作。

一个节点的周期时间可能与其他节点的周期时间不同。在许多情况下，是±1个刻度的差别。随着参考帧的传输开始新的基本周期将重新同步节点。

如果传输触发变为活动状态，则只能从下一个CAN位开始传输。因此，帧的SOF的最早传输点是TT_TRIG+1。

### TTCAN触发类型

触发类型由TTYPE定义。TTPTR是一个指向TB消息槽的指针，TT_TRIG定义了触发时间。

触发相关动作应在达到最大循环时间0xFFFF之前完成，因为这是基本循环周期的最大长度。

除了立即触发，其他情况下，如果TTIE=1，所有触发都会令TTIF置位。

如果TTTBM=1，则仅支持时间触发。在此模式下使用其他触发器将导致TEIF置位。

对TT_TRIG进行写操作后，在达到触发时间（如果设置了
TTIE，则TTIF置位）或检测到错误（TEIF置位）之前，对TT_CFG、TT_TRIG的写访问将被锁定（禁止再次写入）。如果TTEN=0，写锁定解除。

#### 立即触发

立即传输TTPTR指向的帧，TTIF不置位。向TT_TRIG写入任意值立即触发。

在TTCAN模式下，不能使用TPE、TSONE、TSALL。立即触发只能传输一帧。在第一次传输成功或未完成之前，主机不得发起第二次立即触发。

对于立即触发，可以通过TSSS选择单次触发模式。可以使用TSA中止传输。（TPSS和TPA没有意义。）

如果立即触发的TTPTR指向一个空的消息槽，则TEIF置位。

#### 时间触发

时间触发会设置TTIF=1，并产生一个中断事件，不执行其他操作。

时间触发可用作接收触发。如果节点希望在某个时间窗口内接收到消息，那么如果该消息未到达并且RIF未设置，则可以使用接收触发指示节点没有收到该消息。接收触发在预期成功接收消息的最后时刻之后置位。

如果TT_TRIG低于实际循环时间，则TEIF置位。

如果TTTBM=1，时间触发是唯一可用的触发类型。

#### 单发发送触发

单发传输触发用于专用时间窗口，其中需要以单发模式传输消息。所选消息由TTPTR定义。

在此模式下，无论TSSS的状态如何，都会自动使用单发模式。寄存器位TSSS被忽略并保持不变。

单次发射触发用于独家时间窗口。ISO 11898-4
定义了最多16个时钟周期的发送使能窗口。寄存器位 TEW(3:0)+1
定义了时钟周期数。如果总线被另一个帧占用，则不能启动发送。如果发送使能窗口结束并且帧无法启动发送，则帧传输被中止，帧的TB消息槽将被标记为空，如果设置了AIE=1，则AIF置位。TB消息槽中的帧数据不会被修改，因此如果下次尝试传输相同的数据，则只需再次将消息槽标记为已填充。

如果TT_TRIG低于实际循环时间，则TEIF置位，且不执行任何操作。

#### 发送开始触发

发送开始触发器旨在用于合并的仲裁时间窗口，其中几个节点可以发送消息并进行CAN总线仲裁。所选消息由TTPTR定义。

此模式下，TSSS定义是使用重传还是单发模式。

如果无法传输所选帧（仲裁丢失，错误后多次传输），则可以使用传输停止触发来停止传输。

如果 TT_TRIG 低于实际循环时间，则TEIF置位，且不执行任何操作。

#### 发送停止触发

发送停止触发配合发送开始触发使用，用于停止发送开始触发的帧传输。

如果传输停止，则该帧被中止，如果AIE=1，则AIF置位，并且帧的消息槽被标记为空。
TB消息槽中的帧数据不会被修改，因此如果下次尝试传输相同的数据，则只需再次将消息槽标记为已填充。

发送停止触发的行为类似于单次发送触发使用的发送使能窗口的结束。如果传输停止触发指向一个空消息槽（这意味着消息已经传输），则不执行任何操作，并且TEIF不会置位。

如果TT_TRIG 低于实际循环时间，则TEIF置位，但传输仍然会停止。

### TTCAN 超时监测触发

与通用触发类型不同。
超时触发有一个专用的中断标志WTIF。如果循环计数等于TT_WTRIG
定义的值，且WTIE=1，则WTIF置位。

如果上一次收到有效参考帧已经经过很长时间，则可能产生超时监测触发。参考帧可以在周期性循环中或在事件之后被接收。主机应用程序需要对此进行处理，并且相应地调整超时触发时间。

WTIE的默认值为1， watch
trigger默认值为0xffff，超时触发默认开启，且超时时间为最大值。要关闭超时监测触发，WTIE需要设置为0。

如果TT_WTRIG已更新且低于实际循环时间，则TEIF置位。如果TTTBM=1，也可以使用超时监测触发。

## CiA 603 时间戳

### 时间戳

CAN in Automation (CiA)
在规范603中定义了一个至少16位的时间戳，CAN控制器支持该特性，并且可以与TTCAN一起使用，也可以单独使用。

CiA 603
的基本概念是有一个独立运行的定时器，它使用硬件主时钟进行计数而不是CAN
bit时间（TTCAN使用CAN
bit时间）。精度高于1μs（64位定时器）。CAN控制器配备了64位独立运行计数器。

事件发生后，将获取计时器的计数值，即时间戳。该时间戳分别存储在RTS或TTS中。

通常在SOF的采样点或帧被视为有效的EOF位处获取时间戳。可以通过配置TIMEPOS来选择时间戳位置。ACK定界符后的七个隐性位构成CAN/CAN
FD帧的EOF。对接收来说，帧在EOF的倒数第二位时对接收器有效；但对发送来说，在EOF的最后一位时发送完成。

在许多系统中广泛使用的基于软件的时间戳依赖于接收和发送中断。因此，建议在EOF处添加时间戳。

CiA
603支持AUTOSAR的时间戳和时间同步。对于AUTOSAR，CAN网络中的一个节点是时间主机。时间主机发送同步消息（SYNC消息）。
SYNC消息的时间戳由时间主机和所有时间从机获取。SYNC消息的发送指令与实际传输SYNC消息时间之间的时间差将由时间主机在后续(FUP)消息中传输。因此CAN控制器支持发送帧(TTS)使用一个时间戳，但支持所有接收帧(RTS)使用不同单独时间戳。可以使用TBUF消息槽内的TTSEN位为每个帧单独启用或禁用为传输帧生成时间戳。

寄存器位TIMEEN可以启用或禁用时间戳。如果禁用时间戳，则TTS和RTS无效。

### CiA603时间戳计时器

CiA
603时间戳的计时器为64bit位宽，在CAN控制内部实现。计时器从零开始，不断向上计数。可以通过软件读写该计时器。定时器可以通过向CAN_CIAWDAT0/1进行写入，由于时间戳计时器为64位宽，因此需要进行两次32位写入，推荐先将计时器暂停，写入后64位时间戳后再启动计时器。

## CAN 位时间

### 数据波特率

CAN 2.0B定义了高达1Mbit/s的数据波特率。对于CAN
FD，没有固定限制。对于实际应用系统，数据速率受限于使用的收发器和CAN控制器可实现的时钟频率。

CAN控制器可被编程为任意选择的数据速率，仅受相应位时序和预分频器寄存器中的位设置范围限制。

### 定义

【图片已删除】为控制知识库体积，本文档不携带图片，相关图示请查阅凌鸥创芯官网发布的正式手册。

图
21-16 CAN位时序规范

CAN位时间*BT*由几个部分组成，如图
21-13所示。每个段由多个时间量子单元*n*TQ组成。时间量子*TQ*的持续时间为：

*n*TQ和*n<sub>prescaler</sub>*的值必须根据系统时钟频率匹配*BTreal*尽可能接近*BTIdeal*
= 1/*BR*，其中*BR*是 CAN总线波特率：

表21-43列出了CAN/CAN FD 规范定义的最小配置范围。

表21-43
CAN时序段（最小配置范围）

|||
|---|---|
|部分|描述|
|SYNC_SEG|同步段 = 1 TQ|
|PROP_SEG|传播段\[1...8\] TQ CAN 2.0 慢速速率 CAN FD 不启用\[1...48\] TQ CAN 2.0 慢速速率 CAN FD 启用\[1…48\] TQ CAN FD 帧头速度\[0...8\] TQ CAN FD 数据速度|
|PHASE_SEG1|相位缓冲段 1\[1...8\] TQ CAN 2.0 慢速速率 CAN FD 不启用\[1...16\] TQ CAN 2.0 慢速速率 CAN FD 启用\[1...16\] TQ CAN FD 帧头速度\[1...8\] TQ CAN FD 数据速度|
|PHASE_SEG2|相位缓冲段 2\[2...8\] TQ CAN 2.0 慢速速率 CAN FD 不启用\[2...16\] TQ CAN 2.0 波特率 CAN FD 不启用\[2...16\] TQ CAN FD 帧头速度\[2...8\] TQ CAN FD 数据速度|
|SJW|同步跳转宽度\[1...4\] TQ CAN 2.0 慢速速率 CAN FD 不启用\[1...16\] TQ CAN 2.0 波特率 CAN FD 不启用\[1...16\] TQ CAN FD 帧头速度\[1...8\] TQ CAN FD 数据速度|
|IPT|信息处理时间 = \[0...2\] TQ PHASE_SEG2 ≥ IPT|

CAN控制器将SYNC_SEG、PROP_SEG和PHASE_SEG1收集到一个组中，并且该组的长度可通过t
<sub>Seg_1</sub>进行配置。表21-44列出了可用的配置范围。请注意，CAN控制器硬件并对配置进行合法性检查，可以提供比
CAN/CAN FD 规范定义的更宽的配置范围。

表21-44
CAN CAN控制器时序设置（可用配置范围）

||||||||||
|---|---|---|---|---|---|---|---|---|
|Setting|Requirements||||||||
|tSeg_1|\[2…65\] TQ \[2…65\] TQ\[2…17\] TQ|||CAN CANCAN|2.0FD FD|bit rate nominaldata bit|bit rate rate|(slow)(slow)(fast)|
|tSeg_2|\[1…8\] TQ\[1…32\] TQ \[1…8\] TQ|tSeg_1 tSeg_2+2tSeg_1 tSeg_2+2tSeg_1 tSeg_2+1||CANCAN CAN|2.0FD FD|bit ratenominal data bit|bit rate rate|(slow)(slow)(fast)|
|tSWJ|\[1…16\] TQ\[1…16\] TQ \[1…8\] TQ|tSeg_2tSWJtSeg_2tSWJtSeg_2tSWJ||CANCAN CAN|2.0FD FD|bit ratenominal data bit|bit rate rate|(slow)(slow)(fast)|

对于CAN 2.0波特率和 CAN FD慢速波特率，由寄存器S_Seg_1、S_Seg_2、S_SJW 和
S_PRESC 定义段长度。对于 CAN FD（快速）数据波特率，由寄存器
F_Seg_1、F_Seg_2、F_SJW 和 F_PRESC 定义段长度。

CAN FD在 BRS
位的采样点从慢速波特率切换到快速数据波特率，并在CRC定界符位的采样点切换回。

图 21-14给出了一个合适的波特率配置的说明，其中

位时间*BT<sub>real</sub>*、采样点和同步跳转宽度SJW都以tq_clk为单位。

【图片已删除】为控制知识库体积，本文档不携带图片，相关图示请查阅凌鸥创芯官网发布的正式手册。

图
21-17位采样时钟分频示例

主机控制器必须定义段1、段2的长度和慢波特率的同步跳转宽度，如果CAN
FD需要使用快速波特率，则还需要进行快速波特率段长度定义。

一些设置建议：

- - 段1须比段2略大。那么采样点晚于位时间的中点。
  - 同步跳转宽度不能大于段2。如果SJW太小，则
    CAN节点可能太慢而无法重新同步，如果SJW
    太大，则CAN节点可能会过于频繁地重新同步。SJW为第2段的一半似乎是较合适的设定。
  - 连接到CAN总线的所有CAN节点应尽可能选择类似的时间单位设置。

可以使用最小时序值配置最快的CAN总线速度。但需要考虑：

如果预分频器大于1，所有其他时序参数都可以设置为零，但这违反了规则t
<sub>Seg_1</sub> t <sub>Seg_2</sub> + 2（慢速）和 t <sub>Seg_1</sub> t
<sub>Seg_2</sub> + 1（快速）。因此，S_Seg_1 和 F_Seg_1 至少应设置为
1。但是这种时序参数的选择仅在理论上是可行的，但对于实际网络可能不够稳妥。

如果预分频器设置为1，则同步将变得困难。一般来说，对于CAN 2.0和CAN
FD慢速波特率，CAN 规范要求1bit时间至少为8
TQ长度。对于CAN控制器，如果预分频器设置为1，快速数据波特率的一位时间也需要至少为8
TQ长度。

总之，最快的CAN总线频率是can_clk 频率除以8：预分频器设置为1，即8
TQ位时间。

### 示例配置

以下示例是CAN 2.0慢速波特率配置的示例。CAN控制器需要进行以下步骤：

1.  设置RESET=1。
2.  设置寄存器 S_Seg_1 和 S_Seg_2：

在本例中，总线*f <sub>bus</sub>* = 1Mbaud上的数据速率，系统时钟为16MHz
。

选择*n<sub>TQ</sub>*和*n<sub>prescaler</sub>*的值以使*BT<sub>real</sub>*尽可能接近*BT<sub>Ideal</sub>*

在本例中， *n<sub>prescaler</sub>* = 2，*n<sub>TQ</sub>* = 8：从而使得

*BT<sub>ideal</sub>* = *BT<sub>real</sub>* = 8TQ。

*BT<sub>real</sub>* = *t <sub>Seg_1</sub>* + *t<sub>Seg_2</sub>*

*t<sub>Seg_1</sub>* = 5TQ，*t<sub>Seg_2</sub>* =
5TQ，推导可得S_Seg_1=3和S_Seg_2=2。

1.  设置接收过滤器（可选的）。
2.  设置寄存器S_SJW：

*t<sub>Seg_2</sub> t<sub>S JW</sub>* 可以选择*t<sub>S JW</sub>* = 2。

1.  设置时钟预分频寄存器S_PRESC: *n <sub>prescaler</sub>* = PRESC + 1即
    S_PRESC=1。
2.  设置RESET=0。

以上给定的顺序不是强制性的。只需在开始时设置RESET=1，否则无法对位时序、ACODE和
AMASK寄存器进行写入。完成配置后需要设置RESET=0。然后控制器等待8个隐性位（帧结束）时间后恢复其正常操作。

1.  继续配置中断其他配置位并执行收发指令。

### 波特率切换和采样点

在CAN网络中，当使用具有波特率切换的CAN
FD帧时，采样点的确切位置很重要，并且所有节点的采样点都需要尽可能接近。

CAN点在BRS位的采样点和CRC定界符的采样点之后切换波特率。如图
21-15所示，采样点的位置对BRS位的绝对长度有很大的影响。慢速帧头波特率的1个TQ可能比快数据率的几个TQ还大得多。如果数据波特率远高于帧头波特率，则采样点时机不合适可能会导致快速数据的采样错误。

【图片已删除】为控制知识库体积，本文档不携带图片，相关图示请查阅凌鸥创芯官网发布的正式手册。

图
21-18 比特BRS的波特率切换*S*\_*PRESCF*\_*PRESC*

### CAN FD节点的位时序配置

采样点的位置对于波特率切换非常重要。因此，一般建议所有CAN
FD节点在CAN网络中使用完全相同的时序参数。与只需要所有节点的数据速率相同的经典CAN相比，CAN
FD要求采样点位于同一位置。换句话说，段1和段2需要为所有节点配置为相同的长度。此外，建议也使用相同长度的一个TQ以使所有节点同步。

只有当所有节点都以相同的基本时钟频率（CAN控制器时钟）或至少以兼容的时钟频率运行时，才能实现此要求。

### TDC和RDC

对于CAN
FD节点，可以选择启用发射器延迟补偿(TDC)，同时自动使能接收器延迟补偿(RDC)。这些特性有以下背景：对于CAN
FD数据波特率的通信，当发送收发器的延迟或总线的延迟大于比特时间。这时就需要对采样点进行补偿的。在没有TDC的情况下，FD帧数据阶段的波特率受到以下限制：如果发送节点在该比特的采样点处不能接收到自己发送的最新比特，则它会检测到比特错误。

【图片已删除】为控制知识库体积，本文档不携带图片，相关图示请查阅凌鸥创芯官网发布的正式手册。

图
21-19 发射机延迟

图 21-19
给出了一个发射节点延迟比较大的例子。在该图中，显示了一个txd数据流，从位A
和B开始。1bit时间由*t<sub>Seg_1</sub>* = 5 TQ的采样点 (SP) 之前的时间和
*t<sub>Segt_2</sub>* = 3 TQ
的采样点之后的时间组成。在本例中，发送节点延迟大于 2
bit时间。因此，使用原始采样点SP不能进行正确的采样。CAN
FD规范定义了一个附加的辅助采样点 (SSP)。如果TDCEN=1 启用TDC，
CAN控制器自动确定发送延迟。SSP的位置是发送延迟加上SSPOFF定义的偏移量。
SSPOFF以TQ为单位，建议设置 *t<sub>Seg_1</sub>* 等于SSPOFF。
F_SEG_1定义了数据波特率的 *t<sub>Seg_1</sub>*。在图
21-19中F_SEG_1=3，选择SSPOFF=5

如果使用TDC，ISO 11898-1:2015
要求仅可使用F_PRESC=0或1。根据这一要求，CAN控制器能够自动确定3bit以内的快速数据波特率发送延迟。

接收节点也需要考虑延迟大于1个比特时间的情况。CAN FD在位FDF
=1和随后的r0位之间的下降沿定义了额外的硬件同步。（此时为慢速波特率）CAN和CAN
FD的同步通常定义为以TQ
为步长进行。但是对于快速数据波特率的同步来说，慢速波特率的一个TQ的步长可能太大了。因此，在FDF位的附加硬同步需要违反此规则，需要尽可能精确地同步，并且仅受系统时钟频率的限制。
CAN控制器使用这种特殊的同步，称为RDC。如果FDF
=1，无论是否启用TDC，RDC都会在接收期间自动完成。

### 位时序建议

CAN FD时序配置要求CAN网络中的所有节点使用相同的数据速率和相同的采样点。

请注意，如果预分频器设置为1，则位时间至少应为8TQ，以实现稳定的通信。较小的位时间设置也可能进行通讯，但不稳定。

是否使用TDC取决于CAN网络实际负载情况，可以根据需要启用或禁用TDC。

表21-45
CAN相关名词缩写

|||
|---|---|
|缩写|描述|
|PSP|初级采样点|
|SSP|二级采样点|
|Seg 1|第1段|
|Seg 2|第2段|
|TDC|发射延迟补偿（见SSPOFF）|

参考波特率配置如下：

TQ=(PRESC + 1)/ Fclock

Tseg1=TQ\*(SEG1 + 2)

Tseg2=TQ\*(SEG2 + 1)

CAN_BAUD=1/(Tseg1+Tseg2)=1/(TQ\*(SEG1+2+SEG2+1))=1/(TQ\*(SEG1+SEG2+3))

SEG1+SEG2=Fclock/((PRESC+1)\*CAN BAUD)-3

只要SEG1 + SEG2的总和固定，波特率就正确。

另外:SEG1\>SEG2，SEG1略大于SEG2

SEG2 \>= SJW

example:

Fclock =192000000; PRESC=23; CAN_BAUD=500000;

SEG=192000000/((23+1)\*500000)-3=13

SEG1+SEG2=12+1=11+2=….=8+5

表21-46 参考波特率对应寄存器配置

||||||
|---|---|---|---|---|
|Bit Rate \[Kbit/s\]|AN_SBAUD.PRESC\[7:0\]|CAN_SBAUD.SJW\[6:0\]|CAN_SBAUD.SEG2\[6:0\]|CAN_SBAUD.SEG1\[6:0\]|
|4000|2|2|2|3|
|4000|5|2|2|3|
|2000|11|2|2|3|
|1000|23|2|2|3|
|800|23|2|3|4|
|666.6|23|2|3|6|
|500|23|2|5|8|
|400|23|2|7|10|
|250|47|2|5|8|
|200|47|2|7|10|
|160|47|2|10|12|
|125|95|2|5|8|
|100|95|2|7|10|
|83.33|95|2|8|13|
|80|95|2|7|15|
|66.66|119|2|8|13|
|50|119|2|13|16|
|40|191|2|10|12|
|20|191|2|20|27|

表21-47
20MHz can_clk 的建议

||||||||||
|---|---|---|---|---|---|---|---|---|
|Bit Rate \[Mbit/s\]|PSP \[%\]|SSP \[%\]|Prescaler|Bit Time \[TQ\]|Seg 1 \[TQ\]|Seg 2 \[TQ\]|SJW \[TQ\]|TDC\[clk\]|
|0.25（仲裁）|80|\-|1|80|64|16|16|\-|
|0.5（仲裁）|80|\-|1|40|32|8|8|\-|
|0.5|80|（禁用）|1|40|32|8|8|\-|
|0.833|79|（禁用）|1|24|19|5|5|\-|
|1|80|80|1|20|16|4|4|16|
|1.538|77|77|1|13|10|3|3|10|
|2|80|80|1|10|8|2|2|8|
|4|80|80|1|5|4|1|1|4|
|5|75|75|1|4|3|1|1|3|

表21-48
40MHz can_clk 的建议

||||||||||
|---|---|---|---|---|---|---|---|---|
|Bit Rate \[Mbit/s\]|PSP \[%\]|SSP \[%\]|Prescaler|Bit Time \[TQ\]|Seg 1 \[TQ\]|Seg 2 \[TQ\]|SJW \[TQ\]|TDC\[clk\]|
|0.25（仲裁）|80|\-|2|80|64|16|16|\-|
|0.5（仲裁）|80|\-|1|80|64|16|16|\-|
|0.5|80|（禁用）|2|40|32|8|8|\-|
|0.833|79|（禁用）|2|24|19|5|5|\-|
|1|80|80|1|40|32|8|8|32|
|1.538|77|77|1|26|20|6|6|20|
|2|80|80|1|20|16|4|4|16|
|3.077|77|77|1|13|10|3|3|10|
|4|80|80|1|10|8|2|2|8|
|5|75|75|1|8|6|2|2|6|
|6.667|83|83|1|6|5|1|1|5|
|8|80|80|1|5|4|1|1|4|
|10|75|75|1|4|3|1|1|3|

表21-49 80MHz can_clk 的建议

||||||||||
|---|---|---|---|---|---|---|---|---|
|Bit Rate \[Mbit/s\]|PSP \[%\]|SSP \[%\]|Prescaler|Bit Time \[TQ\]|Seg 1 \[TQ\]|Seg 2 \[TQ\]|SJW \[TQ\]|TDC\[clk\]|
|0.25（仲裁）|80|\-|4|80|64|16|16|\-|
|0.5（仲裁）|80|\-|2|80|64|16|16|\-|
|0.5|80|（禁用）|4|40|32|8|8|\-|
|0.833|79|（禁用）|4|24|19|5|5|\-|
|1|80|80|2|40|32|8|8|64|
|1.538|77|77|2|26|20|6|6|40|
|2|80|80|2|20|16|4|4|32|
|3.077|77|77|2|13|10|3|3|20|
|4|80|80|1|20|16|4|4|16|
|5|75|75|1|16|12|4|4|12|
|6.667|83|83|1|12|10|2|2|10|
|8|80|80|1|10|8|2|2|8|
|10|75|75|1|8|6|2|2|6|

