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.

[参考译文] TMS320F280025:CAN 中断:获得中断时 RxOK 和消息目标编号之间的关系

Guru**** 2562120 points


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

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/1109467/tms320f280025-can-interrutp-relationship-between-rxok-and-message-object-number-when-getting-a-interrupt

器件型号:TMS320F280025

大家好、

我注意到在我们的示例代码中、当 CANISR 被触发时、我们首先检查这是一 个控制器状态中断、然后 检查它是 RxOK 还是 TxOK。

在这里、我想了解 RxOK 的功能。

RxOK 是否在每次可以接收帧时都发生?

有一段时间我们注意到、当接收到一个帧时、CANISR 将进入这里。

if (status =CAN_INT_INT0ID_STATUS)

STATUS = CAN_getStatus (CANA_base);//状态=0x10、表示 A RxOK

//
//检查是否发生错误。
//
if (((status &~(CAN_STATUS_TXOK | CAN_STATUS_RXOK))!= 7)&&
((STATUS &μ~(CAN_STATUS_TXOK | CAN_STATUS_RXOK))!= 0))

//
//设置一个标志来指示可能发生的某些错误。
//
errorFlag = 1;


在这种情况下、我们将无法进入相应的分支来处理接收。

否则、如果(status == RX_MSG_OBJ_ID)

//
//获取收到的消息
//
CAN_readMessage (CANA_base、RX_MSG_obj_ID、rxMsgData);

//
//到达这一点意味着 RX 中断发生在上
//报文对象2、报文 RX 完成。 清除
//消息目标中断。
//
CAN_clearInterruptStatus (CANA_base、RX_MSG_OBJ_ID);

//
//递增计数器以跟踪已有多少消息
//已收到。 在实际应用中、这可用于将标志设置为
//指示何时接收到消息。
//
rxMsgCount++;

//
//由于接收到消息,请清除所有错误标志。
//
错误标志= 0;

这让我有点困惑。

此致、

Brian

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

    您好 Brian、

    请查看 ISR 开始时的初始状态分配:

    //
    //读取 CAN-B 中断状态以查找中断原因
    //
    状态= CAN_getInterruptCus层(CANA_base);

    这将检查 INT0ID 中断0原因。 如果  出现错误(当函数返回0x8000时-请参阅寄存器说明中的 CAN_INT_INT0ID_STATUS 说明)、它将仅分支到 if (status = CAN_INT_INT0ID_STATUS)条件。  否则、STATUS [从  STATUS = CAN_getInterruptCase (CANA_base);] 将返回任何其他值、包括导致中断的消息对象。  在该示例中,如果(status=.... condition),则状态将为 RX_MSG_obj_ID,然后将分支到 else。  我想您对 错误条件 case  if (status = CAN_INT_INT0ID_STATUS)内的语句 status = CAN_getStatus (CANA_base)感到困惑。

    这有道理吗?

    此致、

    Joseph