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.

[参考译文] TM4C123FH6PM:无法使用具有80或66.7 MHz 时钟的 CAN

Guru**** 2513185 points


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

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/784609/tm4c123fh6pm-unable-to-use-can-with-80-or-66-7-mhz-clock

器件型号:TM4C123FH6PM

美好的一天!

在我的设计中、我使用 Tiva MCU、外设通过 CAN 总线连接。 最近我意识到、我的设计会在总线上造成错误、经过一些调查后、我看到:

当系统时钟被配置为80MHz 时、实际的 CAN 模块时钟变为66.7MHz、在位定时配置之后、我得到0.5%的时钟误差、这是因为66.7MHz 不会产生准确的时间份额。

2.当系统时钟配置为66.7MHz 时、我会得到更多的错误、在这种情况下、CAN 模块时钟看起来是不稳定的。

在50MHz 时、系统时钟工作正常、但系统性能降低了40%左右。

当然、可以在80MHz 时钟下完美发挥作用、因为50ns 的时间份额对于250kbit 操作来说是最舒适的。

TivaWare 的 BTW 自动位时序配置产生的结果不完全符合 CAN 总线指南、因为建议将采样点设置为75%的位时间、但 CANBitRateSet 函数会在50%的位时间计算采样点。

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

    您能否显示代码:如何为80MHz 配置系统时钟以及如何初始化 CAN 模块?
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好!

    时钟初始化:

    /* 
    SysCtlClockSet (SYSCTL_SYSDIV_2 | SYSCTL_USE_PLL | SYSCTL_OSC_MAIN | SYSCTL_XTAL_16MHz); uint32_t Clk = SysCtlClockGet ();// Clk = 8000000 SysCtlClockSet (SYSCTL_SYSDIV_3 | SYSCTL_USE_PLL | SYSCTL_OSC_MAIN | SYSCTL_XTAL_16MHz); uint32_t Clk = SysCtlClockGet ();// Clk = 666666 * SysCtlClockSet (SYSCTL_SYSDIV_4 | SYSCTL_USE_PLL | SYSCTL_OSC_MAIN | SYSCTL_XTAL_16MHz); uint32_t Clk = SysCtlClockGet ();// Clk = 50000000

    CAN 初始化:

    CANInit (CANBase);
    uint32_t Clk = SysCtlClockGet ();
    
    //这只在50MHz 系统时钟下工作
    //在80MHz 时此设置会导致 CAN 帧的时间延长20%,从范围可以看出。
    //系统时钟频率为66.7MHz 时、错误几乎完全阻断通信、帧长度不稳定
    //CANBitRateSet (CANBase、Clk、250000);
    
    //这在80MHz 时有效、但会导致总线错误、因为位时序有0.5%的误差。
    //我可以与其他器件通信、但当我将 CAN 总线监视器连接到总线(我有 PEAKCAN 和 VS-COM)时
    、//它开始生成错误帧。
    //CANBitRateSet (CANBase、666666、250000);
    
    //这是50MHz 系统时钟
    tCANBitClkParms ={7、2、0、20}的最佳设置;
    CANBitTimingSet (CANBase、 参数(&P);
    
    

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好!
    我看到您的80MHz 设置有一些问题。 您写道:

    /* SysCtlClockSet (SYSCTL_SYSDIV_2 | SYSCTL_USE_PLL | SYSCTL_OSC_MAIN |
    SYSCTL_XTAL_16MHz);
    uint32_t Clk = SysCtlClockGet ();// Clk = 8000000

    然而、PLL VCO 输出为200MHz。 如果您将200MHz 除以2、您将得到100MHz。 这超出了规格。 应使用 SYSCTL_SYSDIV_2_5。 这会将200MHz 除以2.5、得到80MHz。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    谢谢! 它的工作原理。