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.

[参考译文] TMS320F280039C:MCAN — 不在>3Mbps 速率下工作

Guru**** 2536610 points
Other Parts Discussed in Thread: LAUNCHXL-F280039C, TCAN332, ISO1042

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

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/1543049/tms320f280039c-mcan---not-working-at-rates-3mbps

器件型号:TMS320F280039C
主题中讨论的其他器件:LAUNCHXL-F280039CTCAN332ISO1042

工具/软件:

您好、

我遇到的问题是、在我的控制器和  F280039C 评估板上、我的 CANFD 的数据速率无法高于 3Mbps、在两种设置中、我的控制器和 F280039C 评估板之间的电缆非常短 (< 10cm) 的两个 F280039C 评估板之间的数据速率无法达到 4Mbps。 我使用的是一个 CANFD 示例、我稍微扩展了这个示例、因此可以选择波特率、并在需要时触发一条消息。 所以在 3Mbps 的情况下一切都能正常工作、 但是我的主板在 3Mbps 的情况下已经有问题、两个评估板在 4Mbps 的情况下已经有问题。 在 3Mbps 速率下、我还可以使电缆长度为 1m、在这两种设置中不会出现任何问题。 我自己的电路板使用隔离式 CANFD 兼容收发器 ISO1042QDWVRQ1、因此唯一的区别或多或少是、两块电路板上的固件相同。

关于硬件:

我的定制电路板上的 CANFD 收发器(请注意,我已经删除了 10pF 电容器以进行测试):

请注意、在定制板上、收发器的 TX 和 RX 是 S50 阻抗匹配线路、只有几厘米。 驱动器的输出也只有几厘米、接近 120 欧姆差分和 60 欧姆单端 保证使用良好的设计实践(连续 GND 平面,阻抗匹配等)。

我测量的内容:

我使用示波器测量了评估板上的 TX 线路和另一个评估板/我的定制板上的 RX 线路、对于 1 字节有效载荷消息、结果如下所示(并非使用弹簧探针进行测量):

评估至评估值(工作正常):



评估到自定义(不工作):



从信号的角度来看、我认为它看起来不错。 最后、看起来没有来自接收节点的 ACK。

关于固件:

我使用 TI 的 MCAN_BitTimingCalculator.xls 来计算不同频率的时序。 两个控制器都使用一个外部 10ppm 容差 20MHz 晶体并在 120MHz 下运行。  


寄存器:

CANFD 时序:

#ifdef USE_500KBAUDPS
    //DIV3 -->500kBit (1Mbit/s data rate) --> Look at the timing calculator, put in 120Mhz, DIV3 etc. then look at Drierlib / Syscfg Inputs below in the .xlsx --> should output the values below!!!
    bitTimes.nomRatePrescalar   = 3U; // Nominal Baud Rate Pre-scaler
    bitTimes.nomTimeSeg1        = 9U; // Nominal Time segment before SP
    bitTimes.nomTimeSeg2        = 8U; // Nominal Time segment after SP
    bitTimes.nomSynchJumpWidth  = 8U; // Nominal SJW
    bitTimes.dataRatePrescalar  = 1U; // Data Baud Rate Pre-scaler
    bitTimes.dataTimeSeg1       = 9U; // Data Time segment before SP
    bitTimes.dataTimeSeg2       = 8U; // Data Time segment after SP
    bitTimes.dataSynchJumpWidth = 8U; // Data SJW
#endif

#ifdef USE_1MBAUDPS
    //DIV1 --> 1MBaudps --> 2Mbit/s data rate
    bitTimes.nomRatePrescalar   = 4U; // Nominal Baud Rate Pre-scaler
    bitTimes.nomTimeSeg1        = 11U; // Nominal Time segment before SP
    bitTimes.nomTimeSeg2        = 10U; // Nominal Time segment after SP
    bitTimes.nomSynchJumpWidth  = 10U; // Nominal SJW
    bitTimes.dataRatePrescalar  = 2U; // Data Baud Rate Pre-scaler
    bitTimes.dataTimeSeg1       = 9U; // Data Time segment before SP
    bitTimes.dataTimeSeg2       = 8U; // Data Time segment after SP
    bitTimes.dataSynchJumpWidth = 8U; // Data SJW
#endif

