PDU模式控制服务
每个L-PDU分配给一个专用的物理CAN通道,该通道连接CAN控制器和CAN网络。通过这种方式,所有属于物理通道的L-PDU都可以在处理逻辑上,单一的L-PDU通道组上进行控制。这些逻辑组表示ECU连接到底层CAN网络的所有I-PDU。图 展示了L-PDU信道组与上层或网络的关系。
图5 PDU组的通道
一个L-PDU只能分配给一个信道组。PduR或网络管理等典型用户负责控制PDU的操作模式。CanIf提供了服务CanIf_SetPduMode()和CanIf_GetPduMode()来防止处理:
- 所有的I-PDU都属于一个逻辑通道,
- 所有发送I-PDU和接收I-PDU属于一个逻辑通道。
只允许在对应的控制器模式等于CAN_CS_STARTED时,更改PDU通道模式。而CANIF_ONLINE和CANIF_OFFLINE在PDU信道模式下影响整个通信,分别启用和禁用CANIF_TX_OFFLINE和CANIF_TX_OFFLINE_ACTIVE传输路径。CanIf通过服务CanIf_GetPduMode()提供关于当前PDU通道模式的信息。
图6 PDU组的通道模式控制
在初始化期间,CanIf应该将每个通道切换到CANIF_OFFLINE。如果调用CanIf_SetControllerMode(),则CanIf会将对应通道的PDU通道模式设置为CANIF_OFFLINE。
对于切换到CANIF_OFFLINE模式的物理通道,CanIf应该:
- 防止将相关L-PDU的传输请求CanIf_Transmit()转发给CanDrv,
- 清除相应的CanIf传输缓冲区,
- 防止调用上层模块的接收指示回调服务,
- 防止调用上层模块的传输确认回调服务。
如果调用CanIf_SetControllerMode()或CanIf_ControllerBusOff(),则CanIf应将相应通道的PDU通道模式设置为CANIF_TX_OFFLINE。
对于切换到CANIF_TX_OFFLINE模式的物理通道,CanIf应该:
- 防止将相关L-PDU的传输请求CanIf_Transmit()转发给CanDrv,
- 清除相应的CanIf传输缓冲区,
- 防止调用上层模块的传输确认回调服务。
- 支持调用上层模块的接收指示回调服务。
在CANIF_OFFLINE和CANIF_TX_OFFLINE的情况下,BusOff通知被隐式地抑制,因为没有I-PDU可以被传输,因此CAN控制器不能通过新请求的L-PDU进入BusOff模式进行传输。
如果已经在CAN transmission硬件对象中等待传输的L-PDU在切换到CANIF_TX_OFFLINE或CANIF_OFFLINE模式并发生后续BusOff事件后立即被传输,那么CanIf不禁止执行BusOff通知。唤醒通知不受PDU通道模式更改的影响。
对于切换到CANIF_ONLINE模式的物理信道,CanIf应该:
- 允许将相关L-PDU的传输请求CanIf_Transmit()转发到CanDrv,
- 支持调用上层模块的接收指示回调服务,
- 允许调用上层模块的传输确认回调服务。
如果CanIfTxOfflineActiveSupport为TRUE,CanIf提供通过CANIF_TX_OFFLINE_ACTIVE模式成功传输的模拟。该模式是通过调用CanIf_SetPduMode()来启用的,并且只影响传输路径。
对于每个被分配到CANIF_TX_OFFLINE_ACTIVE模式信道的L-PDU, CanIf会立即调用上层模块的传输确认回调服务,而不是在调用CanIf_Transmit()时将L-PDU缓冲或转发到CanDrv。
在CANIF_TX_OFFLINE_ACTIVE模式下,上层必须处理传输确认的执行。发送确认处理在发送请求结束时立即执行。这个功能对于实现特殊的操作模式(如诊断无源模式)是有用的,以避免总线流量而不影响通知机制。此模式通常用于诊断。
5 API
API这里罗列一下,就不展开赘述了,后续有机会再串起来介绍。
- CanIf_Init
- CanIf_DeInit
- CanIf_SetControllerMode
- CanIf_GetControllerMode
- CanIf_GetControllerErrorState
- CanIf_Transmit
- CanIf_ReadRxPduData
- CanIf_ReadTxNotifStatus
- CanIf_ReadRxNotifStatus
- CanIf_SetPduMode
- CanIf_GetPduMode
- CanIf_GetVersionInfo
- CanIf_SetDynamicTxId
- CanIf_SetTrcvMode
- CanIf_GetTrcvMode
- CanIf_GetTrcvWakeupReason
- CanIf_SetTrcvWakeupMode
- CanIf_CheckWakeup
- CanIf_CheckValidation
- CanIf_GetTxConfirmationState
- CanIf_ClearTrcvWufFlag
- CanIf_CheckTrcvWakeFlag
- CanIf_SetBaudrate
- CanIf_SetIcomConfiguration
- CanIf_GetControllerRxErrorCounter
- CanIf_GetControllerTxErrorCounter
- CanIf_EnableBusMirroring
回调函数
- CanIf_TriggerTransmit
- CanIf_TxConfirmation
- CanIf_RxIndication
- CanIf_ControllerBusOff
- CanIf_ConfirmPnAvailability
- CanIf_ClearTrcvWufFlagIndication
- CanIf_CheckTrcvWakeFlagIndication
- CanIf_ControllerModeIndication
- CanIf_TrcvModeIndication
- CanIf_CurrentIcomConfiguration
总****结
CanIf位于底层CAN驱动、CAN收发器和上层通信服务层、CanTp、PduR之间。它表示上层通信层的CAN驱动程序服务接口。其中涉及众多API函数和回调函数,具体功能最好结合函数的定义和应用场景理解。
缩略词:
L-PDU : CAN Protocol Data Unit,
CAN协议数据单元
L-SDU : CAN Service Data Unit,
CAN服务数据单元
CanDrv : CAN Driver module,
CAN驱动模块
CAN FD : CAN with Flexible Data-Rate
CanId : CAN Identifier,
CAN标识符
CanIf: CAN Interface module,
CAN接口模块
Can Nm : CAN Network Management module,
CAN网络管理模块
CanSm : CAN State Manager module,
CAN状态管理模块
CanTp : CAN Transport Layer module,
CAN传输层模块
CanTrcv : CAN Transceiver Driver module,
CAN收发器驱动模块
CanTSyn : Global Time Synchronization overCAN,
ComM : Communication Manager module,
通信管理模块
DCM: Diagnostic Communication Manager module,诊断通信管理模块
EcuM : ECU State Manager module,
ECU状态管理模块
HOH : CAN hardware object handle,
硬件对象句柄
HRH : CAN hardware receive handle,
硬件接收句柄
HTH: CAN hardware transmit handle,
硬件发送句柄
PduR : PDU Router module,
PDU路由模块
SchM : Scheduler Module,
进程模块
-
收发器
+关注
关注
10文章
3393浏览量
105859 -
CAN
+关注
关注
57文章
2715浏览量
463361 -
路由器
+关注
关注
22文章
3706浏览量
113529 -
PDU
+关注
关注
0文章
93浏览量
16963
发布评论请先 登录
相关推荐
评论