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.

[参考译文] AWR1843:如何使 canfd 以高于5M 的比特率工作?

Guru**** 2558250 points


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

https://e2e.ti.com/support/sensors-group/sensors/f/sensors-forum/887043/awr1843-how-to-make-the-canfd-work-at-5m-bitrate-above

器件型号:AWR1843

您好!

在调试1843 MRR 项目时、我们遇到了一个问题、即 在一帧内以5M 速率通过 CANFd 传输64KB 数据(帧时间大约为1秒)。

PC 端的 USB-canfd 器件只能以  5M 的速率接收2帧数据、然后被吸入。  示波器表示未发送以下数据。

配置似乎不正确。 根据 之前的文章和 TI 的 canfd 测试演示、我们已经尝试了很多修改。 不幸的是 ,我们失败了。  

我们使用的 canfd 芯片是 TCAN1042HGV、它在1M 比特率下工作良好。

我们参考的帖子如下:

https://e2e.ti.com/support/sensors/f/1023/t/659876?tisearch=e2e-sitesearch&keymatch=canfd

e2e.ti.com/.../2648800

我们的代码如下:

void mbRadar_canfdInit (void)

int32_t 错误代码;
int32_t RetVal;
CANFD_Handle g_canHandle;
CANFD_MCANMsgObjCfgParams g_txMsgObjectParams;
CANFD_MCANMsgObjCfgParams g_txMsgObjectParams2;
CANFD_MCANInitParams g_mcanCfgParams;
CANFD_MCANBitTimingParams g_mcanBitTimingParams;
CANFD_MCANXidType CANType;

/*初始化平台*/
PlatformInit();

/*初始化 canfd 参数*/
MCANAppInitParams (&g_mcanCfgParams);

/*初始化 CANFD 驱动程序*/
G_canHandle = CANFD_INIT (&g_mcanCfgParams、&errCode);
if (g_canHandle == NULL)

System_printf ("错误:CANFD 模块初始化失败[错误代码%d]\n"、错误代码);
返回;

CANType = CANFD_MCANXidType_11_BIT;

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

G_mcanBitTimingParams.dataBrp = 0x1U;
G_mcanBitTimingParams.dataPropSeg = 0x2U;
G_mcanBitTimingParams.dataPseg1 = 0x2U;
G_mcanBitTimingParams.dataPseg2 = 0x3U;
G_mcanBitTimingParams.dataSjw = 0x1U;

/*配置 CAN 驱动程序*/
RetVal = CANFD_CONFIGBitTime (g_canHandle、&g_mcanBitTimingParams、&errCode);
如果(RetVal < 0)

System_printf ("错误:CANFD 模块配置位时间失败[错误代码%d]\n"、错误代码);
返回;

#if 1.
/*设置发送消息对象*/
G_txMsgObjectParams.Direction = CANFD_DIRECT_TX;
G_txMsgObjectParams.msgIdType = canType;
G_txMsgObjectParams.msgIdentifier = 0xE1;


G_txMsgObjectParams2.Direction = CANFD_DIRECT_TX;
G_txMsgObjectParams2.msgIdType = canType;
G_txMsgObjectParams2.msgIdentifier = 0xE2;
G_txMsgObjHandle = CANFD_createMsgObject (g_canHandle、&g_txMsgObjectParams、&errCode);
G_txMsgObjHandle2 = CANFD_createMsgObject (g_canHandle、&g_txMsgObjectParams2、&errCode);

if (g_txMsgObjHandle ==空)

System_printf ("错误:CANFD 创建 Tx 消息对象失败[错误代码%d]\n"、错误代码);
返回;

/*设置发送消息对象*/
G_txMsgObjectParams.Direction = CANFD_DIRECT_TX;
G_txMsgObjectParams.msgIdType = canType;
G_txMsgObjectParams.msgIdentifier = msGParam.RADAROutPUT_Filter_XY_ID;

G_txMsgObjHandle = CANFD_createMsgObject (g_canHandle、&g_txMsgObjectParams、&errCode);
if (g_txMsgObjHandle ==空)

System_printf ("错误:CANFD 创建 Tx 消息对象失败[错误代码%d]\n"、错误代码);
返回;

