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.

[参考译文] LP-MSPM0L2228:两个 LP-MSPM0L2228 评估模块之间使用 32.768kHz 晶体和相同 UART 设置时、UART 通信失败

Guru**** 2644665 points

Other Parts Discussed in Thread: MSPM0L2228, LP-MSPM0L2228, MSP430FR6007, MSP430FR6047

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

https://e2e.ti.com/support/microcontrollers/msp-low-power-microcontrollers-group/msp430/f/msp-low-power-microcontroller-forum/1541017/lp-mspm0l2228-uart-communication-fail-between-two-lp-mspm0l2228-evaluation-modules-using-32-768-khz-crystal-and-identical-uart-settings

器件型号: LP-MSPM0L2228
Thread 中讨论的其他器件: MSP430FR6007、MSPM0L2228、 MSP430FR6047

工具/软件:

您好、

我尝试 使用两个板上的 UART1 在两个 LP-MSPM0L2228 板之间发送数据。

我们的最后一个用例是我们大部分时间都需要在低功耗模式下运行的设置、这意味着我们不能使用 HFCLK — 因此选择了 LFCLK (LFXT 32.768kHz)。

UART 必须以 9600 波特和 8 个数据位、无奇偶校验位和 2 个停止位进行通信、才能使用我们的现有设置。我们的现有设置包含 MSP430FR6007 器件以及非 TI 器件、所有器件都从 32.768kHz 晶体运行其 UART。

测试时、我使用“uart_echo_interrupts_standby"示“示例、然后在引脚 PA8 + PA9 上切换到 LFXT 和 UART1。 此外、我还为 LFCLK 启用了引脚 PA27 上的 CLKOUT。

对于 RX 工程、我还在 PA25 上有一个调试引脚、指示示例代码何时检测到接收的数据不一致。

如果我为 UART 设置以下设置、则可以实现无错误通信:

源:MSPM0L2228 8N2(9576.04 波特)->目标:MSPM0L2228 8N1(9709.04 波特) ->确定

来源:MSPM0L2228 8 1 波特率为 9576.04 ->目标:MSPM0L2228 8N1、波特率为 9709.04 ->正常

 

如果我为两个 UART 设置以下对称设置、我会执行该操作 不会 获取无差错通信:

源:MSPM0L2228 8N2(9576.04 波特)->目标:MSPM0L2228 8N2(9576.04 波特) ->失败

源:MSPM0L2228 8E1(9576.04 波特)->目标:MSPM0L2228 8E1(9576.04 波特)  ->失败

1) 设置 2 个 MSPM0L2228 评估模块时。 一个用于 TX、一个用于具有相同设置(波特率,奇偶校验和停止位)的 RX,那么我没有获得无差错通信 — 怎么回事?   我设置的项目是错误的、还是这种行为符合预期?

我还很难获得我们的非 TI 处理器来 从 MSPM0L2228 接收无差错传输。 不过、我们以前的非 TI 处理器可以顺利通过 MSP430FR6007 实现。

2) 是否有更多参数可以在 MSPM0L2228 上调整/调整、以便使非 TI 处理器正确接收来自 MSPM0L2228 的传输。 到目前为止、我是否已调整奇偶校验位和停止位以及波特率 (IBRD + FBRD)?

3) 据我所知、MSP430FR6007 有一个寄存器、我们可以在该寄存器中修改位调制模式。 MSPM0L2228 的整数和分数部分具体如何工作、这可以解释我们为什么看到通信失败?

下面、我提供了 3 张图片、展示了当两个 MSPM0L228 模块相互通信时捕获的逻辑分析仪的情况。

两个电路板均设置为 8 个数据位、无奇偶校验位和 2 个停止位、波特率为 9576(通过 syscfg)。

发送代码发送一个字节 — 使其递增,然后再次发送。

接收代码会接收一个字节并验证其是否比前一个接收到的字节高 1 — 如果不切换,则切换 PA25 — 无论该字节是否匹配,都会传输该字节。

 

MCU1:来自源端 MSPM0L2228 板的 MSPM0L2228 TX src // TX //(PA8_UART1-TX(源端 MSPM02228 板))

MCU1:来自源板的 CLK// LFCLK //(PA27(源 MSPM02228 板))

MCU3: 来自目标 MSPM0L2228 板的 MSPM0L2228 TX DST// TX(该板回显从源板接收到的内容) //(PA9_UART1-RX(目标 MSPM02228 板))

MCU3:CLK  //来自目标板的 LFCLK //(PA27(目标 MSPM02228 板))

MCU3:错误(切换) //来自目标板的 GPIO、每次该板接收到一个顺序错误的字节时、都会切换该 GPIO。 通常会一个接一个地出现两个切换–错误字节// (PA25(目标 MSPM02228 板)) 的每侧各一个

 

PA8_UART1-TX(源 MSPM02228 板)连接到 PA9_UART1-RX(目标 MSPM02228 板)

两块电路板之间连接的接地端。

