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

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

# CAN

## 概述

CAN总线接口连接微控制器和串行CAN总线。本CAN模块根据特定设备的需要，可以使用DMA以减轻CPU的负担。使用CAN通信时需要用外部晶振作为参考时钟。

## 主要特性

支持BOSCH
2.0A和2.0B协议。2.0A等效CAN1.2，包含了11位ID格式；2.0B包含了11位ID和29位ID。

- 支持SJA1000大部分功能（部分不支持点在文档后续有说明）。
- 有两种模式：工作模式和复位模式。
- 支持监听和自测试。监听模式下，仅接收外界信号但不会返回任何信号。
- 支持DMA功能。

## 功能描述

### 功能框图

本接口采用同步串行设计，实现CPU同外部设备之间的CAN传输。支持轮询和中断方式获得传输状态信息。本接口的主要功能模块如下图所示。

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

图19-1 CAN模块顶层功能框图

CAN接口同外界通讯只有tx和rx两根信号线。tx发送有效数据时候，tx_oe有效。tx不发送有效数据的时候，tx_oe无效。

rx：数据信号。接收来自外界的CAN数据。

tx：数据信号。发送CAN数据到CAN总线。

tx_oe：数据使能信号。当tx输出时，tx_oe有效；当tx无数据输出时，tx_oe无效。

### 功能说明

CAN模块接收和发送数据，并将数据从串行转换成并行，或并行转换成串行。可以开启或禁止中断。接口通过数据输出引脚(TX)和数据输入引脚(RX)连接到CAN总线的PHY芯片上。

#### 工作模式

CAN模块主要包含两个工作模式：正常工作模式和复位模式。

复位模式，时序参数、ID配置、错误统计值等均在此模式下设定好。CAN_MOD.0为1，是复位模式。硬件复位结束后，CAN模块处于复位模式下。

正常工作模式，CAN_MOD.0为0。此时，可以正常响应CAN总线请求。

在上述两个模式下，扩展了监听模式（Listen Only）和自测试模式（Self
Test）。前者，类似一个搜集器，只接收CAN总线上的数据，不发送任何数据。后者，是内部自测试，发送的数据同时被自己接收，检测内部功能是否正确。

#### DMA传输

在大容量数据传输应用下，CAN接口支持DMA传输，减轻CPU的负担。一次传输，SFF为11个字节，EFF为13个字节。

在接收到新的数据后，即CAN_IR.RFIFO_N_EMPTY_IF硬件自动产生DMA请求，通过DMA模块将数据搬移到RAM中。在发送新数据前，硬件自动产生DMA请求，通过DMA模块将数据从RAM中搬移到CAN接口。

DMA传输需要配置DMA模块相应寄存器。

因CAN接口支持DMA传输，也支持CPU传输。两者区别在于--DMA传输，发送的数据来自DMA的搬移；CPU传输，发送的数据来自CPU的搬移。

DMA传输，推荐软件配置流程如下：

- 初始化DMA模块，将本次发送的数据来源，接收的数据去向配置好，传输长度配置完毕。
- 初始化GPIO模块，将CAN复用的GPIO配置完毕。
- 初始化CAN接口，控制寄存器配置完毕。
- 触发CAN接口，进入发送状态。

本CAN模块设计的DMA不同于其它模块的DMA搬移操作，需要CPU介入部分搬移操作。假定当前配置CAN模块发送N帧数据，那么第一帧数据需要CPU搬移到CAN模块寄存器中，后续帧（N-1）的数据可由DMA实现搬移。

#### CPU传输

CPU传输，根据SFF还是EFF，搬移11个字节或者13个字节；完成后需要通过中断或者轮询的方式判断传输是否完成。

CPU传输，推荐软件配置流程如下：

- 初始化GPIO模块，将CAN复用的GPIO配置完毕。
- 初始化CAN接口，控制寄存器配置完毕。
- CPU触发CAN接口进入发送流程，发送的数据来自CPU对CAN_TXDATA写入值。

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

图19-2 CAN 多帧数据 DMA 与 CPU 发送流程

#### 中断处理

CAN接口包含中断事件比较多，在CAN_IR和CAN_EIR寄存器描述中有相应说明。根据实际使用情况，开启对应的中断事件使能开关。

CAN控制器提供了以下七种中断：

o 接收中断

o 发送中断

o 错误报警中断

o 数据溢出中断

o 被动错误中断

o 仲裁丢失中断

o 总线错误中断

只要在CAN_IR一个或多个中断位为1，CAN控制器中的中断信号即为有效，当CAN_IR中的所有位都被清除时，CAN控制器中的中断信号则失效。寄存器CAN_IR被读取后，其中的大多数中断位将自动清除。但是，接收中断不包括在内，直到通过CAN_CMR的bit2写1，读取所有接收报文后，接收中断位才能被清除。

##### 接收中断

当CAN接收FIFO中有待读取帧时（CAN_RMC \>
0），都会触发接收中断。CAN_RMC中记录的帧数量包括接收FIFO中的有效帧和溢出帧。直到通过给CAN_CMR的bit2写1，清除所有挂起接收帧后，接收中断才会失效。

##### 发送中断

每当发送缓冲器空闲，将其他帧加载到发送缓冲器中等待发送时，都会触发发送中断。以下情况下，发送缓冲器将变为空闲，同时发送中断将失效：

o 帧发送已成功完成（如，应答未发现错误）。任何发送失败将自动重发。

o 单次发送已完成（CAN_SR bit3指示发送成功与否）。

o CAN_CMR的bit1位，写1，终止帧发送。

##### 错误报警中断

每当寄存器CAN_IR中ON_BUS或ERR_OV的位值改变时（如，从0变为1或反之），都会触发此中断。根据触发时ON_BUS或ERR_OV的值分成以下几种情况：

o 如果ERR_OV = 0且ON_BUS = 0：

-
如果CAN控制器处于主动错误状态，则表示接收错误计数和发送错误计数的值都返回到了CAN_EWLR所设的阈值之下。

- 如果CAN控制器此前正处于总线恢复状态，则表示此时总线恢复已成功完成。

o 如果ERR_OV = 1且ON_BUS =
0：则表示接收错误计数或发送错误计数的值超过了CAN_EWLR所设的阈值。

