TDA4VEN-Q1: Can message reception delay

Part Number: TDA4VEN-Q1

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!

  • Hello,

    If i understand correctly, the problem is occasional delay of nearly 10 ms in the application buffer for reception of CAN Messages . Am i right ?

    If so  you can check in the Rx register of CAN whether you are receiving it on time correctly . Since CAN is asynchronous there is no dependency on clock for delay mostly it should be due to tasks in OS. 

    Regards

    Tarun Mukesh