/*设置发送消息对象*/
G_txMsgObjectParams.Direction = CANFD_DIRECT_TX;
G_txMsgObjectParams.msgIdType = canType;
G_txMsgObjectParams.msgIdentifier = msGParam.RADAROutput:Trace_SP_ID;

G_txMsgObjHandle = CANFD_createMsgObject (g_canHandle、&g_txMsgObjectParams、&errCode);
if (g_txMsgObjHandle ==空)

System_printf ("错误:CANFD 创建 Tx 消息对象失败[错误代码%d]\n"、错误代码);
返回;

/*设置发送消息对象*/
G_txMsgObjectParams.Direction = CANFD_DIRECT_TX;
G_txMsgObjectParams.msgIdType = canType;
G_txMsgObjectParams.msgIdentifier = msGParam.RADAROutput:Trace_XY_ID;

G_txMsgObjHandle = CANFD_createMsgObject (g_canHandle、&g_txMsgObjectParams、&errCode);
if (g_txMsgObjHandle ==空)

System_printf ("错误:CANFD 创建 Tx 消息对象失败[错误代码%d]\n"、错误代码);
返回;

/*设置发送消息对象*/
G_txMsgObjectParams.Direction = CANFD_DIRECT_TX;
G_txMsgObjectParams.msgIdType = canType;
G_txMsgObjectParams.msgIdentifier = msGParam.RADAROutput:Cluster_SP_ID;

G_txMsgObjHandle = CANFD_createMsgObject (g_canHandle、&g_txMsgObjectParams、&errCode);
if (g_txMsgObjHandle ==空)

System_printf ("错误:CANFD 创建 Tx 消息对象失败[错误代码%d]\n"、错误代码);
返回;

/*设置发送消息对象*/
G_txMsgObjectParams.Direction = CANFD_DIRECT_TX;
G_txMsgObjectParams.msgIdType = canType;
G_txMsgObjectParams.msgIdentifier = msGParam.RADAROutput:Cluster_XY_ID;

G_txMsgObjHandle = CANFD_createMsgObject (g_canHandle、&g_txMsgObjectParams、&errCode);
if (g_txMsgObjHandle ==空)

System_printf ("错误:CANFD 创建 Tx 消息对象失败[错误代码%d]\n"、错误代码);
返回;

/*设置发送消息对象*/
G_txMsgObjectParams.Direction = CANFD_DIRECT_TX;
G_txMsgObjectParams.msgIdType = canType;
G_txMsgObjectParams.msgIdentifier = msGParam.RADAROutput 云 PK_ID;

G_txMsgObjHandle = CANFD_createMsgObject (g_canHandle、&g_txMsgObjectParams、&errCode);
if (g_txMsgObjHandle ==空)

System_printf ("错误:CANFD 创建 Tx 消息对象失败[错误代码%d]\n"、错误代码);
返回;

/*设置发送消息对象*/
G_txMsgObjectParams.Direction = CANFD_DIRECT_TX;
G_txMsgObjectParams.msgIdType = canType;
G_txMsgObjectParams.msgIdentifier = msGParam.RADAROutput 云 XY_ID;

G_txMsgObjHandle = CANFD_createMsgObject (g_canHandle、&g_txMsgObjectParams、&errCode);
if (g_txMsgObjHandle ==空)

System_printf ("错误:CANFD 创建 Tx 消息对象失败[错误代码%d]\n"、错误代码);
返回;

/*设置发送消息对象*/
G_txMsgObjectParams.Direction = CANFD_DIRECT_RX;
G_txMsgObjectParams.msgIdType = CANFD_MCANXidType_11_bit;
G_txMsgObjectParams.msgIdentifier = 0x200;//msgParam.RADARConfigID;

G_txMsgObjHandle = CANFD_createMsgObject (g_canHandle、&g_txMsgObjectParams、&errCode);
if (g_txMsgObjHandle ==空)

System_printf ("错误:CANFD 创建 Tx 消息对象失败[错误代码%d]\n"、错误代码);
返回;


/*设置发送消息对象*/
G_txMsgObjectParams.Direction = CANFD_DIRECT_RX;
G_txMsgObjectParams.msgIdType = canType;
G_txMsgObjectParams.msgIdentifier = msGParam.RADARConfigID;