o 如果ERR_OV = 1且ON_BUS =
1：表示CAN控制器已进入BUS_OFF状态（因发送错误计数 \>= 256）。

o 如果ERR_OV = 0且ON_BUS =
1：表示BUS_OFF恢复期间，CAN控制器的发送错误计数的数值已低于CAN_EWLR所设的阈值。

##### 数据溢出中断

接收FIFO满，若还收到有效帧，将触发数据溢出中断。

##### 仲裁丢失中断

每当CAN控制器尝试发送帧且丢失仲裁时，都会触发此中断。CAN控制器丢失仲裁的
bit
位置将自动记录在仲裁丢失捕捉寄存器CAN_ALC中。仲裁丢失捕捉寄存器被清除（通过CPU读取该寄存器）之前，将不会再记录新发生的仲裁失败时的
bit 位置。

##### 总线错误中断

每当CAN控制器在CAN总线上检测到错误时，都会触发此中断。发生总线错误时，总线错误的类型和发生错误时的
bit
位置都将自动记录在错误捕捉寄存器CAN_ECC中。错误捕捉寄存器被清除（通过CPU的读取）之前，将不会再记录新的总线错误信息。

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

图19-3 CAN 模块中断处理与状态机架构

#### 通讯采样设置

CAN的波特率设定，主要依靠CAN_BTR0和CAN_BTR1两个寄存器配合完成。CAN_BTR0主要是配置TQ参数（TQ的计算见BTR0寄存器说明），CAN_BTR1主要处理1-bit数据的采样点、采样次数以及宽度信息。

CAN_BTR0设置传输基本时间单元参数TQ：TQ = 2 \* Tclk \*
(CAN_BTR0.BAUDRATE + 1)

LKS08x时钟最快为96M，对应的Tclk为10.4ns，TQ最大值为1.3312us。

CAN_BTR1设置波特率；同时，可调节BIT信息中各个部分的宽度（TSEG1、TSEG2和Sync.Seg），找到理想采样点。

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

图19-4 CAN模块Bit周期介绍图

SEG1段时间计算公式：Tseg1 = TQ\*(CAN_BTR1.SEG1 + 1)

SEG2段时间计算公式：Tseg2 = TQ\*(CAN_BTR1.SEG2 + 1)

波特率计算公式为：**Can Baudrate =1/( 1 \* TQ + Tseg1 + Tseg2)**

CAN_BTR0.SJW是SJW位，其为容差范围的配置寄存器。在一定波特率下通讯的各个设备，允许多大的通讯时间误差存在。

总线下界容差 \< 总线波特率 \< 总线上限容差

容差计算公式为：TQ \* (SJW + 1)

CAN_BTR1.SAM是SAM位，其位采样次数配置寄存器。0：一次；1：三次。根据实际使用情况配置即可，此位不参与波特率计算。

基于LKS08x芯片，常规波特率索引值如下：

||||
|---|---|---|
|Can波特率|BTR0|BTR1|
|1Mbps|0x05|0x14|
|800Kbps|0x05|0x16|
|666Kbps|0x85|0xB6|
|500Kbps|0x05|0x1C|
|400Kbps|0x05|0xFA|
|250Kbps|0x0B|0x1C|
|200Kbps|0x0B|0xFA|
|125Kbps|0x17|0x1C|
|100Kbps|0x1D|0x1C|
|83.33Kbps|0x17|0x6F|
|80Kbps|0x97|0xFF|
|66.66Kbps|0x1D|0x6F|
|50Kbps|0x3B|0x1C|
|40Kbps|0xAF|0xFF|

理论上，可以通过配置寄存器实现1-bit数据的时间宽度在3TQ到25TQ之间。实际应用中，如果遵循BOSCH标准，1-bit数据的时间宽度在8TQ到25TQ之间。若不遵循BOSCH标准，实际可达的范围在4TQ到25TQ之间。

#### ID滤波

CAN总线，可以挂载很多设备。通过ID号，不同设备可以知道当前总线上发送的帧是否需要被自己接收，或者发送出去的帧，是否有响应。

接收滤波器允许CAN控制器根据帧ID过滤接收帧（有时可以过滤帧的第一个数据字节和帧类型）。只有通过过滤的帧才能存储到接收FIFO中。接收滤波器的使用可以一定程度地减轻CAN控制器的运行负荷（如，可减少使用接收
FIFO
和发生接收中断的次数），因为CAN控制器将只需要操作一小部分过滤后的帧。只有当CAN控制器处于复位模式时，才可以访问接收滤波器的配置寄存器。

CAN帧的ID号码，有两种长度--11位和29位。前者对应的SFF（standard frame
format），后者对应EFF（extended frame
format）。通过CAN_ACR和CAN_AMR判断当前CAN模块可接收的ID范围。CAN_ACR列出了一个特定的ID，CAN_AMR为MASK寄存器，标识CAN_ACR中对应位数据同接收到的ID对应位数据需完全匹配，哪些位可以不用。极端情况就是CAN_ACR上每一位都要匹配，或者每一位都不要匹配。CAN_AMR对应位是0，表示接收到的ID对应位需要同CAN_ACR对应位匹配；CAN_AMR对应位是1，表示接收到的ID对应位不需要同CAN_ACR对应位匹配。

CAN_MOD.3决定了CAN_ACR包含两个滤波ID还是一个滤波ID。为1的话，CAN_ACR包含一个长的滤波ID；为0的话，CAN_ACR包含了两个短的滤波ID。两个滤波ID情况下，只要接收帧的ID同其中一个匹配，就会被CAN接收。

SFF，单滤波ID数据格式

|||||
|---|---|---|---|
|CAN_TXRX1|CAN_TXRX2|CAN_TXRX3|CAN_TXRX4|
|ID.28..ID21|ID.20..ID.18 RTR X X X X|Data Byte 1|Data Byte 2|

滤波ID设置

|||||
|---|---|---|---|
|ACR0\[7:0\]|ACR1\[7:4\] (ACR1\[3:0\] unused)|ACR2\[7:0\]|ACR3\[7:0\]|
|AMR0\[7:0\]|AMR1\[7:4\] (AMR1\[3:0\] unused)|AMR2\[7:0\]|AMR3\[7:0\]|