#ifdef USE_1_5MBAUDPS
    //DIV1 --> 1.5MBaudps --> 3Mbit/s data rate
    bitTimes.nomRatePrescalar   = 3U; // Nominal Baud Rate Pre-scaler
    bitTimes.nomTimeSeg1        = 10U; // Nominal Time segment before SP
    bitTimes.nomTimeSeg2        = 7U; // Nominal Time segment after SP
    bitTimes.nomSynchJumpWidth  = 7U; // Nominal SJW
    bitTimes.dataRatePrescalar  = 1U; // Data Baud Rate Pre-scaler
    bitTimes.dataTimeSeg1       = 10U; // Data Time segment before SP
    bitTimes.dataTimeSeg2       = 7U; // Data Time segment after SP
    bitTimes.dataSynchJumpWidth = 7U; // Data SJW
#endif

#ifdef USE_2MBAUDPS
    //DIV1 --> 2MBaudps --> 4Mbit/s data rate
    bitTimes.nomRatePrescalar   = 2U; // Nominal Baud Rate Pre-scaler
    bitTimes.nomTimeSeg1        = 9U; // Nominal Time segment before SP
    bitTimes.nomTimeSeg2        = 8U; // Nominal Time segment after SP
    bitTimes.nomSynchJumpWidth  = 8U; // Nominal SJW
    bitTimes.dataRatePrescalar  = 1U; // Data Baud Rate Pre-scaler
    bitTimes.dataTimeSeg1       = 6U; // Data Time segment before SP
    bitTimes.dataTimeSeg2       = 6U; // Data Time segment after SP
    bitTimes.dataSynchJumpWidth = 5U; // Data SJW

#endif

#ifdef USE_3MBAUDPS
    //DIV1 --> 3MBaudps --> 3Mbit/s data rate
    bitTimes.nomRatePrescalar   = 3U; // Nominal Baud Rate Pre-scaler
    bitTimes.nomTimeSeg1        = 5U; // Nominal Time segment before SP
    bitTimes.nomTimeSeg2        = 2U; // Nominal Time segment after SP
    bitTimes.nomSynchJumpWidth  = 2U; // Nominal SJW
    bitTimes.dataRatePrescalar  = 3U; // Data Baud Rate Pre-scaler
    bitTimes.dataTimeSeg1       = 5U; // Data Time segment before SP
    bitTimes.dataTimeSeg2       = 2U; // Data Time segment after SP
    bitTimes.dataSynchJumpWidth = 2U; // Data SJW
#endif

#ifdef USE_4MBAUDPS //Needs 2 termination resistors
    //DIV1 --> 4MBaudps --> 4Mbit/s data rate
    bitTimes.nomRatePrescalar   = 1U; // Nominal Baud Rate Pre-scaler
    bitTimes.nomTimeSeg1        = 7U; // Nominal Time segment before SP
    bitTimes.nomTimeSeg2        = 5U; // Nominal Time segment after SP
    bitTimes.nomSynchJumpWidth  = 5U; // Nominal SJW
    bitTimes.dataRatePrescalar  = 1U; // Data Baud Rate Pre-scaler
    bitTimes.dataTimeSeg1       = 7U; // Data Time segment before SP
    bitTimes.dataTimeSeg2       = 5U; // Data Time segment after SP
    bitTimes.dataSynchJumpWidth = 5U; // Data SJW
#endif

#ifdef USE_5MBAUDPS //Needs 2 termination resistors
    //DIV1 --> 5MBaudps --> 5Mbit/s data rate
    bitTimes.nomRatePrescalar   = 0U; // Nominal Baud Rate Pre-scaler
    bitTimes.nomTimeSeg1        = 3U; // Nominal Time segment before SP
    bitTimes.nomTimeSeg2        = 2U; // Nominal Time segment after SP
    bitTimes.nomSynchJumpWidth  = 2U; // Nominal SJW
    bitTimes.dataRatePrescalar  = 0U; // Data Baud Rate Pre-scaler
    bitTimes.dataTimeSeg1       = 3U; // Data Time segment before SP
    bitTimes.dataTimeSeg2       = 2U; // Data Time segment after SP
    bitTimes.dataSynchJumpWidth = 2U; // Data SJW
#endif