第一张图片展示了两个电路板之间的整个通信(几百)。 MCU 中的每个状态移位:错误(切换)指示按顺序接收到的字节。

第二张图片显示了其中一个错误的特写。 错误地将字节 0x99 接收为 0x91。

最后一张图片进一步放大、因此更容易看到两个电路板的时钟。

如果需要更多信息、请告诉我。

此致  

BUE

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

    您好、

    使用 LFCLK 作为 UART 的时钟源会导致实际波特率显著偏差。 我建议使用不同的时钟源进行测试、并检查您是否仍然观察到问题。

    此致、

    现金好

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

    嗨、现金。

    非常感谢您的回答。  

    我现在已经尝试使用另一个时钟源并通过 HFXT 运行、但因为我们正在开发一个从长期来看不可行的低功耗应用。

    我的问题仍然存在 — 是否不能设置   2 个从 LFXT (32.768kHz) 运行的 MSPM0L2228 评估模块并采用完全相同的 UART 设置 — 一个用于发送,一个用于接收,然后预期它们之间无差错通信?

    我知道从 ULPCLK 运行时也应该可以使用异步快速时钟请求、但如果理解正确、那么接收和发送时的功耗将与 STOP0 相当甚至更高?

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    ]我的问题仍然存在 — 是否不能设置   2 个从 LFXT (32.768kHz) 运行的 MSPM0L2228 评估模块、其 UART 设置完全相同 — 一个用于发送,一个用于接收,然后预期它们之间无差错通信?[/报价]

    如果它们使用相同的 32kHz 时钟、是的。 如果没有,那么没有

    如示波器捕获所示、位时间为 3 或 4 个时钟周期。

    接收器检测到一个起始位、然后开始接收数据。 但其时钟与发送时钟不对齐、因此这里可能会有很多延迟。 接收时钟的一个周期。 在 3X 过采样模式下、接收器在其第二个时钟上对每个位进行采样。 (未知是其时钟的样子。) 这会使采样时间危险地接近发送的位的末尾。 增加来自异步时钟的延迟、这样就会出现问题。

    我预计、如果速度稍慢一些、8X 过采样模式的效果会更好。

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

    您好、David。
    非常感谢您的回答。
    我已经使用由 32.768kHz 晶体提供时钟的 MSPM0L2228 进行了更多实验、如果我将 IBRD 设置为 1、将 FBRD 设置为 0、从而获得 10922.67 的波特率、我能够在 MSPM0L2228-MSPM0L2228、MSPM0L2228-MSP430FR6047 和 MSPM0L2228 第三方芯片之间无任何错误地发送和接收。 这是否意味着导致我所有问题的是波特率分频的特定实现? µPs 我不使用波特率发生器的分数部分 (FBRD = 0)、即使 Θ 由单个 32.768kHz 晶体计时、也不应该出现任何问题、或者我的特定设置是否可以正常运行?

    为了进行比较、MSP430FR6047 之前已成功与第三方芯片无误通信、在此设置中、MSP430FR6047 的 UART 也由 32.768kHz 晶体提供时钟、波特率设置为 9600、而没有出现重大问题。

    关于 8X 过采样、我认为它的波特率对于我们的应用来说太低了。

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

    MSP430 上的比特率生成器有很大不同。 调制模式是固定的、并通过每个起始位重新启动。 因此、如果两个器件使用相同的调制模式、就有效了。 (如果调制模式不同,来自 32KHz 时钟的 9600 波特将失败。 至少对我来说是这样的。 我花了一段时间才把它弄出来。)

    M0 的作用不同、小数除数应用建议使用相位累加器方法。 与数据不同步。 因此、发送器在这里和那里增加了一个 32KHz 的周期、而接收器选择不同的点。 灾难。

    如果所有器件都执行相同的操作、则使用仅整数除数会有所帮助并起作用。 但我怀疑、由于第二个周期的采样、接收器的裕度仍然很小。 误码率可能不大、但我认为它不会为零。

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

    您好、David。
    非常感谢您的回答。 现在坚持 IBRD = 1 和 FBRD = 0 似乎已经解决了大多数当前的问题。
    然而,还有一件事让我困惑。
    要成功接收、我总是必须传输两个停止位。 可以通过设置无奇偶校验和 2 个停止位 — 或通过设置固定一个和 1 个停止位。
    接收器必须设置为无奇偶校验和 1 个停止位、或保持 1 和 1 个停止位。 将接收器设置为无奇偶校验和 2 个停止位将导致周期性错误。
    接收器部分无奇偶校验位与 2 个停止位之间的差异到底是什么? 我会假设、如果是时序问题导致接收器在下一帧之前没有准备就绪、那么在一个停止位和一个停止位也应该使其失败?

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

    您好、

    当它配置为 2 个停止位时、 就需要进行错误检测  仅在停止位验证上执行 :第一个停止位必须为逻辑高电平。 如果采样为低电平、则为 A  帧错误  触发的。  第二个停止位在错误检查中被忽略、仅用作时序缓冲器。 第二个停止位为接收器提供额外的时间、以便在下一帧开始之前处理数据、从而增强对时钟偏差或处理延迟的适应能力。

    当它配置为一个奇偶校验位+ 1 个 停止位时、较短的帧(1 个停止位)需要接收器具有更高的时钟精度。 时钟漂移或噪声可能会导致错误地对停止位进行采样、从而增加帧错误风险。

    此致、

    现金好

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

    嗨、现金。
    非常感谢您的回答。
    您所看到的隔离式说明对我来说很有意义、当 UART 配置为无奇偶校验和 2 个停止位时、它会发送 2 个停止位、但在接收时只需要 1 个。
    但是、我仍然无法满足在第三方芯片和 MSPM0L2228 之间以及多个 MSPM0L2228 之间进行通信时的需求。

    首先 — 很抱歉后面的长文本。

    我的设置包含 4 个 LP-MSPM0L2228 板、以及另一个带有第三方芯片的 PCB。
    所有 MCU 都设置为使用 32kHz 晶体运行其 UART、并且波特率设置为 10922(这是由于我在该线程中进一步了解到的情况)。
    发送板正在传输 0 -> 1 -> 2、以此类推。
    接收板接收一个字节并根据之前接收到的字节对其进行检查 — 如果新字节不比之前接收到的字节高 1、则会切换一个错误引脚。
    无论接收到哪个字节、接收板始终回显该字节。
    发送 MCU 始终设置为 8 个停止位、无奇偶校验位和 2 个停止位。

    第一项测试(使用 8 个停止位接收、无奇偶校验和 2 个停止位接收)
    所有电路板均设置为 10922 波特、8 个停止位、无奇偶校验位和 2 个停止位。
    2 个电路板似乎能正确接收来自发送板的数据 — 因此没有切换错误引脚。
    其中 1 个电路板以大约 15.6 秒的间隔持续切换 ERROR 引脚。

    第二次测试(使用 8 个停止位接收、无奇偶校验和 2 个停止位接收)
    用第三方芯片更换发射板时、所有 3 个板会定期出现故障。

    第三和第四个测试(使用 8 个停止位接收、保持高电平和 1 个停止位)
    使用 10922 波特、8 个停止位、保持高电平状态和 1 个停止位重复上述序列、无论发送板是 LP-MSPM0L2228 还是第三方芯片、所有接收板都正确接收数据。
    我理解上一个注释的方式,然后板应该正确接收数据时配置为 10922,8 停止位,无奇偶校验和 2 停止位 — 如果我们不幸运的是,当配置了 10922 波特,8 停止位,坚持高和 1 停止位。 但在我们的情况下,它似乎是相反的方向。 8 个停止位、无奇偶校验和 2 个停止位的安全配置会导致通信出现错误。 您能否解释一下为什么会出现这种情况?

    在本消息的末尾 、我添加了每次测试的逻辑分析仪图片。
    MCU1 是发送 MCU:在测试 1 和 3 中、它是 MSPM0L2228、在测试 2 和 4 中、它是第三方芯片
    MCU2/5/6 都是 MSPM0L2228

    1) 我们如何解释我在测试过程中的经历?
    2) 如果 MSPM0L2228 在接收时仅查看一个停止位、无论它配置了一个或两个停止位、那么为什么我在测试期间看到差异?
    3) 你能解释为什么设置保持高位和 1 个停止位或无奇偶校验和 1 个停止位比没有奇偶校验和 2 个停止位更好?

    如果上述任何内容需要更多解释、请告诉我。

    此致  

    BUE

    测试 1

    测试 2.

    测试 3.

    测试 4.

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

    嗨、 Bue Bjerre 

    感谢您的耐心。

    错误检查将忽略第二个停止位、仅用作计时缓冲区。

    时序缓冲器用于软件处理时序缓冲器、为软件提供更多时间从低功耗模式唤醒、进入中断并处理 UART 接收到的数据、以防止 UART 接收硬件缓冲器溢出。

    Test 1
    Test 2

    这些都是周期性错误。

    除了  上述 David Schultz 提到的采样点机制的差异引起的误差外、

    大多数情况下、可能是由时钟相位偏移累积误差引起的。 您可以在 UART 错误时间和错误发生时、同步比较两个器件之间 CLK 引脚的时钟相位差、看看是否有其他发现。

    这是因为只能设置 3 倍过采样、而 UART 源为 32768、波特率为 9600、但这一想法仍需要进一步验证。

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

    嗨、Helic Chi。

    非常感谢您的回答。

    我认为我们可以得出结论、由于分数分频器的工作方式、MSPM0 无法通过 32kHz 晶体获得稳定的 9600 波特率。  

    然而,为什么设置坚持高和 1 停止位,而不是没有奇偶校验和 2 停止位在我的测试中工作更好的原因,我不明白 — 我会假设这应该是另一个方法。