@[toc]
CAN模块系统框图
CAN的英文全称:Control Area Network

Microchip下32位ARM MCU的CAN模块框图如下:
- 遵循ISO 11898-1:2015标准
- 兼容Bosch CAN 2.0A, B标准和ISO CAN FD标准
- CAN消息的存储都放在MCU内部的SRAM,通过高速总线进行访问
Microchip MCC Harmony下CAN模块配置选项
CAN模块工作模式
在MCC配置模式下,添加CAN模块后进行配置

- NORMAL (CAN 2.0B模式):
- CAN FD模式:
- Restricted Operation Mode (限制性操作模式):
- 节点能够接收数据帧和远程帧
- 能够对接收到的有效帧进行应答
- 不能发送数据帧、远程帧、主动错误帧和过载帧
- 当CAN 发送时无法及时从外部RAM中读到数据,会自动进入该模式,需手动进入配置模式,清除ASM标志位
- 该模式可以用来实现CAN波特率自适应 (工作在不同波特率,当收到有效帧后手动退出该模式)
- Bus Monitoring Mode: (总线监听模式):
- 节点能够接收数据帧和远程帧
- 节点不能传输数据
- 用来分析CAN总线上的数据
- 需要单个或者2个外部消息RAM
- External Loop Back Mode (外部回环模式):
- 数据帧在内部回环并会发送到总线上
- 可以用来做硬件测试
- Internal Loop Back Mode: (内部回环模式):
- CAN数据帧在内部回环,不发送到总线上
- 可以用来做自我诊断

CAN模块中断模式

- 开启Interrupt Mode (建议勾选):
- 提供Tx FIFO/Event, Rx FIFO和中断回调注册接口
- CAN初始化时开启CAN中断
- 有CAN中断处理函数,在中断处理中调用注册的回调接口
- 不选中Interrupt Mode:
- 提供CAN中断状态查询和清除接口
- 提供Tx Event和Rx FIFO状态查询接口
CAN工作速率Bit Timing Calculation配置
CAN的工作速率和采样点计算公式如下:
CAN波特率计算公式 = CAN Clock Freq/Rate Prescaler/(1 + TSEG1 + TSEG2)
采样点计算公式 = (1 + TSEG1)/(1 + TSEG1 + TSEG2)

MCC支持自动计算比特率,只需要输入所需要的工作速率:

CAN 接收的配置

- RX FIFOx配置:
- 包括RX FIFOx深度、RX FIFOx中断触发门槛
- 覆盖模式(Overwrite)还是阻塞模式(Blocking)
- RX Buffer配置:
- RX Buffer的深度(可以存多少个CAN数据帧)
CAN RX工作在阻塞模式:

- 在阻塞模式下RX FIFO工作流程:
- 开始工作时Get Index和Put Index索引值都为0
- 新收的数据帧存储在Put Index所指向的FIFO存储区
- Put Index值自动+1 (0 ~ 63)
- 当FIFO所有单元存满(Get Index == Put Index)
- 新接收的数据帧会被丢弃
CAN RX工作在覆盖模式:

- 在覆盖模式下RX FIFO工作流程:
- 开始工作时Get Index和Put Index索引值都为0
- 新收的数据帧存储在Put Index所指向的FIFO存储区
- Put Index值自动+1 (0 ~ 63)
- 当FIFO所有单元存满(Get Index == Put Index)
- 新接收的数据帧会覆盖最旧的数据
- Put Index值自动+1
CAN RX工作在FIFO模式和Buffer模式的对比:
-
RX FIFO模式:
- CAN模块提供2个RX FIFO,FIFO0和FIFO1
- 每个FIFO最大的存储深度是64(64个完整CAN数据帧)
- 通过过滤器的设置可指定接收数据帧存储到指定FIFO
- FIFO存储的数据帧读取遵循先入先出的原则
- 可以配置为高优先级帧的缓存区
- 可通过配置将普通帧和高优先级帧存放在不同FIFO
-
RX Buffer模式:
- CAN模块提供1个专属RX Buffer
- Buffer最大的存储深度是64(64个完整CAN数据帧)
- 通过过滤器的设置可指定接收数据帧存储到Buffer
- 可以指定位置读取存储在Buffer里的数据帧
- Buffer里存储进新数据后该buffer区域会被锁定直到数据被取走并手动清除标志位信息
- 可以用来存储CAN的debug message
CAN 发送的配置

