请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
器件型号: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;
}
“谢谢你!