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.

[参考译文] C2000WARE:SCI_setConfig 波特率计算错误

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

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

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/651054/c2000ware-sci_setconfig-baud-rate-calculated-wrong

器件型号:C2000WARE

你好、

我在 C2000WARE V1.00.3.00发行版中发现了一个专门针对 F2837xD 芯片的错误。

 driverlib 中的 SCI_setConfig()函数(第71行)按如下方式计算分频器:

分频器=((lspclkHz/(波特* 8U))- 1U); 

这是错误的、应该是:

分频器= lspclkHz/((波特* 8U)- 1U); 

此致、

SR

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

    感谢您发表此帖子。

    您能描述一下您是如何确认的吗? 您如何确定分频器错误并确定您的修复是否有效?

    这些信息对我们很有帮助。

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

    您好 Sal、

    所遵循的流程如下:

    1. 首先、我注意到超过115200波特时出现的问题、特别是921600波特、我遇到了严重的帧问题。
    2. 当我将 SCI TX 信号放在逻辑分析仪上时、很明显存在波特率问题。 在115200时、信号大约为115700 ish (不足以导致问题)、但在921600时、它会创建~1060000波特流、超出规格范围。
    3. 使用我之前的软件部分之一、我通过将波特率计算更改为:  

    分频器= lspclkHz/((baud * 8U)- 1U);请参阅下面的其他文章、问题只有一半...

    我再次验证了逻辑分析仪上的信号以及 Realterm 上的帧问题。

    其他项目信息:

    1. CPU 时钟频率为200MHz、外部20MHz 晶体和 PLL 被启用。
    2. R4.1集线站中使用了库存标准 F2837x controlCARD R1.3。
    3. C2000WARE V1.00.3.00
    4. CCS v7.1.0.0016

    此致、

    SR

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

    非常感谢您提供此信息。 我们将归档并更正此错误!

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

    我仔细检查了 TRM 的 SCI 章节中的公式。

    这两个公式与 driverlib (sci.c) SCI_setConfig()函数一致。

    如果您所说的内容为 true、则 TRM 中的公式似乎不正确。

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

    您好 Sal、

    我深入研究了这个问题、找到了根本原因。 这里的问题是波特率分频器的粗略设置以及导致波特率问题的实现问题。 我的意思是:

    使用数据表/lib 函数、921600 @ 50MHz 时钟提供的分频器为5、从而产生1041666波特。

    使用 my (OLD)函数时、921600 @ 50MHz 时钟会提供6分频器、从而产生892857波特。

    有趣的是、后者仅会有~3%的折扣、其中库函数的差异为~12%。

    这最终意味着函数本身(根据数据表)是正确的、但整数除法(以及相关的不正确舍入)会给出错误的除数。 当使用整数算术完成时、内部部分会错误地截断分频器值。 在我的示例中、50MHz /(921600 * 8)= 6.78168...、但实现(使用整数)会将其截断为仅6、使(1 - 0.78168...) 并给出最后的除数5。

    我已将驱动程序中的计算修改为以下内容、与数据表匹配、但使用浮点除法和+0.5f 来校正舍入(如+0.5f、截断、如果值为正值、就像舍入一样):

    divider =(uint32_t)(((float) lspclkHz/((float) baud)* 8.0f)+ 0.5f)- 1U; 

    它为我的情况提供了正确的分频器值6、对于任何其他值、它将始终处于最正确分频器值的-0.5至0.5之间。

    此致、

    SR

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

    感谢您的澄清和研究。 我想我们将在驱动程序中将公式更改为此。 这些较高的波特率似乎会出现问题、就像您使用的波特率一样。 因此、该公式应适用于低和高波特率。

    再次感谢你的帮助。

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

    您好 Sal、

    总是很乐意提供帮助,我很高兴!

    此致、

    SR

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

    SAL