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.

[参考译文] IWR6843AOP:D3 RS OP-6843AoP CAN-FD RX 问题

Guru**** 2438020 points
Other Parts Discussed in Thread: IWR6843AOP

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

https://e2e.ti.com/support/sensors-group/sensors/f/sensors-forum/1515272/iwr6843aop-d3-rs-6843aop-can-fd-rx-issue

器件型号:IWR6843AOP

工具/软件:

您好:

我正在努力集成 CAN-FD 驱动程序、以在 基于 IWR6843AOP 的 D3 RS 6843AoP 上工作。

在 D3 Engineering、本论坛和文档的支持下、我获得了 CAN 总线上用于传输 TLV 消息的单个器件。

固件基于开箱即用演示并经过修改以利用 UART 的 CAN-FD 接口、它还使用硬编码 CLI 配置。

下一步的目的是能够使用 CAN-FD 协议通过 CAN 总线发送配置。

我在使 CAN-FD 接收器正常工作时遇到问题、只要我使用 pinmux 命令设置 RX 引脚、生成的二进制文件会在使用以下命令发送消息时停止:

错误:CANFD 实例0传输数据失败[错误代码-3502]

(我正在使用 CLI_WRITE 命令通过 UART 进行调试、以将消息打印到 CLI 控制台)

如果设置另一个 RX 引脚、生成的二进制文件会发送 CAN-FD 消息、而不会出现任何问题。

简言之、我在文档和论坛中找不到任何此行为的解决方案、也提到了 BOSCH MCAN 用户手册。

以下是使 TX 无法工作并停止整个程序的 CAN 配置:

/**************************************************************************
******************** CAN Parameters initialize Function *****************
**************************************************************************/
static void MCANAppInitParams(CANFD_MCANInitParams* mcanCfgParams)
{
    /*Intialize MCAN Config Params*/
    memset (mcanCfgParams, sizeof (CANFD_MCANInitParams), 0);

    mcanCfgParams->fdMode = 0x1U;
    mcanCfgParams->brsEnable = 0x1U;
    mcanCfgParams->txpEnable = 0x0U;
    mcanCfgParams->efbi = 0x0U;
    mcanCfgParams->pxhddisable = 0x0U;

    // Disable auto-retransmission
    mcanCfgParams->darEnable = 0x1U;

    mcanCfgParams->wkupReqEnable = 0x1U;
    mcanCfgParams->autoWkupEnable = 0x1U;
    mcanCfgParams->emulationEnable = 0x0U;
    mcanCfgParams->emulationFAck = 0x0U;
    mcanCfgParams->clkStopFAck = 0x0U;
    mcanCfgParams->wdcPreload = 0x0U;
    mcanCfgParams->tdcEnable = 0x1U;
    mcanCfgParams->tdcConfig.tdcf = 0U;
    mcanCfgParams->tdcConfig.tdco = 8U;
    mcanCfgParams->monEnable = 0x0U;
    mcanCfgParams->asmEnable = 0x0U;
    mcanCfgParams->tsPrescalar = 0x0U;
    mcanCfgParams->tsSelect = 0x0U;
    mcanCfgParams->timeoutSelect = CANFD_MCANTimeOutSelect_CONT;
    mcanCfgParams->timeoutPreload = 0x0U;
    mcanCfgParams->timeoutCntEnable= 0x0U;

    // Reject all remote frames:
    // A remote frame is a frame that does not carry data,
    // but instead requests data from another node
    // CAN-FD does not support remote frames
    mcanCfgParams->filterConfig.rrfe = 0x1U;
    mcanCfgParams->filterConfig.rrfs = 0x1U;

    // Reject Non-matching frames
    // Non-matching frames are frames that do not match the
    // filter configuration of the receiver
    mcanCfgParams->filterConfig.anfe = 0x0U;
    mcanCfgParams->filterConfig.anfs = 0x3U;

    mcanCfgParams->msgRAMConfig.lss = 127U;
    mcanCfgParams->msgRAMConfig.lse = 64U;
    mcanCfgParams->msgRAMConfig.txBufNum = 32U;
    mcanCfgParams->msgRAMConfig.txFIFOSize = 0U;
    mcanCfgParams->msgRAMConfig.txBufMode = 0U;
    mcanCfgParams->msgRAMConfig.txEventFIFOSize = 0U;
    mcanCfgParams->msgRAMConfig.txEventFIFOWaterMark = 0U;

    // FIFO0 and FIFO1 are not used
    mcanCfgParams->msgRAMConfig.rxFIFO0size = 64U;
    mcanCfgParams->msgRAMConfig.rxFIFO0OpMode = 0U;
    mcanCfgParams->msgRAMConfig.rxFIFO0waterMark = 0U;

    mcanCfgParams->msgRAMConfig.rxFIFO1size = 64U;
    mcanCfgParams->msgRAMConfig.rxFIFO1waterMark = 0U;
    mcanCfgParams->msgRAMConfig.rxFIFO1OpMode = 0U;

    mcanCfgParams->eccConfig.enable = 1U;
    mcanCfgParams->eccConfig.enableChk = 1U;
    mcanCfgParams->eccConfig.enableRdModWr = 1U;

    /*
    Simplify Interrupts for Debug:
    Temporarily set mcanCfgParams->errInterruptEnable = 0U; while debugging reception.
    Re-enable it later and ensure MCANAppErrStatusCallback handles errors correctly (clears flags).*/
    mcanCfgParams->errInterruptEnable = 1U;

    mcanCfgParams->dataInterruptEnable = 1U;
    mcanCfgParams->appErrCallBack = MCANAppErrStatusCallback;
    mcanCfgParams->appDataCallBack = MCANAppCallback;
}

