1 发送PDU的前提条件
CanIf要让发送PDU传输到CAN驱动层去发送,必须满足下面三个条件:
- (1)Ecum 初始化阶段应成功调用CanIf_Init ,Can_Init
- (2)PDU模式处于 CANIF_GET_TX_ONLINE/ CANIF_GET_ONLINE
- (3)控制器模式处于CANIF_CS_STARTED
上面的三个条件,有一个不满足,发送请求则不会得到执行,发送接口函数CanIf_Transmit返回 E_NOT_OK。
2 发送PDU提供的接口
上层通过调用接口CanIf_Transmit(< TxPduId>, < PduInfoPtr>)来请求发送。函数的具体实现如下:
Std_ReturnType CanIf_Transmit(PduIdType CanTxPduId, const PduInfoType *PduInfoPtr) { Can_PduType canPdu; const CanIf_TxPduConfigType *txEntry; CanIf_ControllerModeType csMode; CanIf_ChannelGetModeType pduMode; VALIDATE(CanIf_Global.initRun, CANIF_TRANSMIT_ID, CANIF_E_UNINIT ); VALIDATE((PduInfoPtr != 0), CANIF_TRANSMIT_ID, CANIF_E_PARAM_POINTER ); // Get the controller from L-PDU handle txEntry = CanIf_FindTxPduEntry(CanTxPduId); if (txEntry == 0) { VALIDATE(FALSE, CANIF_TRANSMIT_ID, CANIF_E_INVALID_TXPDUID); return E_NOT_OK; } CanIf_Arc_ChannelIdType channel = txEntry->CanIfCanTxPduHthRef->CanIfCanControllerIdRef; // Get and verify the controller mode if (CanIf_GetControllerMode(channel, &csMode) == E_NOT_OK){ return E_NOT_OK; } if (csMode != CANIF_CS_STARTED){ // CANIF_161 return E_NOT_OK; } // Get and verify the PDU channel mode control if (CanIf_GetPduMode(channel, &pduMode) == E_NOT_OK){ return E_NOT_OK; } if ((pduMode != CANIF_GET_TX_ONLINE) && (pduMode != CANIF_GET_ONLINE)){ return E_NOT_OK; } canPdu.id = txEntry->CanIfCanTxPduIdCanId; canPdu.length = PduInfoPtr->SduLength; canPdu.sdu = PduInfoPtr->SduDataPtr; canPdu.swPduHandle = CanTxPduId; Can_ReturnType rVal = Can_Write(txEntry->CanIfCanTxPduHthRef->CanIfHthIdSymRef, &canPdu); if (rVal == CAN_NOT_OK){ return E_NOT_OK; } if (rVal == CAN_BUSY) // CANIF 082, CANIF 161 { // Tx buffering not supported so just return. return E_NOT_OK; } return E_OK; } static const CanIf_TxPduConfigType * CanIf_FindTxPduEntry(PduIdType id) #endif { if (id >= CanIf_ConfigPtr->InitConfig->CanIfNumberOfCanTXPduIds) { return NULL; } else { return &CanIf_ConfigPtr->InitConfig->CanIfTxPduConfigPtr[id]; } }
通过< TxPduId>参数,查询配置结构 CanIf_ConfigPtr->InitConfig->CanIfTxPduConfigPtr[TxPduId],即CanIfTxPduConfigData[[TxPduId];见如下代码: