目录
- 关键词
- 平台说明
- 一、缩写和定义
- 二、CAN driver 所在位置
- 三、CAN 模块的主要功能
- 四、功能规格
- 4.1 Driver State Machine
- 4.2 CAN控制器状态机
- 4.3 CAN控制器状态机转换
- 4.3.1 调用function Can_Init 导致的状态转换
- 4.3.2 调用Can_ChangeBaudrate导致的状态转换
- 4.3.3 调用Can_SetControllerMode导致的状态转换
- 4.3.4 硬件触发导致的状态转换
- 五、唤醒
- 六、vector cfg 说明
关键词
嵌入式、C语言、autosar、OS、BSW
平台说明
项目 | Value |
---|---|
OS | autosar OS |
autosar厂商 | vector , |
芯片厂商 | TI 英飞凌 |
编程语言 | C,C++ |
编译器 | HighTec (GCC) |
autosar版本 | 4.3.1 |
>>>>>回到总目录<<<<<<
一、缩写和定义
abbreviations | 定义 |
---|---|
Hardware Object Handle (HOH) | HRH 和HTH 的统称 |
Hardware Receive Handle (HRH) | 由CAN驱动程序定义和提供。每个HRH通常只代表一个Hardware Object。HRH可用于优化软件过滤。 |
Hardware Transmit Handle (HTH) | 由CAN驱动程序定义和提供。每个HTH通常只表示一个或多个Hardware Object,这些对象被配置为硬件传输缓冲 |
Hardware Object | CAN硬件对象定义为CAN硬件单元/ CAN控制器的CAN RAM内的PDU缓冲区。可以直接理解为一个Hardware Object 就是一个L-PDU |
Data Length Code(DLC) | L-PDU中SDU 的长度 |
Physical Channel | 物理通道表示从CAN控制器到CAN网络的接口。CAN硬件单元的不同物理通道可以访问不同的网络。可以理解为一个网关 |
CAN controller | 一个can TX OR RX 连接的节点 |
CAN Hardware unit | 一个或者多个CAN controller + 一个或者多个CAN RAM area |
二、CAN driver 所在位置
CAN driver 位于 Microcontroller Abstraction Layer。
三、CAN 模块的主要功能
1.作为上层(CAN_IF)和下层(CAN 硬线)的交互媒介,访问硬件和为上层(CAN_IF)提供接口。
四、功能规格
4.1 Driver State Machine
只有两个driver 状态,CAN_UNINIT 和 CAN_READY 用 Can_Init 和Can_deInit 切换两种状态。
4.2 CAN控制器状态机
包含了四种状态:UNINIT,STOPPED,STARTED,SLEEP。
UNINIT:未初始化或者刚复位,所有CAN ISR被禁用。
STOPPED:CAN控制器被初始化,但不参与总线。此外,不能发送错误帧和确认。(例如:对于许多控制器,进入“initialization”模式会导致控制器停止运行。)
STARTED:控制器处于正常运行状态,功能完整,即参与网络。对于许多控制器来说,离开“初始化”模式会导致控制器启动。
SLEEP:对于支持CAN 休眠的硬件,如果can 总线切换为sleep,那边 can 控制器也必须切到sleep状态。对于不支持CAN休眠的硬件,CAN控制器也必须模拟SLEEP 状态知道 被出发过渡到STOPPED 状态。
4.3 CAN控制器状态机转换
四种状态通过Can_SetControllerMode 函数来转换,通过CanIf_ControllerModeIndication函数回调通知转换是否成功。
4.3.1 调用function Can_Init 导致的状态转换
1.成功执行Can_Init会让状态UNINIT --> STOPPED.
2.当执行Can_Init 的时候,CAN Driver State 如果不在CAN_UNINIT 或者 can 控制器不在UNINIT 状态则会报CAN_E_TRANSITION 错误。
4.3.2 调用Can_ChangeBaudrate导致的状态转换
1.成功执行Can_ChangeBaudrate会让状态STOPPED --> STOPPED.
2.当执行Can_Init 的时候, can 控制器不在STOPPED状态则会报CAN_E_TRANSITION错误。
4.3.3 调用Can_SetControllerMode导致的状态转换
1.软件可以通过Can_SetControllerMode函数触发can控制器状态转换。根据CAN硬件,寄存器设置的变化转换到新的CAN控制器状态可能只有在延迟之后才会接管。Can模块在状态转换成功后通知上层(CanIf_ControllerModeIndication)新状态。监视所请求的状态是否实现是上层模块的一部分,而不是Can模块的一部分。
2.Can_Mainfunction_Mode函数将轮询CAN状态寄存器的一个标志,直到该标志发出改变生效的信号,并通过CanIf_ControllerModeIndication函数通知上层状态转换成功。
3.Can_SetControllerMode函数应使用系统服务GetCounterValue进行超时监控,避免阻塞函数。
4.3.4 硬件触发导致的状态转换
1.硬件唤醒会导致SLEEP–> STOPPED.
2.BUSS OFF 会导致start–> STOPPED
五、唤醒
Can模块处理可以由Can控制器本身检测到的唤醒,而不是通过Can收发器。有两种可能的场景:通过中断唤醒和通过轮询唤醒。对于通过中断唤醒,当硬件检测到唤醒时,会调用Can模块的ISR。如果调用唤醒事件ISR,则依次调用EcuM_CheckWakeup。传递给EcuM_CheckWakeup的参数应该是CanWakeupSourceRef配置参数引用的唤醒源ID。ECUM会设置唤醒源并通过 CAN接口调用CAN模块从而调用Can_checkWakeup。
[AutoSar]状态管理(二)单核 ECUM wakeup 流程——Can唤醒流程(TJA1043)
六、vector cfg 说明
后续更新
>>>>>回到总目录<<<<<<