此时，
ACR2和ACR3若没有用到，对应的AMR2和AMR3需配置为全1。RTR是否需要匹配，结合实际情况配置AMR。

SFF，双滤波ID数据格式

|||||
|---|---|---|---|
|CAN_TXRX1|CAN_TXRX2|CAN_TXRX3|CAN_TXRX4|
|ID.28..ID21|ID.20..ID.18 RTR X X X X|Data Byte 1|Data Byte 2|

滤波ID1

||||
|---|---|---|
|ACR0\[7:0\]|ACR1\[7:0\]|ACR3\[3:0\]|
|AMR0\[7:0\]|AMR1\[7:0\]|AMR3\[3:0\]|

滤波ID2

|||
|---|---|
|ACR2\[7:0\]|ACR3\[7:4\]|
|AMR2\[7:0\]|AMR3\[7:4\]|

此时，
ACR若没有用到，对应的AMR需配置为全1。例如滤波ID1的ACR1\[3:0\]和ACR\[3:0\]。

RTR是否需要匹配，结合实际情况配置AMR。

EFF，单滤波ID数据格式

|||||
|---|---|---|---|
|CAN_TXRX1|CAN_TXRX2|CAN_TXRX3|CAN_TXRX4|
|ID.28..ID21|ID.20..ID.13|ID.12..ID.5|ID.4..ID.0 RTR X X|

滤波ID

|||||
|---|---|---|---|
|ACR0\[7:0\]|ACR1\[7:0\]|ACR2\[7:0\]|ACR3\[7:2\]|
|AMR0\[7:0\]|AMR1\[7:0\]|AMR2\[7:0\]|AMR3\[7:2\]|

此时， ACR3\[1:0\]没有用到，对应的AMR需配置为全1。

EFF，双滤波ID数据格式

|||||
|---|---|---|---|
|CAN_TXRX1|CAN_TXRX2|CAN_TXRX3|CAN_TXRX4|
|ID.28..ID21|ID.20..ID.13|ID.12..ID.5(not matched)|ID.4..ID.0 RTR X X(not matched)|

滤波ID1

|||
|---|---|
|ACR0\[7:0\]|ACR1\[7:0\]|
|AMR0\[7:0\]|AMR1\[7:0\]|

滤波ID2

|||
|---|---|
|ACR2\[7:0\]|ACR3\[7:0\]|
|AMR2\[7:0\]|AMR3\[7:0\]|

此时， 实际接收的ID12--ID5，不同ACR比较。

ACR和AMR的关系如下：

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

图19-5 CAN模块ID滤波逻辑关系

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

图19-6 CAN 硬件 ID 过滤接收判断流程

#### 发送帧格式

发送帧分成ID部分和数据部分。第一个字节包含了帧分类等信息，确定是SFF（标准）帧还是EFF（扩展）帧；确定是远程帧，还是数据帧；以及，确定数据长度。SFF的ID长度为2个字节，EFF的ID长度为4个字节。数据长度为最大8个字节。

表19-1发送帧结构

|||||
|---|---|---|---|
|SFF||EFF||
|地址|域|地址|域|
|0x40|TX帧信息|0x40|TX帧信息|
|0x44|TX ID0|0x44|TX ID0|
|0x48|TX ID1|0x48|TX ID1|
|0x4C|TX DATA0|0x4C|TX ID2|
|0x50|TX DATA1|0x50|TX ID3|
|0x54|TX DATA2|0x54|TX DATA0|
|0x58|TX DATA3|0x58|TX DATA1|
|0x5C|TX DATA4|0x5C|TX DATA2|
|0x60|TX DATA5|0x60|TX DATA3|
|0x64|TX DATA6|0x64|TX DATA4|
|0x68|TX DATA7|0x68|TX DATA5|
|0x6C|unused|0x6C|TX DATA6|
|0x70|unused|0x70|TX DATA7|

SFF帧非数据信息

表19-2发送SFF头信息

||||||||||
|---|---|---|---|---|---|---|---|---|
|CAN Address|BIT 7|BIT 6|BIT 5|BIT 4|BIT 3|BIT 2|BIT 1|BIT 0|
|0x40|FF|RTR|X1|X1|DLC.3|DLC.2|DLC.1|DLC.0|
|0x44|ID.28|ID.27|ID.26|ID.25|ID.24|ID.23|ID.22|ID.21|
|0x48|ID.20|ID.19|ID.18|X2|X1|X1|X1|X1|

EFF帧非数据信息

表19-3发送EFF头信息

||||||||||
|---|---|---|---|---|---|---|---|---|
|CAN Address|BIT 7|BIT 6|BIT 5|BIT 4|BIT 3|BIT 2|BIT 1|BIT 0|
|0x40|FF|RTR|X1|X1|DLC.3|DLC.2|DLC.1|DLC.0|
|0x44|ID.28|ID.27|ID.26|ID.25|ID.24|ID.23|ID.22|ID.21|
|0x48|ID.20|ID.19|ID.18|ID.17|ID.16|ID.15|ID.14|ID.13|
|0x4C|ID.12|ID.11|ID.10|ID.9|ID.8|ID.7|ID.6|ID.5|
|0x50|ID.4|ID.3|ID.2|ID.1|ID.0|X2|X1|X1|

- FF：1表示是EFF（扩展）帧，0表示是SFF（标准）帧。
- RTR：1标识是remote（远程）帧，0表示是data（数据）帧。
- DLC：表示此帧要发送数据的长度。最大为8个字节，最小为0个字节。
- ID：帧标识号。SFF帧的ID长度为11位（ID.28到ID.18）。EFF帧的ID长度为29位（ID.28到ID.0）。高位优先发送。
- DATA：数据。字节间顺序，从大到小，即TX
  DATA7先发送。字节内顺序，从高位到低位。
- X2：最好同RTR值一致
- X1：1或0均可

#### 接收帧格式

接收帧分成ID部分和数据部分。第一个字节包含了帧分类等信息，确定是SFF（标准）帧还是EFF（扩展）帧；确定是远程帧，还是数据帧；以及，确定数据长度。SFF的ID长度为2个字节，EFF的ID长度为4个字节。数据长度为最大8个字节。

表19-4接收帧结构

