Tool/software:
Hi,TI expert
1.We use j722s-rtos-sdk-v11
2.Can interrupt function
void vtcan_mcan0IntrISR(void *arg) { uint32_t intrStatus; uint32_t rxIntrMask = MCAN_INTR_SRC_DEDICATED_RX_BUFF_MSG | MCAN_INTR_SRC_RX_FIFO0_NEW_MSG | MCAN_INTR_SRC_RX_FIFO1_NEW_MSG | MCAN_INTR_SRC_HIGH_PRIO_MSG; intrStatus = MCAN_getIntrStatus(gMcan0BaseAddr); MCAN_clearIntrStatus(gMcan0BaseAddr, intrStatus); Mcan0IsrIntrStatus = (intrStatus & (~MCAN_getIntrLineSelectStatus(gMcan0BaseAddr))); if ((Mcan0IsrIntrStatus & MCAN_INTR_SRC_TRANS_COMPLETE) == MCAN_INTR_SRC_TRANS_COMPLETE) { EventP_setBits(&gCanEvent, CAN_EVT_TX); } if ((Mcan0IsrIntrStatus & rxIntrMask) != 0U) { if((Mcan0IsrIntrStatus & MCAN_INTR_SRC_DEDICATED_RX_BUFF_MSG) == MCAN_INTR_SRC_DEDICATED_RX_BUFF_MSG) { } else if(((Mcan0IsrIntrStatus & MCAN_INTR_SRC_RX_FIFO0_NEW_MSG)) || ((Mcan0IsrIntrStatus & MCAN_INTR_SRC_RX_FIFO1_NEW_MSG))) { EventP_setBits(&gCanEvent, CAN_EVT_RX); } } if((Mcan0IsrIntrStatus & MCAN_INTR_SRC_BUS_OFF_STATUS) == MCAN_INTR_SRC_BUS_OFF_STATUS) { EventP_setBits(&gCanEvent, CAN_EVT_BUSOFF); } }
3. When the host calls the vtcan_mcan0ReadRxMSG() function for processing after receiving the message and triggering the CAN_EVT_RX event, the message delay will be detected. For example, the message cycle with CAN ID 0x123 is initially 20ms, but occasionally delays to 30ms before being received during faults.
stCANTypeMsgBaseInfo vtcan_mcan0ReadRxMSG(void) { uint32_t ackIdx = 0; stCANTypeMsgBaseInfo RxMsgInfo = { 0 }; MCAN_RxFIFOStatus fifoStatus = { 0 }; MCAN_RxBufElement rxMsg; memset(&rxMsg, 0x0, sizeof(rxMsg)); MCAN_getRxFIFOStatus(gMcan0BaseAddr, &fifoStatus); // DebugP_log("fifoStatus %d, %d, %d, %d, %d\n", fifoStatus.num, fifoStatus.getIdx, fifoStatus.fillLvl,fifoStatus.putIdx); ackIdx = fifoStatus.getIdx; if (fifoStatus.fillLvl) { MCAN_readMsgRam(gMcan0BaseAddr, MCAN_MEM_TYPE_FIFO, fifoStatus.getIdx, (uint32_t)fifoStatus.num, &rxMsg); MCAN_writeRxFIFOAck(gMcan0BaseAddr, (uint32_t)fifoStatus.num, ackIdx); RxMsgInfo.ID = rxMsg.id >> MCAN_STD_ID_SHIFT; RxMsgInfo.DLC = rxMsg.dlc; memcpy(&RxMsgInfo.u8Data, &rxMsg.data, RxMsgInfo.DLC); } return RxMsgInfo; }
Above, thank you!