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.

[参考译文] RM48L952:CAN IF3中断中的数据接收问题

Guru**** 2535750 points


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

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/1178267/rm48l952-data-receiving-problem-in-can-if3-interrupt

器件型号:RM48L952

大家好、感谢大家始终回答我的问题。
今天、我想问 CAN IF3中断的数据接收问题。
I DO 测试是一项测试、其中 HMI 向 CPU 发送3帧数据、CPU 在接收数据时分析数据、如果数据正确、则发送响应信号。
此时、CPU 使用 CAN IF3接收数据。
但是、有时 CPU 无法接收最后一个帧数据。 因此、请检查我产生的 CAN IF3中断是否错误。
我想问是否需要检查 CAN IF3中断中的中断挂起寄存器。
下面是我创建的 CAN IF3中断代码。

#pragma CODE_STATE(can1IF3UpdateInterrupt, 32)
#pragma INTERRUPT(can1IF3UpdateInterrupt, IRQ)
void can1IF3UpdateInterrupt(void)
{
    uint32_t value = (canREG1->IF3OBS & 0x9800) >> 8;  // IF3 Update data, IF3 Data A, IF3 Data B bit 확인 = 데이터 수신 확인
    uint32_t ID = canREG1->IF3ARB;                     // IF3 수신 데이터 ID
    uint32_t ES_value;                                 // error status register

    if(value == 0x98U)                               // IF3 데이터 수신 확인
    {
        canIF3Notification(canREG1, ID);             // canIF3Notification에서 CAN과 ID로 구분하여 수신 동작 처리
    }
    else                                             // CAN1 IF3 interrupt error
    {
        Send_SCI("Check IF3 1\r\n");
        ES_value = canREG1->ES;
        if((ES_value & 0x1E0U) != 0U)
        {
            canErrorNotification(canREG1, ES_value & 0x1E0U);
        }
        else
        {
            canStatusChangeNotification(canREG1, ES_value & 0x618U);
        }
    }
}