/**************************************************************************
*************************** CAN Driver Initialize Function ***********************
**************************************************************************/
void Can_Initialize(void)
{
    int32_t errCode = 0;
    int32_t retVal = 0;
    CANFD_MCANInitParams mcanCfgParams;
    CANFD_MCANBitTimingParams mcanBitTimingParams;
    gTxDoneFlag = 0;
    gRxDoneFlag = 0;


    /* Setup the PINMUX to bring out the XWR68xx CANFD pins. */

    //Enable CAN transciever AOP
    // D3 RS-6843AOPC: There is an enable signal on the CAN transceiver that is connected to ball C2 on the IWR6843AOP.
    // *  PINE15_PADAG functionality
    // *  Equivalent to PINC2_PADAG on XWR68XXAOP Device
    Pinmux_Set_Pull(SOC_XWR68XX_PINE15_PADAG, PINMUX_PULLDOWN_EN);

    // Set TX pin
    // D3 RS-6843AOPC: CAN TX is on ball D1 of the IWR6843AOP.
    // *  PINE14_PADAE functionality
    // *  Equivalent to PIND1_PADAE on XWR68XXAOP Device
    Pinmux_Set_OverrideCtrl(SOC_XWR68XX_PINE14_PADAE, PINMUX_OUTEN_RETAIN_HW_CTRL, PINMUX_INPEN_RETAIN_HW_CTRL);
    Pinmux_Set_FuncSel(SOC_XWR68XX_PINE14_PADAE, SOC_XWR68XX_PINE14_PADAE_CANFD_TX);

    // Set RX pin
    // D3 RS-6843AOPC: RX is on E2.
    // *  PINF14_PADAJ functionality
    // *  Equivalent to PINE2_PADAJ on XWR68XXAOP Device
    Pinmux_Set_OverrideCtrl(SOC_XWR68XX_PINF14_PADAJ, PINMUX_OUTEN_RETAIN_HW_CTRL, PINMUX_INPEN_RETAIN_HW_CTRL);
    Pinmux_Set_FuncSel(SOC_XWR68XX_PINF14_PADAJ, SOC_XWR68XX_PINF14_PADAJ_CANFD_RX);

     /* Configure the divide value for MCAN source clock */
    SOC_setPeripheralClock(gMmwMCB.socHandle, SOC_MODULE_MCAN, SOC_CLKSOURCE_VCLK, 4U, &errCode);

    /* Initialize peripheral memory */
    SOC_initPeripheralRam(gMmwMCB.socHandle, SOC_MODULE_MCAN, &errCode);


    CSL_FINSR(0x43201450, 22, 22, 0x1U);
    CSL_FINSR(0x4320140C, 26, 16, 0x23U);

    MCANAppInitParams (&mcanCfgParams);

    /* Initialize the CANFD 0 driver */
    canHandle = CANFD_init(0, &mcanCfgParams, &errCode);
    if (canHandle == NULL)
    {
        CLI_write ("Error: CANFD Module Initialization failed [Error code %d]\n", errCode);
        return;
    }

    /* Configuring 1Mbps and 1Mbps as nominal and data bit-rate respectively
     * Bit Rate = CAN_CLK / (k(PHSEG1 + PROPSEG + PHSEG2 + 1) * BRP)
        Prop seg: 8
        Ph seg 1: 6
        Ph Seg2 : 5
        Sync jump: 1
        BRP(Baud rate Prescaler): 2
        Nominal Bit rate = (40)/(((8+6+5)+1)*BRP) = 1Mhz
        Timing Params for Data Bit rate:
        Prop seg: 1
        Ph seg 1: 1
        Ph Seg2 : 1
        Sync jump: 1
        BRP(Baud rate Prescaler): 2
        Data Bit rate = (40)/(((1+1+1)+1)*BRP) = 5Mhz
    */

    mcanBitTimingParams.nomBrp = 0x2U;
    mcanBitTimingParams.nomPropSeg = 0x8U;
    mcanBitTimingParams.nomPseg1 = 0x6U;
    mcanBitTimingParams.nomPseg2 = 0x5U;
    mcanBitTimingParams.nomSjw = 0x1U;

    mcanBitTimingParams.dataBrp     = 0x2U;
    mcanBitTimingParams.dataPropSeg = 0x1U;
    mcanBitTimingParams.dataPseg1   = 0x1U;
    mcanBitTimingParams.dataPseg2   = 0x1U;
    mcanBitTimingParams.dataSjw     = 0x1U;


    /* Configure the CAN driver */
    retVal = CANFD_configBitTime (canHandle, &mcanBitTimingParams, &errCode);
    if (retVal < 0)
    {
        CLI_write ("Error: CANFD Module configure bit time failed [Error code %d]\n", errCode);
        return ;
    }

    /* Setup the transmit message object */
    txMsgObjectParams.direction = CANFD_Direction_TX;
    txMsgObjectParams.msgIdType = CANFD_MCANXidType_29_BIT;
    txMsgObjectParams.msgIdentifier = 0xD1;
    txMsgObjHandle = CANFD_createMsgObject (canHandle, &txMsgObjectParams, &errCode);
    if (txMsgObjHandle == NULL)
    {
        CLI_write ("Error: CANFD create Tx message object failed [Error code %d]\n", errCode);
        return ;
    }

    /* Setup the receive message object */
    rxMsgObjectParams.direction = CANFD_Direction_RX;
    rxMsgObjectParams.msgIdType = CANFD_MCANXidType_29_BIT;
    rxMsgObjectParams.msgIdentifier = 0xA1;

    rxMsgObjHandle = CANFD_createMsgObject (canHandle, &rxMsgObjectParams, &errCode);
    if (rxMsgObjHandle == NULL)
    {
        CLI_write ("Error: CANFD create Rx message object failed [Error code %d]\n", errCode);
        return ;
    }

    CLI_write("Debug: CANFD Instance 0 Initialization was successful\n");
}


