您好!
我正在 验证 MMWAVE_SDK_01_01_00_02中的 CAN FD 驱动程序。 我发现 appDataCallBack 将被多次调用、不能用于计数已传输的消息数。
在 CANFD_MCANInt0Isr 中处理发送完成中断期间、将检查所有32个 TX 缓冲区和 MCAN_TXBTO 中的所有32位、如果 MCAN_TXBTO 中的第 n 位不为零、则将处理第 n 个 TX 缓冲区、例如、将调用 appDataCallBack。
如果创建了两个 CANFD 报文对象来发送两条报文。 发送第一条消息时、将触发 ISR 函数 CANFD_MCANInt0Isr、因为 MCAN_TXBTO 中的第一个位不为零、因此将调用第一个消息对象的回调函数 appDataCallBack。 但是、当第二次触发时、ISR 函数 CANFD_MCANInt0Isr 将再次触发、因为 MCAN_TXBTO 中的第一个位和第二个位都不为零、因此将首先调用第一个消息对象的回调函数 appDataCallBack、 然后将调用第二个消息对象的回调函数。 因此、在传输两条消息时、第一个按摩对象的回调将被调用两次、第二个按摩对象的回调将被调用一次。
以下是在 CANFD_MCANInt0Isr 中处理发送完成中断的代码。
/*进程传输完成中断*/ IF (((内部状态和 MCAN_INTR_SRC_TRANS_COMPLETE)=MCAN_INTR_SRC_TRANS_COMPLETE) { 状态= MCAN_getTxBufTransmissionStatus (baseAddr); /*处理所有32个 Tx 缓冲器*/ for (索引= 0;索引< MCAN_MAX_TX_BUFFERS;索引++) { buffIndex =((uint32_t) 1U <<索引); if (buffIndex ==(status & buffIndex)) { /*获取消息对象指针*/ ptrCanMsgObj = ptrCanFdMCB->txMapping[索引]; /*递增接收到的中断数*/ ptrCanMsgObj->interrtsRxed++; /*呼叫注册的回叫。 * if (ptrCanFdMCB->appDataCallBack!=空) { ptrCanFdMCB->appDataCallBack ((CANFD_MsgObjHandle) ptrCanMsgObj、CANFD_REASE_TX_Completion); } } STATUS =(STATUS &μ~buffIndex); 如果(状态= 0) { 中断; } }
谢谢、
Beren