您好!
我正在 验证 MMWAVE_SDK_01_01_00_02中的 CAN FD 驱动程序。 我对传输完成中断有疑问。
在函数"static void CANFD_MCANInt0Isr (uintptr_t arg)"中、已完成传输的 TX 缓冲器由寄存器 MCAN_TXBTO 的状态判断、并将调用已注册的回调。 但是 、在 ISR 函数 CANFD_MCANInt0Isr 中、寄存器 MCAN_TXBTO 未复位。 因此、当 CANFD_MCANInt0Isr 再次触发时、将多次调用回调。 因此、不能使用回调函数来计数已传输的数据包数量。 这是正确的,还是可以提供其他方法来计数成功传输的数据包? 此外、当寄存器 MCAN_TXBTO 在初始化之后将被复位时。
以下是 CANFD_MCANInt0Isr 的源代码、也可以在 packages/ti\drivers\canfd\src\canfd.c 中找到
祝你一切顺利、
Beren
/** *@b 说明 *@n * 该函数是 CANFD 驱动程序的寄存中断0 ISR。 * *@param[in] arg * 注册 ISR 时在操作系统中注册的参数 * *\ingroup CANFD_DRIVER_INTERNAL_FUNCTION * *@retval * 不适用 */ 静态空 CANFD_MCANInt0Isr (uintptr_t arg) { CANFD_MessageObject* ptrCanMsgObj; CANFD_DriverMCB* ptrCanFdMCB; uint32_t baseAddr; uint32_t 内部状态; uint32_t index、status、buffIndex; MCAN_RxNewDataStatus newDataStatus; /*获取 CAN 驱动程序块的指针*/ ptrCanFdMCB =(CANFD_DriverMCB*)参数; /*递增接收到的中断数*/ ptrCanFdMCB->Interrupts++; baseAddr = ptrCanFdMCB->hwcfg.regBaseAddress; intrStatus = MCAN_getIntraStatus (baseAddr); MCAN_clearIntStatus (baseAddr、intrStatus); /*处理总线关闭条件*/ IF (((内部状态和 MCAN_INTR_SRC_BUS_OFF_STATUS)== MCAN_INTR_SRC_BUS_OFF_STATUS) { /*递增接收到的中断数*/ ptrCanFdMCB->busOffInterrupts++; ptrCanFdMCB->state = CANFD_DriverState_Stopped; /*呼叫注册的回叫。 * if (ptrCanFdMCB->appErrCallBack!=空) { ptrCanFdMCB->appErrCallBack ((CANFD_Handle) ptrCanFdMCB、CANFD_REASE_BUSOFF、NULL); } } /*数据阶段条件中的处理协议错误*/ IF (((内部状态和 MCAN_INTR_SRC_PROTOCOL_ERR_DATA)== MCAN_INTR_SRC_PROTOCOL_ERR_DATA) { /*递增接收到的中断数*/ ptrCanFdMCB->protoDataErrInterrupts++; /*呼叫注册的回叫。 * if (ptrCanFdMCB->appErrCallBack!=空) { ptrCanFdMCB->appErrCallBack ((CANFD_Handle) ptrCanFdMCB、CANFD_REASE_PROTOCOL_ERR_DATA_PHASE、NULL); } } /*仲裁阶段条件中的处理协议错误*/ IF (((内部状态和 MCAN_INTR_SRC_PROTOCOL_ERR_ARB)== MCAN_INTR_SRC_PROTOCOL_ERR_ARB) { /*递增接收到的中断数*/ ptrCanFdMCB->ProtoArb 勘误中断++; /*呼叫注册的回叫。 * if (ptrCanFdMCB->appErrCallBack!=空) { ptrCanFdMCB->appErrCallBack ((CANFD_Handle) ptrCanFdMCB、CANFD_REASE_PROTOCOL_ERR_ARB_PHASE、NULL); } } /*进程传输完成中断*/ 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) { 中断; } } /*进程接收中断*/ if (((状态中和 MCAN_INTR_SRC_Dedicated RX_buff)== MCAN_INTR_SRC_Deded_RX_buff) { /*获取新数据状态*/ MCAN_getNewDataStatus (baseAddr、&newDataStatus); /*清除 NewData 状态以接受新消息*/ MCAN_clearNewDataStatus (baseAddr、&newDataStatus); /*处理所有64个 Rx 缓冲器*/ for (索引= 0;索引< MCAN_MAX_RX_BUFFERS;索引++) { if (索引< 32U) { status = newDataStatus.statusLow; buffIndex =(uint32_t) 1U <<索引; } 其他 { status = newDataStatus.statusHigh; buffIndex =(uint32_t) 1U <<(索引- 32U); } if (buffIndex ==(status & buffIndex)) { /*获取消息对象指针*/ ptrCanMsgObj = ptrCanFdMCB->rxMapping[索引]; /*递增接收到的中断数*/ ptrCanMsgObj->interrtsRxed++; /*呼叫注册的回叫。 * if (ptrCanFdMCB->appDataCallBack!=空) { ptrCanFdMCB->appDataCallBack ((CANFD_MsgObjHandle) ptrCanMsgObj、CANFD_reason_RX); } } } /*进程传输取消中断*/ IF (((内部状态和 MCAN_INTR_SRC_TRANS_CANCELL_FINISH)== MCAN_INTR_SRC_TRANS_CANCEL_FINISH) { status = MCAN_txBufCancellationStatus (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_reason_TX_Canceled); } } STATUS =(STATUS &μ~buffIndex); 如果(状态= 0) { 中断; } } 返回; }