|||||
|---|---|---|---|
|SFF||EFF||
|地址|域|地址|域|
|0x40|RX帧信息|0x40|RX帧信息|
|0x44|RX ID0|0x44|RX ID0|
|0x48|RX ID1|0x48|RX ID1|
|0x4C|RX DATA0|0x4C|RX ID2|
|0x50|RX DATA1|0x50|RX ID3|
|0x54|RX DATA2|0x54|RX DATA0|
|0x58|RX DATA3|0x58|RX DATA1|
|0x5C|RX DATA4|0x5C|RX DATA2|
|0x60|RX DATA5|0x60|RX DATA3|
|0x64|RX DATA6|0x64|RX DATA4|
|0x68|RX DATA7|0x68|RX DATA5|
|0x6C|unused|0x6C|RX DATA6|
|0x70|unused|0x70|RX DATA7|

SFF帧非数据信息

表19-5接收SFF头信息

||||||||||
|---|---|---|---|---|---|---|---|---|
|CAN Address|BIT 7|BIT 6|BIT 5|BIT 4|BIT 3|BIT 2|BIT 1|BIT 0|
|0x40|FF|RTR|0|0|DLC.3|DLC.2|DLC.1|DLC.0|
|0x44|ID.28|ID.27|ID.26|ID.25|ID.24|ID.23|ID.22|ID.21|
|0x48|ID.20|ID.19|ID.18|RTR|0|0|0|0|

EFF帧非数据信息

表19-6接收EFF头信息

||||||||||
|---|---|---|---|---|---|---|---|---|
|CAN Address|BIT 7|BIT 6|BIT 5|BIT 4|BIT 3|BIT 2|BIT 1|BIT 0|
|0x40|FF|RTR|0|0|DLC.3|DLC.2|DLC.1|DLC.0|
|0x44|ID.28|ID.27|ID.26|ID.25|ID.24|ID.23|ID.22|ID.21|
|0x48|ID.20|ID.19|ID.18|ID.17|ID.16|ID.15|ID.14|ID.13|
|0x4C|ID.12|ID.11|ID.10|ID.9|ID.8|ID.7|ID.6|ID.5|
|0x50|ID.4|ID.3|ID.2|ID.1|ID.0|RTR|0|0|

#### 发送

CAN模块要发送数据，必须在正常工作模式下。

执行发送操作，一般推荐开启发送中断源和错误警告数量中断源，而仲裁丢失和总线错误中断源头不强迫开启，CAN模块有自动重发机制。

发送的数据，存放在TX FIFO中，TX
FIFO为32-Byte，及一次可以存几帧数据，且TX
FIFO中的数据一旦被成功发送出去，就被CAN模块释放掉供新的数据写入。一帧数据长度为13个字节，其考虑到最大数据量为8个字节。在发送之前，需确保此时模块处于空闲状态。

发送帧的格式，分成标准帧（SFF）和扩展帧（EFF）。CAN_CMR的BIT0置1，触发CAN模块发送数据。一旦CAN总线空闲，数据就会发出。传输完毕与否，一方面可以检查CAN_SR的BIT2是否变成1（1表示空闲），也可以通过中断方式检查是否发送完毕。

在数据发送到总线前，设置CAN_CMR的BIT1，可以停止发送，产生相应中断；通过CAN_SR的BIT3，可知当前数据是否发送完毕。

#### 接收

CAN模块要接收数据，必须在正常工作模式下。

接收FIFO中存储的帧大小可以不同（3 ~ 13 byte
范围之间）。当接FIFO为满时（或剩余的空间不足以完全存储一帧），将触发溢出中断，后续的接收帧将丢失，直到接收FIFO中清除出足够的存储空间。接收FIFO中的第一条帧将被映射到13-byte的接收缓冲器中，直到该帧被清除（通过释放接收缓冲器指令）。清除后，接收缓冲器将继续映射接收FIFO中的下一条帧，接收FIFO中上一条已清除帧的空间将被释放。

接收，开始于侦测到Start帧。接收到的数据，执行ID匹配操作：

匹配成功，存入RX FIFO，RMC递增。RX
FIFO为32-Byte，即一次可以存几帧数据，且RX
FIFO中的数据一旦被DMA成功取走，就被CAN模块释放掉供新的数据写入（非DMA模式，需要对CAN_CMR
BIT2写1释放RX
FIFO）。一帧数据长度为13个字节，其考虑到最大数据量为8个字节。RX
FIFO中有几个有效帧，通过CAN_AMC寄存器可知。通过读取CAN_TXRX寄存器可以获得最先被接收到的数据帧。若RX
FIFO满了，抛弃此帧，RX FIFO不接收，同时产生溢出中断（使能前提下）。

匹配失败，存入RX FIFO，RMC不会递增。因此，数据也会被后续帧覆盖。若RX
FIFO满了，抛弃此帧，RX FIFO不接收，不产生溢出中断（使能前提下）。

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

图19-7 CAN模块错误管理

#### 错误管理

CAN协议要求每个节点中都包含发送错误计数和接收错误计数。这两个错误计数的数值决定了控制器当前的错误状态（如主动错误、被动错误、离线）。控制器将数值分别存储在CAN_RXERR和CAN_TXERR中，CPU可随时进行读取。除了错误状态之外，控制器还提供错误报警限制的功能，这个功能可在CAN控制器进入被动错误状态之前，提醒用户，当前发生的严重总线错误。

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

图19-8 CAN模块错误管理

若发生总线错误，总线错误中断标志位（CAN_IR.
BUS_ERR_IF）置位，对应中断使能的话，将产生对应中断。当总线错误积累到一定数值，总线错误报警中断位（CAN_IR.W_ERR_IF）置位，对应中断使能的话，将产生对应中断；CAN_SR.ERR_OV置位，表明错误超过警戒线。若继续增加，超过127，进入被动错误状态，被动错误中断位（CAN_IR.M_ERR_IF）置位，对应中断使能的话，将产生对应中断。若总线错误继续增加（每次增加总线错误中断标志位都会置位），发送错误超过255，CAN_SR.ON_BUS置位进入总线关闭状态。此时，开始离线恢复，从127开始递减，减到0完成恢复，CAN_SR.ON_BUS和CAN_SR.ERR_OV自动清除。

只要发生总线错误，总线错误中断标志位（CAN_IR.BUS_ERR_IF）均置位。

#### 错误计数