G_txMsgObjHandle = CANFD_createMsgObject (g_canHandle、&g_txMsgObjectParams、&errCode);
if (g_txMsgObjHandle ==空)

System_printf ("错误:CANFD 创建 Tx 消息对象失败[错误代码%d]\n"、错误代码);
返回;

/*设置发送消息对象*/
G_txMsgObjectParams.Direction = CANFD_DIRECT_TX;
G_txMsgObjectParams.msgIdType = canType;
G_txMsgObjectParams.msgIdentifier = msGParam.RADARMsgReplayID;

G_txMsgObjHandle = CANFD_createMsgObject (g_canHandle、&g_txMsgObjectParams、&errCode);
if (g_txMsgObjHandle ==空)

System_printf ("错误:CANFD 创建 Tx 消息对象失败[错误代码%d]\n"、错误代码);
返回;

/*设置发送消息对象*/
G_txMsgObjectParams.Direction = CANFD_DIRECT_TX;
G_txMsgObjectParams.msgIdType = CANFD_MCANXidType_11_bit;
G_txMsgObjectParams.msgIdentifier = msGParam.RADARMsgUpgradeReplayID;

G_txMsgObjHandle = CANFD_createMsgObject (g_canHandle、&g_txMsgObjectParams、&errCode);
if (g_txMsgObjHandle ==空)

System_printf ("错误:CANFD 创建 Tx 消息对象失败[错误代码%d]\n"、错误代码);
返回;

/*设置发送消息对象*/
G_txMsgObjectParams.Direction = CANFD_DIRECT_RX;
G_txMsgObjectParams.msgIdType = CANFD_MCANXidType_11_bit;
G_txMsgObjectParams.msgIdentifier = msGParam.RADARMsgUpgradeID;

G_txMsgObjHandle = CANFD_createMsgObject (g_canHandle、&g_txMsgObjectParams、&errCode);
if (g_txMsgObjHandle ==空)

System_printf ("错误:CANFD 创建 Tx 消息对象失败[错误代码%d]\n"、错误代码);
返回;

/*设置发送消息对象*/
G_txMsgObjectParams.Direction = CANFD_DIRECT_RX;
G_txMsgObjectParams.msgIdType = CANFD_MCANXidType_11_bit;
G_txMsgObjectParams.msgIdentifier = 0x80;//msgParam.RADARMsgUpgradeID;

G_txMsgObjHandle = CANFD_createMsgObject (g_canHandle、&g_txMsgObjectParams、&errCode);
if (g_txMsgObjHandle ==空)

System_printf ("错误:CANFD 创建 Tx 消息对象失败[错误代码%d]\n"、错误代码);
返回;

/*设置发送消息对象*/
G_txMsgObjectParams.Direction = CANFD_DIRECT_RX;
G_txMsgObjectParams.msgIdType = CANFD_MCANXidType_11_bit;
G_txMsgObjectParams.msgIdentifier = 0x215;//msgParam.RADARMsgUpgradeID;

G_txMsgObjHandle = CANFD_createMsgObject (g_canHandle、&g_txMsgObjectParams、&errCode);
if (g_txMsgObjHandle ==空)

System_printf ("错误:CANFD 创建 Tx 消息对象失败[错误代码%d]\n"、错误代码);
返回;

#endif

System_printf ("[mbRadar][canFd]模块初始化成功!\n");
cli_write ("[mbRadar][canFd]模块初始化成功!\n");
返回;

静态 int32_t 平台初始化(void)

/*设置 PINMUX 以显示 XWR16xx CAN 引脚*/
Pinmux_set_OverrideCtrl (SOC_XWR18XX_PINE14_PADAE、PINMUX_OUTEN_RETAK_HW_CTRL、PINMUX_INPEN_RETAK_HW_CTRL);
Pinmux_Set_FuncSel (SOC_XWR18XX_PINE14_PADAE、SOC_XWR18XX_PINE14_PADAE_CANFD_TX);