协助调查此问题、或获得 EVM 的 CAN-FD TX 和 RX 的工作示例非常有用。

谢谢你

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

    您好:

    我想提供我昨天以来的最新进展情况。

    我已经确认 RX 在焊球上正常运行  F2 、我使用 D3的预编译示例二进制文件成功验证了接收情况。 很明显、当我在引脚多路复用中错误地设置 RX 焊球时、TX 将无法正常运行。

    此外、我能够使用我的自定义固件接收 CAN-FD 消息;但是、只有在为低速配置 CAN 位时序(标称和数据阶段均为5Kbps)时、这才成功。

    当我分别将标称阶段和数据阶段的位时序调整为1Mbps 和5Mbps 时、遇到 CANFD_REASON_PROTOCOL_ERR_DATA_PHASE。 我目前正在调查此问题。

    我怀疑两个节点之间的位时序参数可能不匹配。 当前设置包括一个雷达节点和另一个节点、即 Nvidia Jetson TX2。 在 Jetson 中、我使用 mttcan 驱动程序、似乎使用 BRP=1、而在雷达中、BRP 设置为2。 我还尝试使用 TX2配置的相同参数运行雷达、但如前所述、我收到了

    CANFD_REASON_PROTOCOL_ERR_DATA_PHASE。

    如果有人遇到类似问题并能提供见解、我将非常感激。

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

    您好:  

    我想为您提供一些资源、以防您尚未看到这些资源。  

    • CAN 集成用户指南、不过 您的 代码似乎与示例代码非常相似。 至少、我们已经验证了 CAN 集成示例在1Mbps 标称值和5Mbps 数据下同时适用于 Tx 和 Rx 运行。
    • CAN 驱动程序测试代码({mmwave_SDK3_install}\packages\ti\drivers\canfd\test\xwr68xx)  
    • 类似的 E2E 帖子

    对于您看到的第一个错误代码-3502、这通常是因为 Tx 缓冲区已满、这可能是由于 CAN 引脚未正确多路复用或消息参数不正确(例如在使用传统 CAN 帧时启用位速率切换)导致的

    对于 CANFD_REason_PROTOCOL_ERR_DATA_PHASE、正如 您正确假设的那样、这通常是两个节点之间的位时序不匹配导致的。 应确保所有节点之间的所有位时序参数都匹配。

    此致、

    Josh

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

    您好、  

    感谢您分享此论坛上的宝贵详细信息! 如果您仍然遇到任何问题、或者您有不相关的问题、请随时创建新帖子。  

    此致、

    Josh