
最近遇到了一個CanTp發送連續幀過程中異常中斷的問題,該問題的解決思路及總結經驗具有普遍性,于是總結到本文,希望能給大家帶來一些幫助。
AUTOSAR BSW: Vector Davinci
MCAL: EB Infineon
HW Platform: TC3xx
Debug Tool: UDE
SWC同事需要一路CAN Tp通道收發多幀報文,我負責CanTp通道配置以及CanTp模塊及更底層模塊的問題分析,SWC同事負責實現CanTp通道的Callout函數及SWC引用邏輯。

SWC(模塊名為Cdd_SWC)使用CanTp模塊的時序和DCM模塊使用CanTp模塊的時序一樣。SWC調用PduR_Cdd_SWCTransmit函數請求CanTp發送長幀報文,CanTp收到請求后CanTp_MainFunction調用PduR_CanTpCopyData -> Cdd_SWC_CopyTxData向Cdd_SWC索要數據,根據長幀的大小會多次調用Cdd_SWC_CopyTxData發送多幀數據直到發送完最后一幀多幀數據,發送成功后CanTp會調用PduR_CanTpRxConfirmation -> Cdd_SWC_TpTxConfirmation通知Cdd_SWC發送多幀成功。
注意1:配置完CanTp通道后,Cdd_SWC_CopyTxData和Cdd_SWC_TpTxConfirmation是callout函數,需要Cdd_SWC實現。
注意2:如果在發送過程中Cdd_SWC實現的Cdd_SWC_CopyTxData返回CANTP_BUFREQ_E_NOT_OK,CanTp會立馬停止多幀報文發送并且調用Cdd_SWC_TpTxConfirmation通知Cdd_SWC發送失敗(result = E_NOT_OK)。
注意3:如果在發送過程中Cdd_SWC實現的Cdd_SWC_CopyTxData返回CANTP_BUFREQ_BUSY,CanTp會以CanTp的調度周期輪詢Cdd_SWC是否準備好數據發送,如果Cdd_SWC一直返回CANTP_BUFREQ_BUSY持續時間超過N_Cs,CanTp認為本次多幀發送超時調用Cdd_SWC_TpTxConfirmation通知Cdd_SWC發送失敗(result = E_NOT_OK)。
注意4:如果STmin配置為0,首幀報文發送成功后的CanISR中會調用Cdd_SWC_CopyTxData發送多幀報文,

Cdd_SWC通過CanTp接收多幀報文的時序如上圖所示,這里就不再贅述。
注意1:Cdd_SWC需要實現Cdd_SWC_StartOfReception, Cdd_SWC_CopyRxData, Cdd_SWC_TpRxIndication三個callout函數。
注意2:Cdd_SWC可以通過Cdd_SWC_TpRxIndication拿到本次多幀報文接收的結果。
Cdd_SWC使用CanTp通道發送多幀報文時偶發多幀還沒有發完就停止發送了且Cdd_SWC收到Cdd_SWC_TpTxConfirmation的Result是E_NOT_OK. 概率相對還比較高(1/5的概率)。