Pinmux_set_OverrideCtrl (SOC_XWR18XX_PIND13_PADAD、PINMUX_OUTEN_RETAIN_HW_CTRL、PINMUX_INPEN_RETAIN_HW_CTRL);
Pinmux_Set_FuncSel (SOC_XWR18XX_PIND13_PADAD、SOC_XWR18XX_PIND13_PADAD_CANFD_RX);

返回0;

静态空 MCANAppInitParams (CANFD_MCANInitParams* mcanCfgParams)

/*初始化 MCAN 配置参数*/
memset (mcanCfgParams、sizeof (CANFD_MCANInitParams)、0);

mcanCfgParams->fdMode = 0x1U;
mcanCfgParams->brsEnable = 0x1U;
mcanCfgParams->txpEnable = 0x0U;
mcanCfgParams->efbi = 0x0U;
mcanCfgParams->pxhddisable = 0x0U;
mcanCfgParams->darEnable = 0x1U;
mcanCfgParams->wkupReqEnable = 0x1U;
mcanCfgParams->autwkupEnable = 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;
mcanCfgParams->filterConfig.rfe = 0x1U;
mcanCfgParams->filterConfig.rfs = 0x1U;
mcanCfgParams->filterConfig.anfe = 0x1U;
mcanCfgParams->filterConfig.anfs = 0x1U;
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;
mcanCfgParams->msgRAMConfig.rxFIFO0SIZE = 0U;
mcanCfgParams->msgRAMConfig.rxFIFO0OpMode = 0U;
mcanCfgParams->msgRAMConfig.rxFIFO0WaterMark = 0U;
mcanCfgParams->msgRAMConfig.rxFIFO1size = 64U;
mcanCfgParams->msgRAMConfig.rxFIFO1waterMark = 64U;
mcanCfgParams->msgRAMConfig.rxFIFO1OpMode = 64U;

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

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

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

    您好!

    我们将能够在本周结束前回复您

    谢谢你

    Cesar

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

    谢谢、Cesar

    我们使用的 MMW SDK 版本为3.1.0.2。

    为了减少发送延迟、我们 将 Task_sleep (1)替换为 mbRadar_canfdTxdelay、如下所示。

    不过、这两个函数都 毫无意义。

    void mbRadar_canfdTxdelay (void)

    uint32_t Wtime;
    Task_sleep (0);
    对于(Wtime = 0;Wtime < 43200;Wtime++)

    if (gTxDoneFlag1 = 1)

    gTxDoneFlag1 = 0;
    中断;


    int radar_CAN_send (uint32_t id、uint32_t len、uint8_t *数据)

    int32_t RetVal=0;
    if (框架% 2 = 0)
    RetVal = CANFD_transmitData (g_txMsgObjHandle、id、CANFD_MCANFrameType_FD、len、data、 返回值(&R);
    其他
    RetVal = CANFD_transmitData (g_txMsgObjHandle2、0xE2、CANFD_MCANFrameType_FD、len、DATA、 返回值(&R);
    cli_write ("retval:%d\n"、RetVal);
    如果(RetVal < 0)
    返回-1;
    mbRadar_canfdTxdelay();

    返回0;

    //int radar_ca_send (uint32_t id、uint32_t len、uint8_t *数据)
    //{
    // int32_t RetVal=0;
    // volatile uint32_t index = 0;
    // while (len>64U)
    //{
    //返回值= CANFD_transmitData (g_txMsgObjHandle、id、CANFD_MCANFrameType_FD、64、&DATA[index]、 返回值(&R);
    //如果(RetVal < 0)
    //返回-1;
    // mbRadar_canfdTxdelay();
    //索引=索引+ 64U;
    // len = len - 64U;
    //}
    // RetVal = CANFD_transmitData (g_txMsgObjHandle、id、CANFD_MCANFrameType_FD、len、&data[index]、 返回值(&R);
    //返回 RetVal;
    //}

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

    您好!

    当您没有看到消息时、您是否看到 CANFD 代码发生任何崩溃?

    -Raghu

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

    您好、Raghu

    我没有看到 CANFD 代码崩溃。

    现在我们已经解决了这个问题。

    无论如何都谢谢。

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

    您好!

    感谢您确认问题已解决。 如果您可以发布解决问题的更改、社区将受益。

    BR、

    Raghu