发送错误计数和接收错误计数根据以下规则递增/递减。请注意，一帧传输中可应用多个规则。

1\.
当接收器检测到错误时，接收错误计数数值将增加1。当检测到的错误为发送主动错误标志或过载标志期间的位错误除外。

2\.
发送错误标志后，当接收器第一个检测到的位是显性位时，接收错误计数数值将增加8。

3\.
当发送器发送错误标志时，发送错误计数数值增加8。但是，以下情况不适用于该规则：

o
发送器为被动错误状态，因为在应答槽未检测到显性位而产生应答错误，且在发送被动错误标志时检测到显性位时，则发送错误计数数值不应增加。

o
发送器在仲裁期间因填充错误而发送错误标志，且填充位本该是隐性位但是检测到显性位，则发送错误计数数值不应增加。

4\.
若发送器在发送主动错误标志和过载标志时检测到位错误，则发送错误计数数值增加8。

5\.
若接收器在发送主动错误标志和过载标志时检测到位错误，则接收错误计数数值增加8。

6\.
任意节点在发送主动/被动错误标志或过载标志后，节点仅能承载最多7个连续显性位。在（发送主动错误标志或过载标志时）检测到第14个连续显性位，或在被动错误标志后检测到第8个连续显性位后，发送器将使其发送错误计数数值增加8，而接收器将使其接收错误计数数值增加8。每增加8个连续显性位的同时，（发送器的）发送错误计数和（接收器的）接收错误计数数值也将增加
8。

7\. 每当发送器成功发送帧后（接收到 ACK，且直到 EOF
完成未发生错误），则发送错误计数数值将减小
1，除非发送错误计数的数值已经为0。

8\. 当接收器成功接收帧后（确认槽前未检测到错误，且成功发送
ACK），则接收错误计数数值将相应减小。

o 若接收错误计数数值位于1 ~ 127之间，则其值减小1。

o 若接收错误计数数值大于127，则其值减小到127。

o 若接收错误计数数值为0，则仍保持为0。

9\. 当一个节点的发送错误计数 和/或 接收错误计数数值大于等于128
时，该节点变为被动错误节点。导致节点发生上述状态切换的错误，该节点仍发送主动错误标志。请注意，一旦接收错误计数数值到达128，后续任何增加该值的动作都是无效的，直到接收错误计数数值返回到128以下。

10\. 当某节点的发送错误计数数值大于等于256时，该节点将变为离线节点。

11\.
当某被动错误节点的发送错误计数和接收错误计数数值都小于等于127，则该节点将变为主动错误节点。

12\.
当离线节点在总线上检测到128次11个连续隐性位后，该节点可变为主动错误节点（发送错误计数和接收错误计数数值都重设为
0）。

#### 错误报警限制

错误报警限制（CAN_EWLR）为发送和接收的可配置阈值，若错误计数数值超过该阈值，将触发CAN总线错误中断，作为一个报警功能提示当前发生的严重CAN总线错误，且在CAN控制器进入被动错误状态之前被触发。CAN_EWLR寄存器存储相应阈值，此寄存器的配置必须处于复位模式下。CAN_EWLR寄存器默认数值为96。

当发送和/或接收错误的数值大于等于CAN_EWLR寄存器对应的数值时，CAN_IR.W_ERR_IF位将立即被置1。同理，当发送和/或接收错误的数值都小于CAN_EWLR寄存器对应的数值时，CAN_IR.W_ERR_IF
位将立即复位为0。只要CAN_IR.W_ERR_IF（CAN_EIR.W_ERR_IE使能）位值变成1，便会触发错误报警中断。

#### 被动错误

当发送或接收错误的数值大于127时，CAN控制器处于被动错误状态，CAN_IR.M_ERR_IF位将立即被置1。同理，当发送或接收错误的数值都小于等于127时，CAN控制器进入主动错误状态。每当CAN控制器从主动错误状态变为被动错误状态，或反之时，CAN_IR.M_ERR_IF位都将立即被置1。

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

图19-9 CAN 控制器三种错误状态切换原理图

#### 离线状态与离线恢复

当发送错误的数值大于255时，CAN控制器将进入离线状态。进入离线状态后，CAN控制器将自动进行以下动作：

o 接收错误计数器的数值置为0

o 发送错误计数器的数值置为127

o CAN_IR.BUS_ERR_IF位置1

o 进入CAN的复位模式

每当CAN_IR.BUS_ERR_IF/CAN_IR.W_ERR_IF的数值发生变化时，都将触发错误报警中断。

为了返回主动错误状态，CAN控制器必须进行离线恢复。要启动离线恢复，首先需要退出复位模式，进入操作模式。然后要求CAN控制器在总线上检测到128次11个连续隐性位。每一次CAN控制器检测到11个连续隐性位时，发送错误计数器的数值都将减小，以追踪离线恢复进程。当离线恢复完成后（发送错误的数值从127减小到0），CAN_IR.BUS_ERR_IF位将自动复位为0，从而触发错误报警中断。

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

图19-10 CAN 故障分级中断上报与总线关闭恢复流程

### 寄存器

#### 地址分配

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

表19-7
CAN寄存器地址分配

