目录
1. CAN Driver 中 CAN Controller State Machine 的定义
2. CanIf 中 Pdu channel mode 的定义
2.4 CANIF_TX_OFFLINE_ACTIVE 状态
前言:
CanSM 在进行网络状态切换时,会调用CanIf 层接口切换CAN controller 的状态,另外,也会切换PDU channel 的模式;为了更好的理解 CanSM 对网络状态切换的管理,有必要对CAN controller 状态及PDU channel mode 进行说明
1. CAN Driver 中 CAN Controller State Machine 的定义
CAN controller 硬件层面的状态有很多种,但从软件层面,AUTOSAR CAN Driver 标准将 CAN controller 的状态简化抽象为了下面这四种:UNINIT,STOPPED, STARTED 和 SLEEP;
1.1 UNINIT 状态
CAN controller 未初始化之前的状态,controller 相关的寄存器保持POR 后的默认值,所有中断未使能,controller 不参与总线活动;
1.2 STOPPED 状态
CAN controller 已完成初始化,但不参与总线活动,不会发送错误帧和ACK;(比如 controller 处于控制器硬件层面的 initialization mode 时)
以Bosch_MCAN IP CAN controller 为例,其可通过置位控制寄存器 CCCR.INIT 位设置controller 进入initialization mode 实现切换至STOPPED 状态;
1.3 SLEEP 状态
CAN controller 硬件层面支持通过CAN Bus 唤醒时,controller 可处于SLLEEP 状态,SLEEP 状态的效果和STOPPED 状态类型,控制器不发送错误帧和ACK,但不同的是SLEEP 状态时,CAN controoler 保持在可以被唤醒的状态;
以Bosch_MCAN IP CAN controller 为例,其可通过置位控制寄存器 CCCR.CSR 位设置停止 CAN controller 的clock 实现切换至 SLEEP 状态;
1.4 STARTED 状态
CAN controller 的正常工作模式,正常收发数据,触发中断等;
以Bosch_MCAN IP CAN controller 为例,其可通过 RESET 控制寄存器 CCCR.INIT 位设置controller 进入normal mode 实现切换至 STARTED 状态;
CAN controller 状态切换的条件已在第一幅图中标出;
2. CanIf 中 Pdu channel mode 的定义
PduR 或者NM 模块可以改变PDU 的工作模式;
Pdu channel mode 分以下几种:
- CANIF_OFFLINE
- CANIF_ONLINE
- CANIF_TX_OFFLINE
- CANIF_TX_OFFLINE_ACTIVE
2.1 CANIF_OFFLINE 状态
处于CANIF_OFFLINE 的节点:
- 调用CanIf_Transmit()时返回E_NOT_OK,并且不会将发送请求传递到底层;
- 调用CanIf_Transmit()时,清除相关的CanIf 层的发送buffer;
- 不会向上层传送 receive indication;
- 不会向上层传送 transmit confirmation;
CanIf 初始化后,或通过CanIf_SetControllerMode 将CAN controller 切换到SLEEP状态时,
CanIf 会同时将 PDU channel mode 设置到CANIF_OFFLINE;处于SLEEP 状态的controller,硬件上不再参与总线活动,不支持报文收发;
2.2 CANIF_ONLINE 状态
处于CANIF_ONLINE 的节点:
- 调用CanIf_Transmit() 时,将发送请求传递到底层;
- 可以向上层传送 receive indication;
- 可以向上层传送 transmit confirmation;
2.3 CANIF_TX_OFFLINE状态
处于CANIF_TX_OFFLINE 的节点 :
- 调用CanIf_Transmit() 时返回E_NOT_OK,并且不会将发送请求传递到底层;
- 清除相关的CanIf 的 发送buffer;
- 可以向上层传送 receive indication;
- 不允许向上层传送 transmit confirmation;
通过CanIf_SetControllerMode 到STOPPED 状态时,CanIf 会将 PDU channel mode 设置为CANIF_TX_OFFLINE;
CAN controller 处于 STOPPED 状态,控制器已不能参与总线活动,此时虽然允许接收,但不会有数据被CAN controller 接收;
2.4 CANIF_TX_OFFLINE_ACTIVE 状态
处于CANIF_TX_OFFLINE_ACTIVE 的节点:
- 调用CanIf_Transmit() 时,直接调用transmit confirmation 回调函数传至上层,不会将发送请求传递到底层;
- 这个模式主要是为了诊断功能使用,像 diagnosis passive mode,目的是避免总线负载过高同时不影响 transmit comfrimation 的机制;
相当于对上层来讲调用CanIf_Transmit() 立刻执行的就是发送完成的回调,同时不会真正的触发数据发送;