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文章
3436瀏覽量
106056 -
CAN
+關注
關注
57文章
2756瀏覽量
463881 -
路由器
+關注
關注
22文章
3734瀏覽量
113961 -
PDU
+關注
關注
0文章
94瀏覽量
16992
發布評論請先 登錄
相關推薦
評論