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.

[参考译文] TMS320F280037C:MCAN 模块故障排除、以提高 CAN 速度超过建议标准

Guru**** 2692625 points

Other Parts Discussed in Thread: SYSCONFIG

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

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/1592170/tms320f280037c-mcan-module-troubleshooting-to-increase-can-speed-above-recommednded-standard

器件型号: TMS320F280037C
主题: SysConfig 中讨论的其他器件

您好:

与之前的一篇文章相关 、我在其中问了几个关于如何将 CANFD 速度最大化、超过 1MHz 和 5MHz 的推荐标准的问题、我想继续介绍我能够收集的一些数据。

首先,我很抱歉没有回答这篇文章,因为我的预算用完了,我不得不延迟测试。 现在、我可以重新处理问题、并提供以下信息:

  • 我一直在进行测试、目的是了解并最大程度地提高 CAN 网络速度、同时保持简单的节点配置。 此配置由一个 PCAN-FD 和一个带有 TCAN1044AVDRBRQ1 CAN 驱动器的 F280037C MCU 组成。 在硬件级别、它应该能够达到 8Mb、而不会出现很多问题。

  • 我执行了以下测试。 我已经从 MCAN 计算器完全复制了位时序。 在测试过程中的任何时候均未修改硬件。 我使用的 CAN 电缆约为 1.5m。

    • 使用 1MHz(仲裁)/ 5MHz(数据)在 40MHz MCAN 时钟处进行测试。 效果良好。

    • 使用 2MHz(仲裁)/ 5MHz(数据)在 40MHz MCAN 时钟处进行测试。 效果良好。

    • 使用 1MHz(仲裁)/ 5MHz(数据)在 60MHz MCAN 时钟处进行测试。 我没有收到任何来自 PCAN 的消息。 当我尝试从 PCAN 发送消息来查询变量时、它会向 CAN 总线泛洪错误帧。

  • 对于这些测试、会出现以下问题:SYSCLK 是否需要比 MCAN 时钟运行快 X 倍才能使模块正常共存? 要将 MCAN 时钟增加到 60MHz、需要做什么? 我唯一做的就是更改位时序参数、并使用SysCtl_setMCANClk修改SYSCTL_O_AUXCLKDIVSEL寄存器的函数来修改分频器。 我是否需要修改另一个 SYSCLK 寄存器?

  • 在阅读上一篇文章后、我希望能够得到进一步的解释、说明延迟补偿的工作原理、以及我应遵循何种程序或计算方法、以调整延迟补偿数字。 此外、我想了解如何修改 MCAN 模块中的 CLK 输入、因为我无法找到任何直接更改 MCAN 输入时钟的 Drivelib 函数
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好 PikachuChisps _ ,

    这是美国的感恩节周末、因此请预计响应会有所延迟。

    --
    此致、
    Jagadish。

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

    您好  ,

    您能否分享以下信息:

    - MCAN 时钟分频器用于将 120MHz SYSCLK 从 F28003x 缩小至 60MHz MCANCLK

    -对于具有 1Mbps 仲裁和 5Mbps 数据的 60MHz MCAN 时钟,您能否分享所使用的位时序?

    谢谢、

    Joseph

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

    您好 Joseph、

    我很抱歉迟来的答复。 综上所述、我使用了 MCAN 时序计算器、建议配置:

    另外、我还能够以 2MHz 仲裁速率与 peakCAN 进行通信、但是、当通过使用   SYSCTL_MCANCLK_DIV_2 = 0x1、  //!<  MCAN 时钟= MCAN 时钟/2 来增加 MCAN 时钟时、MCAN 模块被缓冲、我无法了解为什么可以停止工作

    此致、

    David

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

    您好、David:

    我在最后一种配置中看到数据速率设置为 5Mbps (DTSeg1/(60MHz 1+DTseg2+3))、但不确定仲裁速率设置为什么。  无论如何、对于 MCAN 协议、仲裁速率仅高达 1Mbps。  如果超过此值、协议可能会返回错误。  这可能是仲裁设置为高于 1Mbps 时发生的情况。  检查 MCAN_ECR 和 MCAN_PSR(错误和状态寄存器)以查看 MCAN 运行期间可能发生了哪些错误。

    此致、

    Joseph

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

    Joseph、

    图中针对 1MHz 和 5MHz 的标称和数据位时序指定了这两个时序。 此外、我在 SysConfig 中对这两种速率都使用了 Drivelib CONFIG 寄存器。

    在 2MHz 工作不是问题、因为我一直使用 40MHz 的 MCAN 时钟以该速度测试代码。 当我增加 MCAN 时钟并使用 1mH 和 5MHz 时、就会出现问题。 MCAN 模块停止工作。

    此致、

    David

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

    您是否可以在程序中使用 MCANCLK = 60MHz、仲裁速率= 1Mbps、数据速率= 5Mbps 来尝试这些设置:

     

       //

       //初始化位时序。

      //
      bitTimes.nomRatePrescalar  = 0x2U//标称波特率预分频器
      bitTimes.nomTimeSeg1     = 0x9U// SP 之前的标称时间段
      bitTimes.nomTimeSeg2     = 0x8U// SP 之后的标称时间段
      bitTimes.nomSynchJumpWidth  = 0x8U//标称 SJW
      bitTimes.dataRatePrescale  = 0x0U//数据波特率预分频器
      bitTimes.dataTimeSeg1    = 0x5U// SP 之前的数据时间段
      bitTimes.dataTimeSeg2    = 0x4U// SP 之后的数据时间段
      bitTimes.dataSynchJumpWidth = 0x4U// Data SJW
    这些编辑将在 MCAN SW 示例的函数 MCANConfig () 中完成。  其计算公式如下:
    标称 (ARB) 速率=(60MHz /(nomRatePrescaler +1))/(nomTimeSeg1+nomTimeSeg2+3)
    数据速率= (60MHz TimeSeg1/(dataRatePrescaler+1))/(dataTimeSeg1+dataTimeSeg2+3)
    此致、
    Joseph
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    顺便说一下、最好始终检查 MCAN_ECR 和 MCAN_PSR 寄存器内容、因为这些寄存器将提供有关可能出了什么问题的信息/线索。

    此致、

    Joseph

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

    太好了、

    感谢您的回答、我将在本周尝试、并再次提供结果。

    David

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

    您好 Joseph、

    我使用我们自己的代码测试以下配置:

    几秒钟后、我确认没有发送消息、并且 PSR 和 ECR 寄存器如图所示

    借助此配置、CAN 无法正常工作。

    现在我将通过一个 MCAN 示例进行测试、以观察是否有任何差异。

    此致、

    David

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

    Joseph、

    我还尝试了使用 MCAN 协议的外设 9 并适应 MCU 280037C。 如果不修改预调速度、则无法正常工作。 我更改了 ccxml、 GPIO_setPinConfig (DEVICE_GPIO_CFG_MCANRXA) 函数、以通过我们的 PCB 配置发送它们、并确保时钟输入为 20MHz、就像在 PCB 中一样。 我有什么遗漏吗?

    David

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

    您好、David:

       根据 PSR 寄存器值、MCAN 处于 BUSOFF 状态。  总线关闭使 F28003x CAN 与网络断开、因为它已尝试传输数据、但 CAN 协议将其解释为格式错误 (TEC — 传输错误最大值结束,触发总线关闭;BO = 1)。  DLEC = 101 表示检测到 bit0 错误。  当节点尝试转换为“0"但“但总线检测到“1"时“时、会发生这种情况。  这表明存在时间/采样问题。  查看日志中的另一个位状态、我看到 TDC 设置为 1、这意味着发送器延迟补偿已启用。  TDC 是一种机制、该机制允许 CAN-FD 补偿硬件中的传播延迟、从而通过测量帧传输时以及同一帧到达 CAN RX 引脚时的数据阶段延迟来获得更高的波特率。   必须正确配置 MCAN_TDCR 寄存器中的 TDCF 和 TDCO、才能使 TDC 正常工作。  TRM 中的发送器延迟补偿一节介绍了此过程、其中说明了如何设置这些值。

       可以看到、标称位时间和数据位时间根据 SYSCLK=SYSCLK 120MHz、60MHz、标称速率=1Mbps、数据速率=5Mbps 的寄存器值进行正确配置。

    此致、

    Joseph

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

    您好、David:

    我有机会在 F280039 LaunchPad 上尝试一个 1Mbps 仲裁和 5Mbps 数据速率的 MCAN 传输实验。  我使用了 mcan_ex9_transmit.c、但必须重新配置位时序并启用 TDC 才能使其正常工作。  请参阅下面我在 MCANConfig() 函数中添加的修改。  请注意、我使用的是原始示例分频器 40MHz MCAN 时钟 、即 SysCtl_setMCANClk (SysCtl_MCANCLK_DIV_3)。  该器件配置为 120MHz 的 SYSCLK。  以下是对代码的修改:

      MCANCLK/3 = 120MHz 40MHz
      //
      //发送器延迟补偿参数。
      / /
      initParams.tdcEnable     = 1;//需要启用此功能以实现更高的波特率
      initParams.tdcConfig.tdcf  = 0xAU
      initParams.tdcConfig.tdco  = 0x6U
      //
      //初始化位时序。
      //
        bitTimes.nomRatePrescalar = 0x1U//标称波特率预分频器
        bitTimes.nomTimeSeg1    = 0x9U// SP 之前的标称时间段
        bitTimes.nomTimeSeg2    = 0x8U// SP 之后的标称时间段
        bitTimes.nomSynchJumpWidth = 0x8U//标称 SJW
        bitTimes.dataRatePrescale = 0x0U//数据波特率预分频器
        bitTimes.dataTimeSeg1   = 0x2U// SP 之前的数据时间段
        bitTimes.dataTimeSeg2   = 0x3U// SP 之后的数据时间段
        bitTimes.dataSynchJumpWidth = 0x3U// Data SJW
    我将 LaunchPad 收发器输出连接到 PEAK CAN、能够确认 F28003x 以 1Mbps 标称数据速率和 5Mbps 数据速率正确发送帧。  查看这是否适用于您的设置。  您可能需要根据您的设置调整 tdcf 和 tdco。
    希望这对您的调试有所帮助。
    此致、
    Joseph
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您还可以通过将分频器设置为 div2 并使用以下位时序来尝试 60MHz MCANCLK:

      // 60MHz MCANCLK = 120MHz /2
        bitTimes.nomRatePrescalar = 0x2U//标称波特率预分频器
        bitTimes.nomTimeSeg1    = 0x9U// SP 之前的标称时间段
        bitTimes.nomTimeSeg2    = 0x8U// SP 之后的标称时间段
        bitTimes.nomSynchJumpWidth = 0x8U//标称 SJW
        bitTimes.dataRatePrescale = 0x0U//数据波特率预分频器
        bitTimes.dataTimeSeg1   = 0x4U// SP 之前的数据时间段
        bitTimes.dataTimeSeg2   = 0x5U// SP 之后的数据时间段
        bitTimes.dataSynchJumpWidth = 0x5U// Data SJW
    上述位时序也起作用。
    此致、
    Joseph
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    Joseph、

    非常感谢您的解释。 您能否进一步说明如何配置寄存器用于发送器延迟补偿? 我不支持他们做什么、但我不否认为什么需要我的案例。 从 MCU TX 引脚到驱动器、到 Rx 引脚的总长度最大约为 20mm、5MHz 信号的传播延迟比 60MHz 上的 MCAN 时钟要严重得多? 我有什么遗漏吗?

    此致、

    David

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

    您好、David:

    该延迟不仅考虑 TX/RX 线路的长度、还考虑收发器引入的环路延迟、该延迟在较高的波特率下会变得显著。  如果环路延迟高于 CAN 位时间(1/波特率)、CAN 将无法检测这些位是否已正确发送。  为了考虑环路延迟、通过 TDC 建立了次级采样点 (SSP)、而不是 CAN 位的原始采样点、即 Tseg1/(Tseg1+Tseg2)。

    请参阅 TRM 中的第 29.5.4 章“发送器延迟补偿“、了解更全面的说明。  TDC 是 F28003x 所独有的一项功能。  它是 MCAN 协议的一部分、任何其他系统中的所有 CAN-FD 模块都具有该协议。

    此致、

    Joseph

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

    Joseph、

    我完全忘记了收发器增加的环路延迟。 让我进一步测试您添加的所有信息。 我将在下一周再回来。

    感谢您的帮助、

    David

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

    好的、David。  希望这将帮助您在应用中实现更高的波特率。

    此致、

    Joseph