#pragma WEAK(canIF3Notification)
void canIF3Notification(canBASE_t *node, uint32 ID)
{
    uint32_t uiId = 0;

    uiId = ID & 0x1FFFFFFF;
    if((node == canREG1) && (uiId == CAN_HMI_ID_IN_CPU))      // CAN1 IF3의 ID 4 데이터 수신 from HMI
    {
        uint8_t i = 0;

        for(i = 0; i<8; i++)                         // 1Frame = 8Byte이므로 1Byte씩 8번 반복
        {
            ucCan1RxBuffer[uiCan1RxIndex] = node->IF3DATx[i];       // IF3 Data A, B 데이터를 RX1 버퍼로 복사
            Log_Msg_Save_RX(ucCan1RxBuffer[uiCan1RxIndex]);
            Frame_Data_Save(ucCan1RxBuffer[uiCan1RxIndex]);
            uiCan1RxIndex = (uiCan1RxIndex + 1) & CAN_RX_BUFFER_MASK;

        }
#if 1
        uint8_t ucMsb1ms;
        uint8_t ucLsb1ms;
        ucMsb1ms = (uint8_t)((us1sCounter & 0xFF00)>>8);
        ucLsb1ms = (uint8_t)(us1sCounter & 0x00FF);
        Log_Msg_Save_RX(ucMsb1ms);
        Log_Msg_Save_RX(ucLsb1ms);

        ucMsb1ms = (uint8_t)((us1msCounter & 0xFF00)>>8);
        ucLsb1ms = (uint8_t)(us1msCounter & 0x00FF);
        Log_Msg_Save_RX(ucMsb1ms);
        Log_Msg_Save_RX(ucLsb1ms);
#endif
    }
    else
    {
        //asm(" nop ");
        Send_SCI("Check IF3 2\r\n");
    }
}

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

    您好!

    最后一个帧是否复制到 IF3x 寄存器? 还是最后一个帧被复制到报文 RAM 中的报文对象?

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

    它不复制、而是完全不响应最后一个帧。
    通过示波器观察到3个帧通过 CAN 通信从 HMI 进行传输。
    但在 CPU 上、can1IF3UpdateInterrupt 仅响应两次。
    我通过计算 can1IFUpdateInterrupt 的反应来找到它。

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

    当传输失败(丢失仲裁或错误)时、消息将不会被丢弃。  您能否检查 您的发送器侧是否设置了 TxOK? 是否设置了任何错误标志?

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

    为了再次进行详细说明、我在上面提到的 CPU 和 HMI 是每个模块的名称。 我现在正在测试 HMI 模块和 CPU 模块之间的 CAN 通信。
    如上所述、测试从 HMI 模块传输3个帧到 CPU 模块、CPU 模块分析帧并在正确接收3个帧时传输响应信号。
    但是、有时 CPU 模块不发送响应信号。 通过分析原因、CPU 模块中断只发生2次、而不是3次。 精确地说、CPU 模块的 CAN1IF3UdateInterrupt 中没有针对最后一帧发生中断。
    我认为 HMI 模块不是在传输数据、但通过使用示波器进行检查、已确认传输了全部3个帧。
    因此、我想问我所做的 can1IF3UpdateInterrupt 是问题还是代码中缺少某项内容。 或者、我想问为什么会发生这种情况。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    [引用 userid="45190" URL"~/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/1178267/rm48l952-data-receiving-problem-in-can-if3-interrupt/4436940 #4436940"]消息不会被丢弃。

    它应该是"消息将被丢弃"。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    [引用 userid="518229" URL"~/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/1178267/rm48l952-data-receiving-problem-in-can-if3-interrupt/4437732 #4437732"]因此,我想问我所做的 can1IF3UpdateInterrupt 是问题还是代码中缺少什么。

    您的代码看起来正常。  

    当第3个帧的中断没有产生时、是否设置了任何错误标志?

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

    DCAN ES 寄存器的值保持为0x00000007。 因此、错误和状态显示没有问题。
    但是、在测试中、由于最后一个帧的接收中断(CAN1IF3UpdateInterrupt)没有发生、因此最后一个帧未被接收。

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

    IF3OBS 寄存器的 IF3Upd 位是否未设置?

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

    作为测试结果、当最后一帧的 CAN1IF3Update 中断没有发生时、第二帧的接收中断中的 CAN1IF3Upd 位未启用。
    因此、中断延迟不是原因。

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

    我使用 您的功能执行了相同的测试(简化)、它按预期工作:消息 ID 为18。 CAN2接收到所有数据、每次 IF3Uptd 标志都会置1。

    CAN1模块发送数据:3帧(3 * 8 = 24字节)

    for (cnnt=0;<D_COUNT/2;cnt++)

      canTransmit (canREG1、canMESSAGE_BOX1、TX_PTR);//MSG ID=18
       while (TX_DONE = 0){};

      TX_DONE = 0;
      TX_PTR +=8;//下一个块...*/

    /*用户代码开始(4)*/
    #if 1//此函数由一位客户编写

    uint8_t ucCan2RxBuffer[80];
    uint8_t* rx_ptr2 =&ucCan2RxBuffer[0];
    静态常量 uint32 s_canByteOrder[8U]={3U、2U、1U、0U、7U、 6U、5U、4U};

    void canIF3通知(canbase_t *节点、uint32 ID)

    uint32_t uiId = 0;

    uiId = ID 和0x1FFFFFFF;
    if ((node =canREG2)&&(uiId ==18))

    uint8_t i = 0;

    对于(i = 0;i<8;i++)

    *rx_ptr2++= node->IF3DATx[s_canByteOrder[i];


    其他


    #pragma CODE_STATE (CAN2IF3UpdateInterrupt、32)
    #pragma INTERRUPT (CAN2IF3UpdateInterrupt、IRQ)
    void can2IF3UpdateInterrupt (void)

    uint32_t value =(canREG2->IF3OBS & 0x9800)>>8;
    uint32_t ID = canREG2->IF3ARB;

    if (value == 0x98U)

    canIF3Notification (canREG2、ID);

    其他


    #endif //结束客户的功能