- TX FIFO 配置:
- 包括TX FIFO深度(最大32个存储深度)
- 发送的数据遵循先入先出原则
- 通过Watermark来设置TX FIFO空闲中断门槛
- TX Pause配置:
- 满足AUTOSAR关于transmit cancellation要求
- 满足ECU某些场合需要优先级控制的要求
- TX Buffer配置:
- TX Buffer的深度(最大32个存储深度)
- 可以往指定的TX Buffer存储单元写入数据
- 在发送的帧的ID都是相同的情况下,编号越小的TX Buffer具备更高的发送优先级
- TX Buffer里面帧的ID越小,发送优先级越高
- TX Buffer和TX FIFO混用的情况下,TX Buffer里面某个帧的ID值如果小于FIFO里面下一个发送帧的ID,则Buffer里的具有更小ID的帧会优先发送
CAN 过滤器工作流程说明

- CAN 帧过滤器处理流程:
- 根据帧ID判定是标准帧还是扩展帧
- 判断是否为远程帧
- 判断是否开启了帧过滤器
- 未开启任何过滤器则认为接收的帧不匹配
- 有开启过滤器则执行过滤规则
- 判断接收的帧是否满足匹配规则
- 如拒绝接收不满足匹配规则的帧则直接丢弃
- 满足匹配规则的帧将会被放入接收缓存区
- 判断接收缓存区是否空闲
- 缓存区未空则存储接收的数据帧
- 缓存区满(阻塞模式)则丢弃接收的数据帧
CAN远程帧接收的配置选项图解:

CAN过滤器的配置选项图解:

初次配置CAN模块时希望能够接收到所有的CAN标准帧,可以考虑以下两种方法:
- 通过Standard message No-Match disposition -> Move to RX FIFO 0或者Move to RX FIFO 1.

- Number of Standard Filters -> 输入 1 ;Standard Filter 1: Type -> 选择Classic;ID1 -> 选择0;ID2-> 选择 0

CAN 过滤器的配置

CAN过滤器的配置:
- 过滤器数量配置:
- 满足过滤规则的帧将存储在指定的FIFO中
- 标准帧最大支持128个过滤器设置
- 扩展帧最大支持64个过滤器设置
- 过滤器支持3种模式-Classic、Dual和Range
- Classic模式:
- ID1为filter,ID2为mask ID
- 需要配置满足过滤规则的帧存储方式
- Range模式:
- ID2 >= ID1,只过滤ID1和ID2范围内的帧
- 需要配置满足过滤规则的帧存储方式
- Dual模式:
- 双ID过滤模式,只过滤ID1和ID2的帧
- 需要配置满足过滤规则的帧存储方式
*** 非匹配的帧处理**:
- 可以选择拒收或者存储到FIFO0或者FIFO1
- 存储到FIFOx需要先使能对应的FIFO通道
过滤器元素配置Element Configuraton:
- Store in RX FIFOx:
- Set Priority:
- 接收的帧标记优先级并不存储
- 会触发HPM(High Priority Message)中断
- Set Priority and store in RX FIFOx:
- 满足过滤规则的帧将存储在指定的FIFO中
- 接收的帧标记为高优先级
- 会触发HPM(High Priority Message)中断
- 标记为高优先级的帧需要遵循先入先出原则
- 如果需要优先处理高优先级帧可以选用该方式
- Store into RX Buffer:
- 满足过滤规则的帧将存储在对应的Buffer中
- Buffer中的数据必须及时处理
- 否则新收的数据会被拒收
实际项目中CAN模块的配置流程
CAN模块的配置:
- 添加CAN模块

- 配置CAN模块对应的管脚

- 配置CAN模块使用的时钟(推荐20/40/80MHz时钟)

- 配置CAN模块使用中断模式
- 配置CAN模块工作在CAN 2.0B或者CAN-FD模式
- 配置CAN模块工作速率和采样点(建议Tq值越小越好,决定CAN调整精度)

- 配置CAN模块标准帧和扩展帧过滤器(至少各1个)


- 配置CAN模块接收FIFO0和FIFO1(决定帧的存储区域)
