This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

[参考译文] TDA4VEN-Q1:CAN 消息接收延迟

Guru**** 2535750 points


请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/processors-group/processors/f/processors-forum/1566720/tda4ven-q1-can-message-reception-delay

器件型号:TDA4VEN-Q1


工具/软件:

您好、TI 专家

我们使用 j722s-RTOS-SDK-v11

CAN 中断函数

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.当主机在收到消息并触发 CAN_EVT_RX 事件后调用 vtcan_mcan0ReadRxMSG() 函数进行处理时、将检测到消息延迟。 例如、CAN ID 0x123 的消息周期最初为 20ms、但在故障期间偶尔会延迟至 30ms、然后才被接收。

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;
}

“谢谢你!

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好:

    如果我理解正确,问题是在应用程序缓冲区中偶尔延迟近 10 毫秒,用于接收 CAN 消息。 我是对的吗?

    如果是这样, 您可以检查 CAN 的 Rx 寄存器是否正确地按时收到它. CAN 是异步的、因此延迟不依赖于时钟、主要是由于操作系统中的任务导致的。  

    此致

    Tarun Mukesh