||||
|---|---|---|
|名称|偏移|说明|
|CAN_MOD|0x000|CAN模式寄存器|
|CAN_CMR|0x004|CAN命令寄存器|
|CAN_SR|0x008|CAN状态寄存器|
|CAN_IR|0x00C|CAN中断状态寄存器|
|CAN_IER|0x010|CAN中断控制寄存器|
|CAN_BTR0|0x018|CAN总线时序控制寄存器0|
|CAN_BTR1|0x01C|CAN总线时序控制寄存器1|
|CAN_ALC|0x02C|CAN仲裁丢失捕捉寄存器|
|CAN_ECC|0x030|CAN错误码捕捉寄存器|
|CAN_EWLR|0x034|CAN错误&警告门限值设置寄存器|
|CAN_RXERR|0x038|CAN接收错误计数器|
|CAN_TXERR|0x03C|CAN发送错误计数器|
|CAN_TXRX0|0x040|正常工作模式下，CAN发送帧格式寄存器/CAN接收帧格式寄存器|
|CAN_TXRX1|0x044|正常工作模式下，CAN发送数据寄存器0/CAN接收数据寄存器0|
|CAN_TXRX2|0x048|正常工作模式下，CAN发送数据寄存器1/CAN接收数据寄存器1|
|CAN_TXRX3|0x04C|正常工作模式下，CAN发送数据寄存器2/CAN接收数据寄存器2|
|CAN_TXRX4|0x050|正常工作模式下，CAN发送数据寄存器3/CAN接收数据寄存器3|
|CAN_TXRX5|0x054|正常工作模式下，CAN发送数据寄存器4/CAN接收数据寄存器4|
|CAN_TXRX6|0x058|正常工作模式下，CAN发送数据寄存器5/CAN接收数据寄存器5|
|CAN_TXRX7|0x05C|正常工作模式下，CAN发送数据寄存器6/CAN接收数据寄存器6|
|CAN_TXRX8|0x060|正常工作模式下，CAN发送数据寄存器7/CAN接收数据寄存器7|
|CAN_TXRX9|0x064|正常工作模式下，CAN发送数据寄存器8/CAN接收数据寄存器8|
|CAN_TXRXA|0x068|正常工作模式下，CAN发送数据寄存器9/CAN接收数据寄存器9|
|CAN_TXRXB|0x06C|正常工作模式下，CAN发送数据寄存器10/CAN接收数据寄存器10|
|CAN_TXRXC|0x070|正常工作模式下，CAN发送数据寄存器11/CAN接收数据寄存器11|
|CAN_ACR0|0x040|复位模式下，CAN ID码寄存器0|
|CAN_ACR1|0x044|复位模式下，CAN ID码寄存器1|
|CAN_ACR2|0x048|复位模式下，CAN ID码寄存器2|
|CAN_ACR3|0x04C|复位模式下，CAN ID码寄存器3|
|CAN_AMR0|0x050|复位模式下，CAN ID 掩码寄存器0|
|CAN_AMR1|0x054|复位模式下，CAN ID 掩码寄存器1|
|CAN_AMR2|0x058|复位模式下，CAN ID 掩码寄存器2|
|CAN_AMR3|0x05C|复位模式下，CAN ID 掩码寄存器3|
|CAN_RMC|0x074|CAN FIFO有效接收信息计数器|
|CAN_RBSA|0x078|CAN 第一条有效接收信息在FIFO中的地址寄存器|
|CAN_RFIFO0~CAN_RFIFO31|0x080~0x144|CAN RX FIFO地址寄存器|
|CAN_TFIFO0 ~CAN_TFIFO31|0x180~0x1B0|CAN TX FIFO地址寄存器|

#### 寄存器说明

##### CAN_MOD 模式寄存器

地址：0x4001_3400

复位值：0x0001

表19-8模式寄存器CAN_MOD

|||||||||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
|15|14|13|12|11|10|9|8|7|6|5|4|3|2|1|0|
||||||||||||SLEEP|FLT_ID|TEST_MODE|FUNC_MODE|MODE|
||||||||||||RW|RW|RW|RW|RW|
||||||||||||0|0|0|0|1|

||||
|---|---|---|
|位置|位名称|说明|
|\[31:5\]||未使用|
|\[4\]|SLEEP|正常工作模式下写1，触发休眠操作，进入休眠模式。|
|\[3\]|FLT_ID|CAN滤波ID选择。默认值为0。1：单滤波ID。一个32位长的滤波ID0：双滤波ID。两个短滤波ID|
|\[2\]|TEST_MODE|CAN工作模式选择。默认值为0。1：自测试模式0：正常工作模式|
|\[1\]|FUNC_MODE|CAN工作模式选择。默认值为0。1：监听模式0：正常工作模式|
|\[0\]|MODE|CAN工作模式选择。默认值为1。1：复位模式0：正常工作模式|

##### CAN_CMR 命令寄存器

地址：0x4001_3404

复位值：0x0

表19-9命令寄存器CAN_CMR

|||||||||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
|15|14|13|12|11|10|9|8|7|6|5|4|3|2|1|0|
|||||||||||DMA_EN|RX_DUR_TX|CLR_OV|RELEASE_FIFO|INTR_TRANS|TRANS_REQ|
|||||||||||WO|WO|WO|WO|WO|WO|
|||||||||||0|0|0|0|0|0|

||||
|---|---|---|
|位置|位名称|说明|
|\[31:6\]||未使用|
|\[5\]|DMA_EN|写1，使能DMA功能|
|\[4\]|RX_DUR_TX|写1，发送数据的同时也将数据接收回来|
|\[3\]|CLR_OV|写1，清除数据溢出标志位|
|\[2\]|RELEASE_FIFO|写1，释放RFIFO|
|\[1\]|INTR_TRANS|写1，将中断取消未执行的发送传输|
|\[0\]|TRANS_REQ|写1，产生CAN发送传输请求|

##### CAN_SR 状态寄存器

地址：0x4001_3408

复位值：0x0

表19-10状态寄存器CAN_SR

|||||||||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
|15|14|13|12|11|10|9|8|7|6|5|4|3|2|1|0|
|||||||||ON_BUS|ERR_OV|TXING|RXING|TRANS_DONE|TFIFO_EMPTY|RFIFO_EMPTY|DATA_AVAIL|
|||||||||RO|RO|RO|RO|RO|RO|RO|RO|
|||||||||0|0|0|0|0|0|0|0|

||||
|---|---|---|
|位置|位名称|说明|
|\[31:8\]||未使用|
|\[7\]|ON_BUS|1：CAN模块，处于BUS OFF状态，无数据发送接收动作0：CAN模块，可以发送数据到CAN总线，或接收CAN总线数据|
|\[6\]|ERR_OV|1：CAN传输产生的错误总数达到或超过CAN_EWL规定值0：CAN传输产生的错误总数低于CAN_EWL规定值错误值低于CAN_EWLR，标志自动拉低|
|\[5\]|TXING|1：CAN模块正在发送一帧数据0：CAN模块没有发送数据的动作|
|\[4\]|RXING|1：CAN模块正在接收一帧数据0：CAN模块没有接收数据的动作|
|\[3\]|TRANS_DONE|1：最近一次传输已完成0：最近一次传输未完成|
|\[2\]|TFIFO_EMPTY|1：TFIFO空，可以写入发送数据0：TFIFO非空，内部数据没有发送完毕|
|\[1\]|RFIFO_EMPTY|1：RFIFO存入的帧太多，已满，导致数据丢失0：RFIFO未满对CAN_CMR BIT\[2\]写1，可清除此位（表示用户已经取走一帧数据，暂时RFIFO非满了）|
|\[0\]|DATA_AVAIL|1：RFIFO存有一帧或多帧数据，可以通过RFIFO寄存器读取0：RFIFO没有有效帧数据|

