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.

[参考译文] RM44L920:DCAN 内部环回测试

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

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/1461005/rm44l920-dcan-internal-loopback-test

器件型号:RM44L920

工具与软件:

您好!

我将尝试根据安全手册和 TRM (技术参考手册)中所述的配置实施 DCAN 内部模拟环回测试。

问题是、尽管 sl_SelfTest_CAN 可以执行模拟环回测试、但 SDL API 文档根本没有定义或提及环回模式。 此外、提供的文档编写不完善、没有全面介绍内部环回模式的配置过程、这在理解如何正确配置系统方面留下了许多空白。

根据文档、我知道 DCAN 需要处于测试模式、并且必须通过设置测试寄存器中的 LBack 位来激活内部环回模式。

但是、虽然我可以确认正在发送数据(我已经嗅探了 TX 线路)、但我遇到的问题是 Rx 缓冲区 即使 DCAN 配置为环回模式、也会保持为空。

下面是启用测试模式和内部环回后控制和测试寄存器的当前配置:

  • DCAN2->Ctrl = 0x00032882
  • DCAN2->Test = 0x00000090
  • DCAN2->ErrStat = 0x00000008
  • DCAN2->IoCtrlTx = 0x0004000F
  • DCAN2->IoCtrlRx = 0x00040009

以下是我的测试函数:

SdlRun_retval_e SdlRun_can_init_loopback()
{
    SdlRun_retval_e retVal = SDL_RUN_EINVAL;
    boolean status = FALSE;
    bool canStatus;

    const uint8_t txBuf[8u] = {0x00u, 0xFFu, 0x0Fu, 0xF0u, 0x33u, 0xCCu, 0x55u, 0xAAu};
    uint8_t rxBuf[8u];
    uint8_t rxLen;

    /* Enable CAN test mode */
    canREG2->CTL |= (uint32_t)(1U << 7);
    /* Activate Loopback Mode */
    canREG2->TEST |= (uint32)(1U << 4);


    /* Send CAN message */
    canStatus = CAN_boWrite(CAN_HDL_LP_TX, txBuf);
    if(canStatus != TRUE)
    {
        retVal = SDL_RUN_EINTERNAL;
    }

    /* Send messages from TX buffer */
    CAN_Tx_Job();

    /* Periodic CAN read */
    canStatus = FALSE;
    do
    {
        /* Receive CAN message */
        canStatus = CAN_boRead(CAN_HDL_LP_RX, rxBuf, &rxLen);
    } while (canStatus != TRUE);

    /* Compare data */
    status = memcmp((void*)txBuf, (void*)rxBuf, 8u);
    if (status != 0)
    {
        retVal = SDL_RUN_EDATA;
        // break;
    }
    
    /* Disable CAN test mode */
    canREG2->CTL &= ~(uint32_t)(1U << 7);
    /* Deactivate Loopback Mode */
    canREG2->TEST &= ~(uint32)(1U << 4);

    /* Test passed */
    retVal = SDL_RUN_SUCCESS;

    return retVal;

}

我是否针对内部环回模式正确配置了 DCAN?

为什么在环回模式下发送数据后 RX 缓冲区为空?

谢谢、此致、

Ilija