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.

[参考译文] TMS320F28388D:在 MCAN 中使用经典 CAN 模式

Guru**** 2551570 points
Other Parts Discussed in Thread: C2000WARE

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

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/944423/tms320f28388d-using-classic-can-mode-in-mcan

器件型号:TMS320F28388D
主题中讨论的其他器件:C2000WARE

我想在 MCAN 模块中使用经典 CAN 模式。 因此、我使用了 mCAN_ex2_external_loopback 示例并将该值(initParams.fdMode)修改为0而不是1来禁用 CAN FD 操作、但在该示例之后、当我调用函数(MCAN_isFDOpEnable (MCAN0_BASE));)时、它返回 true、这意味着启用 CAN FD 操作。 您可以找到以下配置:

静态空 MCANConfig (void)
{
uint32_t fdoe;
MCAN_RevisionId revId;
MCAN_InitParams initParams;
MCAN_ConfigParams configParams;
MCAN_MsgRAMConfigParams msgRAMConfigParams;
MCAN_StdMsgIDFilterElement StdFiltelem;
MCAN_ExtMsgIDFilterElement extFileselem;
MCAN_BitTimingParams 位时间;

//
//初始化 MCAN Init 参数。
//
initParams.fdMode = 0x0U;// FD 运行被禁用。
initParams.brsEnable = 0x1U;//位速率切换
//传输已启用。
initParams.txpEnable = 0x1U;//发送暂停被启用。
initParams.efbi = 0x0U;//边缘过滤被禁用。
initParams.pxhddisable = 0x0U;//协议异常处理被启用。
initParams.darEnable = 0x1U;//自动重传消息
//传输未成功启用。
initParams.wkupReqEnable = 0x1U;//唤醒请求被启用。
initParams.autoWkupEnable = 0x1U;//启用自动唤醒。
initParams.emulationEnable = 0x1U;//启用仿真/调试挂起。
initParams.tdcEnable = 0x1U;//发送器延迟补偿为
//已启用。
initParams.wdcPreload = 0xFFU;//消息 RAM 的起始值
//看门狗计数器预加载。

//
//发送器延迟补偿参数。
//
initParams.tdcConfig.tdcf = 0xAU;
initParams.tdcConfig.tdco = 0x6U;

//
//初始化 MCAN 配置参数。
//
configParams.monEnable = 0x0U;//总线监控模式被禁用。
configParams.asmEnable = 0x0U;//正常 CAN 操作。
configParams.tsPrescalar = 0x2U;//预分频器值。
configParams.tsSelect = 0x2U;//时间戳计数器值。
configParams.timeoutSelect = MCAN_TIMEOUT_SELECT_CONT;
//超时计数器源选择。
configParams.timeoutPreload = 0xFFFFFF;//超时的开始值
//计数器。
configParams.timeoutCntEnable = 0x0U;//超时计数器被禁用。
configParams.filterConfig.rfs = 0x1U;//拒绝所有远程帧
// 29位扩展 ID。
configParams.filterConfig.rfe = 0x1U;//拒绝所有远程帧
// 11位标准 ID。
configParams.filterConfig.anfe = 0x1U;//接受 Rx FIFO 1.
configParams.filterConfig.anfs = 0x1U;//接受 Rx FIFO 1.

//
//初始化消息 RAM 段配置参数
//
msgRAMConfigParams.flssa. = MCAN_STD_ID_FILT_START_ADDR;
//标准 ID 过滤器列表起始地址。
msgRAMConfigParams.LSS = MCAN_STD_ID_FILTER_NUM;
//列表大小:标准标识。
msgRAMConfigParams.flesa = MCAN_EXT_ID_FILT_START_ADDR;
//扩展 ID 过滤器列表起始地址。
msgRAMConfigParams.LSE = MCAN_EXT_ID_FILTER_NUM;
//列表大小:扩展 ID。
msgRAMConfigParams.txStartAddr = MCAN_TX_缓冲 区启动 ADDR;
// Tx 缓冲区起始地址。
msgRAMConfigParams.txBufNum = MCAN_TX_缓冲 区大小;
//专用发送缓冲器的数量。
msgRAMConfigParams.txFIFOSize = MCAN_TX_FIFO_SIZE;
// Tx FIFO/队列。
msgRAMConfigParams.txBufMode = 0U;
msgRAMConfigParams.txBufElemSize = MCAN_Elem_Size_64BYTES;
// Tx 缓冲器元素大小。
msgRAMConfigParams.txEventFIFOStartAddr = MCAN_TX_EVENT_START_ADDR;
// Tx 事件 FIFO 起始地址。
msgRAMConfigParams.txEventFIFOSize = MCAN_TX_缓冲 区大小;
//事件 FIFO 大小。
msgRAMConfigParams.txEventFIFOWaterMark = MCAN_TX_EVENT_T水线;
Tx 事件 FIFO 水线中断的//级别。
msgRAMConfigParams.rxFIFO0startAddr = MCAN_FIFO_0_START_ADDR;
// Rx FIFO0起始地址。
msgRAMConfigParams.rxFIFO0size = MCAN_FIFO_0_NUM;
// Rx FIFO 元素的数量。
msgRAMConfigParams.rxFIFO0WaterMark = MCAN_FIFO_0_T水线;
msgRAMConfigParams.rxFIFO0OpMode = 0U;
msgRAMConfigParams.rxFIFO1startAddr = MCAN_FIFO_1_START_ADDR;
// Rx FIFO1起始地址。
msgRAMConfigParams.rxFIFO1size = MCAN_FIFO_1_NUM;
// Rx FIFO 元素的数量。
msgRAMConfigParams.rxFIFO1waterMark = MCAN_FIFO_1_T水线;
// Rx FIFO 1水印中断的级别。
msgRAMConfigParams.rxFIFO1OpMode = 0U;// FIFO 阻塞模式。
msgRAMConfigParams.rxBufStartAddr = MCAN_RX_缓冲 器_START_ADDR;
// Rx 缓冲器起始地址。
msgRAMConfigParams.rxBufElemSize = MCAN_Elem_Size_64BYTES;
// Rx 缓冲区元素大小。
msgRAMConfigParams.rxFIFO0ElemSize = MCAN_Elem_Size_64BYTES;
// Rx FIFO0元素大小。
msgRAMConfigParams.rxFIFO1ElemSize = MCAN_Elem_Size_64BYTES;
// Rx FIFO1元素大小。

//
//初始化 Tx 缓冲器配置参数。
//
stdFiltelem.sfid2. = 0x3U;//标准滤波器 ID 2.
stdFiltelem.sfid1. = 0x3U;//标准滤波器 ID 1.
stdFiltelem.sfec = 0x2U;//存储到 Rx 缓冲区或 As 中
//调试消息,SFT[1:0]的配置被忽略。
stdFiltelem.SFT = 0x0U;//范围滤波器从 SFID1到 SFID2。

//
//初始化 Tx 缓冲器配置参数。
//
extFiltelem.efid2 =(0x9U << 16U);
extFiltelem.efid2 |= 0xFFU;
extFiltelem.efid1 =(0x0U <<16U);
extFiltelem.efid1 |= 0xFFU;
extFiltelem.EFEC = 0x6U;
extFiltelem.eft = 0x0U;

//
//初始化位时序。
//
// bitTimes.nomRatePrescalar = 0x1FU;//标称波特率预分频器。
// bitTimes.nomTimeSeg1 = 0x1U;//采样点前的标称时间段。
// bitTimes.nomTimeSeg2 = 0x1U;//采样点后的标称时间段。
// bitTimes.nomSynchJumpWidth = 0x0U;//标称(重新)同步跳转宽度范围。
// bitTimes.dataRatePrescalar = 0x3U;//数据波特率预分频器。
// bitTimes.dataTimeSeg1 = 0x1U;//采样点前的数据时间段。
// bitTimes.dataTimeSeg2 = 0x1U;//采样点后的数据时间段。
// bitTimes.dataSynchJumpWidth = 0x0U;//数据(重新)同步跳转宽度。

//
//获取 MCANSS 版本 ID
//
MCAN_getRevisionId (MCAN0_BASE、&revId);



//
//等待内存初始化发生。
//
while (false =MCAN_isMemInitDone (MCAN0_BASE))
{
}

//
//将 MCAN 置于软件初始化模式。
//
MCAN_setOpMode (MCAN0_BASE、MCAN_OPERAING_MODE_SW_INIT);

//
//等待 MCAN 未初始化。
//
while (MCAN_OPERAT_MODE_SW_INIT!= MCAN_getOpMode (MCAN0_BASE))
{}

//
//初始化 MCAN 模块。
//
MCAN_init (MCAN0_BASE、initParams);

//
//配置 MCAN 模块。
//
MCAN_CONFIG (MCAN0_BASE、&CONFIGPARAMS);

//
//禁用外部时间戳溢出中断。
//
MCAN_extTSEnableIntr (MCAN0_BASE、1);

//
//配置时间戳计数器。
//
MCAN_extTSCounterConfig (MCAN0_BASE、MCAN_TS_PRESCAAR);

//
//配置位时序。
//
MCAN_setBitTime (MCAN0_BASE、bitTimes);

//
//设置扩展 ID 掩码。
//
MCAN_setExtIDAndMask (MCAN0_BASE、MCAN_EXT_ID_AND_MASK);

//
//配置消息 RAM 段
//
MCAN_msgRAMConfig (MCAN0_BASE、&msgRAMConfigParams);

//
//配置标准 ID 过滤器元素
//
MCAN_addStdMsgIDFilter (MCAN0_BASE、0U、&stdFiltelem);

//
//配置扩展 ID 过滤器元素
//
MCAN_addExtMsgIDFilter (MCAN0_BASE、0U、extFiltelem);

//
//启用外部计数器。
//
MCAN_extTSCounterEnable (MCAN0_BASE、1U);

//
//将 MCAN 从软件初始化模式中取出
//
MCAN_setOpMode (MCAN0_BASE、MCAN_OPERAING_MODE_NORMAL);

while (MCAN_operation_mode_normal!= MCAN_getOpMode (MCAN0_BASE))
{

}

fdoe = MCAN_isFDOpEnable (MCAN0_BASE);
if (true =fdoe)
{
//
// CAN-FD 运行被启用。
//
}
其他
{
//
// CAN-FD 运行被禁用。
//
}
} 

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

    Nada Wael、您好!  

    我们将研究您报告的问题。   是否尝试使用默认设置。 如果不是、请 使用默认设置 initParams.fdMode = 0x1U 检查 MCAN_isFDOpEnable (MCAN0_BASE)的返回值;并让我们知道您得到的结果。  

    谢谢、

    Krishna



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

    我尝试了这两种方法、得到了相同的结果

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

    谢谢、您能提供所有相关详细信息、如 C2000Ware 软件版本、CCS 等。  

    此致、

    Krishna  

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

    C2000 ware 版本3.2.0

    CCS 9.1

    我有另一个详细信息、但它与问题无关、因此它不会产生任何影响(CAN 收发器 MCP2551)

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

    在 MCAN_CCCR 中、FDOE 值为0、这意味着 CAN FD 操作被禁用、但在 MCANSS_STAT 寄存器中的 ENABLE_FDOE 值中为1、表示 CAN FD 操作被启用。 那么、这是怎么可能的呢? 您可以找到所附寄存器的屏幕截图。

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

    Nada Wael、您好!  

    我们正在准备调查此问题、并将在一天内回复您。 感谢您的耐心等待。  

    此致、

    Krishna  

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

    Nada Wael、您好!  

    快速更新。  我们能够重复您发现的问题、并尝试调试根本原因。  无论通过控制寄存器进行何种配置设置、它都会显示状态、表明 FDOE 已启用。  

    请注意、我们正在积极研究此问题、一旦我们有了解决方案/解决方法、我们就会立即返回给您。  

    谢谢、

    Krishna  

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

    您好!

    我在 TDA3上面临同样的问题。

    BR

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

    Daniel、您好!  

    感谢后续行动。  请详细介绍 TDA3。

    关于上一个线程报告的问题... MCANSS_STAT 寄存器应视为更多的器件硬件配置寄存器、并反映静态状态。  我们将更正 TRM 中的文档以反映这一点。

    为了使能标准操作、以下两个配置位必须被清零。

        initParams.fdMode            = 0x0U; // FD operation disabled.
        initParams.brsEnable         = 0x0U; // Bit rate switching for
                                             // transmissions enabled.
    如果您有任何疑问、请告知我们。
    谢谢、
    Krishna