##### CAN_IR 中断状态寄存器

地址：0x4001_340C

复位值：0x0

表19-11中断状态寄存器CAN_IR

|||||||||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
|15|14|13|12|11|10|9|8|7|6|5|4|3|2|1|0|
|||||||||BUS_ERR_IF|LOST_ARB_IF|M_ERR_IF|WK_IF|RFIFO_OV_IF|W_ERR_IF|TX_DONE_IF|RFIFO_N_EMPTY_IF|
|||||||||RO|RO|RO|RO|RO|RO|RO|RO|
|||||||||0|0|0|0|0|0|0|0|

||||
|---|---|---|
|位置|位名称|说明|
|\[31:8\]||未使用|
|\[7\]|BUS_ERR_IF|1：总线错误中断（CAN_EIR.7为有效前提下）|
|\[6\]|LOST_ARB_IF|1：丢失仲裁，改成接收模式（CAN_EIR.6为有效前提下）|
|\[5\]|M_ERR_IF|被动错误中断。若值为1，表明节点由于错误计数数值的变化，在主动错误状态与被动错误状态间发生了切换。|
|\[4\]|WK_IF|1：CAN模块从休眠中唤醒（CAN_EIR.4为有效前提下）|
|\[3\]|RFIFO_OV_IF|1：RFIFO数据发生溢出（CAN_EIR.3为有效前提下）|
|\[2\]|W_ERR_IF|错误报警中断。若值为 1，表明SR寄存器中CAN_SR.7和CAN_SR.6发生变化（0 变为 1 或 1 变为 0）。1：CAN_SR.7或者CAN_SR.6有变化（CAN_EIR.2为有效前提下）|
|\[1\]|TX_DONE_IF|1：发送完毕当前帧（CAN_EIR.1为有效前提下），可以执行新的数据发送任务|
|\[0\]|RFIFO_N_EMPTY_IF|1：RFIFO有数据（CAN_EIR.0为有效前提下）|

CAN_IR寄存器，为读清除寄存器。只有BIT0--RFIFO_N_EMPTY_IF无法读清除，此位只能通过对CAN_CMR
BIT2写1清除，若RX FIFO有多帧接收的数据，CAN_CMR
BIT2写1也无法清除，除非RX FIFO全部读完，即读一帧数据写CAN_CMR
BIT2，反复迭代。

##### CAN_IER 中断控制寄存器

地址：0x4001_3410

复位值：0x0

表19-12中断控制寄存器CAN_IER

|||||||||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
|15|14|13|12|11|10|9|8|7|6|5|4|3|2|1|0|
|||||||||BUS_ERR_IE|LOST_ARB_IE|M_ERR_IE|WK_IE|RFIFO_OV_IE|CAN_SR67_IE|TX_DONE_IE|RFIFO_N_EMPTY_IE|
|||||||||RW|RW|RW|RW|RW|RW|RW|RW|
|||||||||0|0|0|0|0|0|0|0|

||||
|---|---|---|
|位置|位名称|说明|
|\[31:8\]||未使用|
|\[7\]|BUS_ERR_IE|1：总线错误中断，中断源使能0：该中断源关闭|
|\[6\]|LOST_ARB_IE|1：丢失仲裁，改成接收模式，中断源使能0：该中断源关闭|
|\[5\]|M_ERR_IE|1：被动错误中断源使能0：该中断源关闭|
|\[4\]|WK_IE|1：CAN模块从休眠中唤醒，中断源使能0：该中断源头关闭|
|\[3\]|RFIFO_OV_IE|1：RFIFO数据发生溢出，中断源使能0：该中断源头关闭|
|\[2\]|W_ERR_IE|1：错误报警中断，CAN_SR.7或者CAN_SR.6有变化，中断源使能0：该中断源头关闭|
|\[1\]|TX_DONE_IE|1：发送完毕当前帧，中断源使能0：该中断源头关闭|
|\[0\]|RFIFO_N_EMPTY_IE|1：RFIFO有新的数据被接收到，中断源使能0：该中断源头关闭|

##### CAN_BTR0 波特率0控制寄存器

地址：0x4001_3418

复位值：0x0

表19-13波特率0控制寄存器CAN_BTR0

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

||||
|---|---|---|
|位置|位名称|说明|
|\[31:8\]||未使用|
|\[7:6\]|SJW|同步跳转宽度配置。公式如下：Tsjw = TQ\*(SJW + 1)|
|\[5:0\]|BAUDRATE|波特率配置，计算CAN传输基本时间单元参数TQ,Tclk为CAN模块的系统时钟频率TQ = 2\*Tclk\*(BAUDRATE+1)|

##### CAN_BTR1 波特率1控制寄存器

地址：0x4001_341C

复位值：0x0

表19-14波特率1控制寄存器CAN_BTR1

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

||||
|---|---|---|
|位置|位名称|说明|
|\[31:8\]||未使用|
|\[7\]|OSR|1：1-bit数据被采样3次0：1-bit数据被采样1次|
|\[6:4\]|SEG2|SEG2段时间Tseg2 = TQ\*(SEG2+1)|
|\[3:0\]|SEG1|SEG1段时间Tseg1 = TQ\*(SEG1+1)|

##### CAN_ALC 仲裁丢失捕捉寄存器

地址：0x4001_342C

复位值：0x0

表19-15仲裁丢失捕捉寄存器CAN_ALC

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

||||
|---|---|---|
|位置|位名称|说明|
|\[31:5\]||未使用|
|\[4:0\]|LOST_ARB|记录总线仲裁丢失的具体位置。0：ID的第一位1：ID的第二位2：ID的第三位3：ID的第四位4：ID的第五位5：ID的第六位6：ID的第七位7：ID的第八位8：ID的第九位9：ID的第十位A：ID的第十一位B：SRTR位C：IDE位|

##### CAN_ECC 错误码捕捉寄存器

