您好!
在调试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
我们的代码如下:
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;
}