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.

[参考译文] MSP430F149:USART0有时发送双字节

Guru**** 2582405 points


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

https://e2e.ti.com/support/microcontrollers/msp-low-power-microcontrollers-group/msp430/f/msp-low-power-microcontroller-forum/585025/msp430f149-usart0-sometimes-sends-double-bytes

部件号:MSP430F149

我有一个使用3线SPI (在USART 0上)与CAN控制器通信的应用程序。  我最近发现了一个振荡器启动错误,该错误导致MCLK从XT2 (6 MHz)恢复 到DCO (2 MHz)。  在这种情况下,USART时钟由SMCLK (6 MHz)提供。  

如果没有错误,USART将正常运行。  当出现振荡器启动错误时,字节传输将加倍。  (即加载Tx缓冲区一次,传输两个相同的字节)。

我修复了原来的错误,问题消失了,但我可以通过手动将MCLK源更改为DCO来重新创建SPI问题。

对于每个Tx负载 ,USART发送两个字节的原因可能是什么?

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

    您是否可以与我分享您使用的代码?


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

    很遗憾,我无法在论坛上分享任何代码。

    我可以共享以下逻辑分析器跟踪。  此传输在我的应用程序启动时很早发生。  直到出现这种情况时执行的代码相当线性,我相当肯定,在每种情况下都是相同的。  唯一的区别是振荡器启动代码在第二种情况下将MCLK切换到DCO,而不是第一种情况下。  您可以根据CS和传输开始之间的时间量来查看效果。

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

    问题的根源很可能是对时钟故障,外围设备的状态机不满意。 我没有关于外设内部的信息,但它极不可能有任何时钟同步逻辑来避免"超出规格"或只是在更改时钟源时出现恶意时钟脉冲。

    当您更改外围设备的任何内容(包括时钟)时,最好禁用外围设备,进行更改并在更改后重新初始化。 这样,您很可能会避免双字节问题。

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

    感谢ilmars和Wei的回答,

    我不确定何时 能够重新深入了解这一问题的详细信息,因为修复振荡器启动问题解决 了实际问题。

    我的初步调查似乎表明,即使我在重置后中断执行,也可能发生故障,手动编辑MCLK的时钟源,然后继续执行SPI初始化和跟踪中显示的第一个传输。  理论上,振荡器是稳定的,时钟源在启用|使用SPI之前都是稳定的。

    一个问题。  如果故障安全机制将时钟源恢复为DCO,这是否为一次性事件。  如果振荡器变得稳定,它是否会切换回?

    再次感谢

    戈尔德

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

    当检测到晶体故障时,将设置OFIFG。 您应通过软件清除OFIFG位,以将时钟源切换回Crystal。 并确保OFIFG已清除。

    1)清除OFIFG标记
    2)至少等待50 µs
    3)测试OFIFG,并重复步骤1-4,直到OFIFG保持清除状态。