地址：0x4001_3430

复位值：0x0

表19-16错误码捕捉寄存器CAN_ECC

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

||||
|---|---|---|
|位置|位名称|说明|
|\[31:8\]||未使用|
|\[7:6\]|BUS_ERR_TYPE|总线错误类型00：bit错误01：格式错误10：填充错误11：其它类型错误|
|\[5\]|ERR_TIMING|1：总线错误发生在接收过程中0：总线错误发生在发送过程中|
|\[4:0\]|ERR_POSITION|错误发生的位置02：ID.28到ID.2103：起始帧04：SRTR位05：IDE位06：ID.20到ID.1807：ID.17到ID.1308：CRC数据段09：保留位，固定为00A：Data Field0B：Data Length Code0C：RTR位0D：保留位，固定为10E：ID.4到ID.00F：ID.12到ID.511：active error flag12：Intermission13：Tolerate dominant位16：passive error flag17：Error delimiter18：CRC delimiter19：确认位1A：帧结束1B：确认delimiter1C：Overload flag|

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

地址：0x4001_3434

复位值：0x0

表19-17错误&警告门限值寄存器CAN_EWLR

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

||||
|---|---|---|
|位置|位名称|说明|
|\[31:8\]||未使用|
|\[7:0\]|EWLR|正常工作模式下只读，复位模式下可读写。写入新值后，在正常工作模式下生效。|

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

地址：0x4001_3438

复位值：0x0

表19-18接收错误计数器寄存器CAN_RXERR

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

||||
|---|---|---|
|位置|位名称|说明|
|\[31:8\]||未使用|
|\[7:0\]|RXERR|正常工作模式下只读，复位模式下可读写。错误数超过CAN_EWLR，CAN_SR.ERR_OV被拉高；数值超过127，CAN模块进入被动错误状态。复位或者BUS OFF事件，硬件清零本寄存器。本寄存器自动增减，具体增减规则见本章19.2.2.12。|

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

地址：0x4001_343C

复位值：0x0

表19-19发送错误计数器寄存器CAN_TXERR

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

||||
|---|---|---|
|位置|位名称|说明|
|\[31:8\]||未使用|
|\[7:0\]|TXERR|正常工作模式下只读，复位模式下可读写。错误数超过CAN_EWLR，CAN_SR.ERR_OV被拉高；数值超过127，CAN模块进入被动错误状态。数值超过255，进入BUS OFF状态，CAN_MOD. MODE被硬件拉高，处于复位模式。CAN_SR.ON_BUS被硬件自动拉高，本寄存器被硬件赋值为127；复位，硬件清零本寄存器。具体增减规则见本章19.2.2.12。|

##### CAN_TXRX0~ CAN_TXRXC 发送接收寄存器

地址：0x4001_3440~0x4001_3470

复位值：0x0

表19-20发送接收寄存器CAN_TXRX

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

||||
|---|---|---|
|位置|位名称|说明|
|\[31:8\]||未使用|
|\[7:0\]|TXRX|发送或者接收数据寄存器。正常工作模式下，该寄存器映射的是RFIFO中第一个有效帧数据；正常工作模式下，对该寄存器写入数据，直接存入TFIFO中。|

##### CAN_ACRx ID 寄存器 ( x = 0,1,2,3)

地址：0x4001_3440~0x4001_344C

复位值：0x0

表19-21 ID寄存器CAN_ACR

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

||||
|---|---|---|
|位置|位名称|说明|
|\[31:8\]||未使用|
|\[7:0\]|ACR|仅复位模式下可用；复位模式下，可读写；可接收的ID寄存器，当输入帧的ID同此匹配，则被CAN模块接受。配合AMR寄存器，可同一类ID匹配。|

##### CAN_AMRx ID 掩码寄存器 ( x = 0,1,2,3)

地址：0x4001_3450~0x4001_345C

复位值：0x0

表19-22 ID掩码寄存器CAN_AMR

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

||||
|---|---|---|
|位置|位名称|说明|
|\[31:8\]||未使用|
|\[7:0\]|AMR|仅复位模式下可用；复位模式下，可读写；配合ACR寄存器，同输入ID进行匹配。AMR寄存器某一位为0，标识ID对应位需要同ACR匹配；为1，标识ID对应位不需要同ACR匹配。|

##### CAN_RMC FIFO 有效接收数据寄存器

地址：0x4001_3474

复位值：0x0

表19-23
FIFO有效接收数据寄存器CAN_RMC

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

||||
|---|---|---|
|位置|位名称|说明|
|\[31:5\]||未使用|
|\[4:0\]|FRAME_CNT|正常工作模式和复位模式，此寄存器均只可读。CAN收到一帧数据，计数器自动累加1；DMA方式读取完毕一帧数据后，计数器自动减1；CPU方式读取完毕一帧数据后，软件需将CAN_CMR\[2\]写1，手动实现计数器减1。|

##### CAN_RBSA 有效接收数据地址寄存器

地址：0x4001_3478

复位值：0x0

表19-24有效接收数据地址寄存器CAN_RBSA

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

||||
|---|---|---|
|位置|位名称|说明|
|\[31:5\]||未使用|
|\[4:0\]|RBSA|正常工作模式，只可读。复位模式，可读写RFIFO的大小为32字节，本寄存器指明第一帧有效接收数据在RFIFO的位置。|

##### CAN\_ RFIFO00~CAN_RFIFO1F RX FIFO 寄存器

地址：0x4001_3480~0x4001_34FC

复位值：0x0

表19-25
RX FIFO寄存器CAN\_ RFIFO0~CAN_RFIFO31

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

||||
|---|---|---|
|位置|位名称|说明|
|\[31:8\]||未使用|
|\[7:0\]|RX_DATA|RX FIFO地址正常工作模式下，只可读；复位模式下，可读写。|

##### CAN_TFIFO0~CAN_TFIFO12 TX FIFO 寄存器

地址：0x4001_3580~0x4001_35B0

复位值：0x0

表19-26
TX FIFO寄存器CAN\_ TFIFO0~CAN_TFIFO12

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

||||
|---|---|---|
|位置|位名称|说明|
|\[31:8\]||未使用|
|\[7:0\]|TX_DATA|TX FIFO地址正常工作模式下和复位模式下，均只可读。|