有什么想法、什么原因会导致这种情况发生? 最后、评估板还应该能够以 5Mbps 的速率运行、但他们不能。 所以我仍然认为这是固件问题、而不是硬件问题(ISO1042QDWVRQ1 有更多延迟,因此这可能是区别) 。 当我尝试从我的主板发送>3Mbps 或从 EVAL 主板发送>4Mbps 时、我不会得到一个 CAN 帧、只是在几个 100ns 后再向下和向上发送。

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

    您好 Hans:

    根据 500kbps 位时序片段、我假设 SYSCLK 在 120MHz 上运行、MCAN 在 40MHz 上运行、这与 SW 示例类似。  40MHz MCAN 速度由 API 函数   SysCtl_setMCANClk (SysCtl_MCANCLK_DIV_3) 定义。  请确认是否正确。  另请注意、在 MCAN 中、需要满足两个位时序。  第一个是 NOM(或标称)比特率、即从帧开始的比特率、仲裁位、控制位、DLC 和 BRS(比特率切换)。  在 BRS 之后、比特率切换到数据速率、这可能比标称速率快得多。

    MCAN 的标称速率只能高达 1Mbps、但数据速率可高达 5Mbps。  我看到片段中的一些标称位时序超过了 1Mbps。  对于标称比特率和数据比特率、请使用以下公式:

        比特率=(MCAN CLK/(速率预分频器+ 1))/(TimeSeg1 + TimeSeg2 + 3)

    假设 MCAN CLK 为 40MHz、并使用上述比特率公式、以下是 1Mbps 标称速率和 5Mbps 数据速率时要使用的值:

        nomRatePrescaler = 1U;

        nomTimeSeg1 = 9U;

        nomTimeSeg2 = 8U;

        DataRatePrescaler = 0U;

        dataTimeSeg1 = 3u;

        dataTimeSeg2 = 2U;

    此致、

    Joseph

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

    您好、Joseph:

    感谢您的答复。 我忘记提交 DIV、对于 500kbps、是的、它是  SYSCTL_MCANCLK_DIV_3、对于其余时序、是 SYSCTL_MCANCLK_DIV_1、因此 MCAN 时钟为 120MHz。

    哦、我应该还可以说标称位时间可以像数据比特率一样高、感谢您的澄清。 我仍然遇到问题、现在甚至在 3Mbps 的速率下、但只有在尝试从定制电路板发送数据时才会遇到问题。 在 4Mbps 速率下、也会发生在两个评估板之间、因此使用此类短电缆甚至不会接近 5Mbps。



    自定义(黄色 TX)至评估(蓝色 TX):

    评估(蓝色 TX)到自定义(黄色 TX):

    将完全相同的 64 字节消息从自定义发送到评估 PCB、然后反之亦然。 似乎是这样。 似乎定制电路板的 F280039C 甚至没有尝试发送该消息、但我真的不知道会是什么原因导致该消息。 在 2Mbps 时、它可以很好地工作。

    正如您所提到的、我调整了正常比特率、并再次使用 TI 的.xlsx 来计算波特率(在下面使用 SYSCTL_MCANCLK_DIV_2) :

    #ifdef USE_3MBAUDPS
        //DIV2 --> 1MBaudps nominal (max nominal speed is 1MBaudps) --> 3Mbit/s data rate
        bitTimes.nomRatePrescalar   = 2U; // Nominal Baud Rate Pre-scaler
        bitTimes.nomTimeSeg1        = 9U; // Nominal Time segment before SP
        bitTimes.nomTimeSeg2        = 8U; // Nominal Time segment after SP
        bitTimes.nomSynchJumpWidth  = 8U; // Nominal SJW
        bitTimes.dataRatePrescalar  = 0U; // Data Baud Rate Pre-scaler
        bitTimes.dataTimeSeg1       = 9U; // Data Time segment before SP
        bitTimes.dataTimeSeg2       = 8U; // Data Time segment after SP
        bitTimes.dataSynchJumpWidth = 8U; // Data S
    #endif
    
    #ifdef USE_4MBAUDPS //Needs 2 termination resistors
        //DIV2 --> 1MBaudps nominal (max nominal speed is 1MBaudps) --> 4Mbit/s data rate
        bitTimes.nomRatePrescalar   = 2U; // Nominal Baud Rate Pre-scaler
        bitTimes.nomTimeSeg1        = 9U; // Nominal Time segment before SP
        bitTimes.nomTimeSeg2        = 8U; // Nominal Time segment after SP
        bitTimes.nomSynchJumpWidth  = 8U; // Nominal SJW
        bitTimes.dataRatePrescalar  = 0U; // Data Baud Rate Pre-scaler
        bitTimes.dataTimeSeg1       = 6U; // Data Time segment before SP
        bitTimes.dataTimeSeg2       = 6U; // Data Time segment after SP
        bitTimes.dataSynchJumpWidth = 5U; // Data S
    #endif
    
    #ifdef USE_5MBAUDPS //Needs 2 termination resistors
        //DIV2 --> 1MBaudps nominal (max nominal speed is 1MBaudps) --> 5Mbit/s data rate
        bitTimes.nomRatePrescalar   = 2U; // Nominal Baud Rate Pre-scaler
        bitTimes.nomTimeSeg1        = 9U; // Nominal Time segment before SP
        bitTimes.nomTimeSeg2        = 8U; // Nominal Time segment after SP
        bitTimes.nomSynchJumpWidth  = 8U; // Nominal SJW
        bitTimes.dataRatePrescalar  = 0U; // Data Baud Rate Pre-scaler
        bitTimes.dataTimeSeg1       = 5U; // Data Time segment before SP
        bitTimes.dataTimeSeg2       = 4U; // Data Time segment after SP
        bitTimes.dataSynchJumpWidth = 4U; // Data S
    #endif

    设置评估板:



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

    您好 Hans:

    MCAN CLK 只能设置为从 20MHz 到 80MHz 作为 IP 限制。  120MHz 上的时钟超出 MCAN 模块的运行规格。  在本例中、您将被限制为 2、3、4 和 5 分频。  尝试将 MCAN 时钟降低为规格值。  只要不违反时钟规格、您的设置中应该可以轻松实现 5Mbps。

    此致、

    Joseph

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

    你好,约瑟夫,我已经使用了一个 DIV2 ,所以 60MHz 时钟信号,但这单独不起作用。 我现在添加了一个 130ns 的外部传播延迟、该延迟目前适用于评估板、其最高可达 5Mbps。 我带隔离式 CANFD 收发器的定制电路板现在的工作速率仅为 4Mbps、此外、外部传播延迟为 5Mbps、我未达到 200ns、控制器仅提供来自上方的信号。 现在我不知道导致这种情况的原因、但隔离式 CAN 收发器似乎无法实现 5Mbps 数据速率。  ISO1042QDWVRQ1 至少指出它可以处理高达 5Mbps 的速率。



    MCAN_BitTimingCalculator.xlsx:

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

    尊敬的 Han:

    抱歉、我跳过了上述回答中有关 div2 的部分。  您是否可以尝试一个 Div3、使 MCAN CLK 为 40MHz 并使用低于标称值和数据时序、看看您是否可以获得 1Mbps/5Mbps 标称值/数据速率?

        nomRatePrescaler = 1U;

        nomTimeSeg1 = 9U;

        nomTimeSeg2 = 8U;

        DataRatePrescaler = 0U;

        dataTimeSeg1 = 3u;

        dataTimeSeg2 = 2U;

    谢谢、

    Joseph

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

    你好 Joseph ,对不起晚回复。 我现在可以进行测试、它没有任何变化。 我只会在考虑收发器延迟时获得更快的速度。 我真的不明白它还有什么。

    我将 .xslx 中的总线长度调整到了 70m、使其能够以 4Mbps 的速率工作、但仍然不能以 5Mbps 的速率工作。

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

    您好 Hans:

    我正在查看一些在线论坛、大家都知道、达到 5Mbps 的电缆上限是 40m。  如果电缆长度较短、您是否能够在接收端示波器 CAN_L 和 CAN_H 端子(并对实际的 CAN 帧波形进行数学计算差异)?  希望检查传输帧的波形、以查看是否存在任何失真或噪声。  

    谢谢、

    Joseph

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

    您好、Joseph:

    我附上了 3Mbps 和 5Mbps 的 CAN_L 和 CAN_N 图。 您可以看到、在 5Mbps 时、CAN_L 和 CAN_H 看起来像悬空。

    黄色:CANL、浅蓝色:CANH、深蓝色:发送器 TX。

    3Mbps:

    5Mbps:

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

    您好 Hans:

    您能否再次仔细检查您的时间安排?  在 5Mbps 模式下、1 位宽度似乎为~1us。  该容值应~200ns。  另外、您能否对波形进行数学运算并显示 CAN_H - CAN_L、或者在 CANRX 侧的接收节点上获取示波器、而不是来自 TX 的蓝色迹线?  来自接收端收发器的差分波形将为接收节点生成 CANRX 波形。

    此外、您是否可以检查发送节点和接收节点上的 MCAN_PSR 寄存器内容、以查看事务期间可能发生了哪些错误?

    此致、

    Joseph

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

    您好、Joseph:  

    MCAN 以 1Mbps 标称数据速率和 5Mbps 数据速率运行、因此您在上面看到的是标称仲裁速率、然后在更改为数据速率时、似乎失败(未发送一个脉冲)。  

    现在、我使用蓝色迹线直接探测了接收器节点上的 RX 输入、而旧迹线没有变化:

    关于 PSR 寄存器:

    发送器节点:


    接收器节点:

    时间正确、我使用的是 DIV3 和来自.xlsx 的时序:

    编辑:

    这也是 3Mbps 的图、现在可以看到、当仲裁阶段结束时、它会正确切换至 333ns 周期时间:

    此致、

    Hans

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

    您好 Hans:

    好的、这说明了 5Mbps 速率下的 1us 位时间。  PSR 寄存器没有告诉我们任何有用的信息。  我们能否备份您分享的原始信息?

    我自己的电路板使用隔离式 CANFD 兼容收发器 ISO1042QDWVRQ1、因此这或多或少是唯一的区别、两个电路板上的固件是相同的。

    在图片中、您似乎使用的是 LAUNCHXL-F280039C、但该 LaunchPad 的原理图中使用的是 TCAN332DR:

    是否在 LaunchPad 上进行了修改、将 TCAN332 更改为隔离式收发器  ISO1042QDWVRQ1、或者这个硬件是否与您使用的硬件完全不同?  我已经使用 TCAN332 测试了多个应用、没有发现满足 5Mbps 速率的任何问题。

    谢谢、

    Joseph

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

    您好、Joseph:

    感谢调查。 您能和我分享用于测试的代码吗? 因为 如果没有修改延迟、我在两个原始 LAUNCHXL-F280039C 之间的运行速度不能超过 3Mbps

    最后几条消息中的 OSCi 图位于 EVAL 和我们采用 ISO1042 的定制测试板之间、因此它是我们自己的设计、完全面向 EVAL 板(与 F280039C 具有相同的组件、包括 CLK)。 布局不应该是问题、总体而言、我们使用了 S50 阻抗匹配、对于 CANL、CANH D120、连续 GND 平面等 总的来说、似乎某个 CAN 节点似乎错过了某个边缘或类似的东西。  

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

    e2e.ti.com/.../2021.MCAN_5F00_TEST_5F00_RX_5F00_TX.c

    我测试了随附的程序、该程序是从 MCAN 示例的 RX/TX 示例复制/粘贴;2Mbps 和 5Mbps 即使在两个新的评估板之间也能正常工作。 我真的不明白这里发生了什么

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

    您好 Hans:

    我还在努力。 我将再使用一个 Launchpad 来测试这一点。  给我一天时间来确保我的设置。

    此致、

    Joseph

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

    您好、Joseph:

    有任何消息从你? 我仍然无法解决问题。

    谢谢、

    Hans

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

    您好 Hans:

    对我延迟的回复表示歉意。  我已经与其他项目相适应、但回顾 PSR 状态、似乎在传输过程中有位错误指示。  在发送期间、MCAN 通过 RX 引脚接收帧并与发送的数据进行比较。  DLEC 错误报告的原因似乎是接收位与发送位不同、如果未考虑传播延迟、可能会在较高的波特率下发生这种情况。  MCAN 具有传输延迟补偿功能、允许 MCAN 补偿传输延迟。  请参阅第 29.5.4 节。

    请尝试通过启用设置 tdcEnable 位 (initParams.tdcEnable = 1) 并配置 tdco 和 tdcf 的值来实现传输延迟补偿。

    此致、

    Joseph

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

    您好、Joseph:

    您必须在示例中添加此标志。 感谢你的帮助。