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.

[参考译文] MSP430FR60471:UART 在特定持续时间后停止接收数据

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

https://e2e.ti.com/support/microcontrollers/msp-low-power-microcontrollers-group/msp430/f/msp-low-power-microcontroller-forum/1364313/msp430fr60471-uart-stops-receiving-data-after-certain-duration

器件型号:MSP430FR60471
主题中讨论的其他器件:MSP430FR6047

您好!

我使用的是 MSP430FR6047的 eUCSIA3 UART。 我的器件以100ms 的周期运行。 我将通过串行通信(python 脚本)发送一些帧(每个约80字节)。 我可以发送和接收  大约600 帧的数据、之后 UART 停止响应、不会触发 UART 中断。  即使我重新启动 pyserial、也应发出 Continuous 命令。 但 当我重新启动调试器时、器件开始接收数据。  

UART 配置

void ESP_UART_init ()
{
//针对 UART 模式配置 USCI_A3
UCA3CTLW0 = UCSWRST;//将 eUSCI 置于复位状态
UCA3CTLW0 |= UCSSEL_ACLK;// CLK = ACLK
UCA3BRW = 3;// 9600波特
UCA3MCTLW |= 0x5300;// 32768/9600 - INT (32768/9600)=0.41
// UCBRSx 值= 0x53 (请参见 UG)
UCA3CTLW0 &=μ~UCSWRST;//初始化 eUSCI
UCA3IE |= UCRXIE;//启用 USCI_A0 RX 中断
//配置 RX 中断以接收 UART 消息

当器件停止响应时注册 eUSCI  

我做了一些研究,但 找不到什么会出错。 我是这方面的新手、因此任何潜在客户都将受到真正的赞赏。  

此致、

南德基绍尔

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

    串行通信是唯一停止的事情吗?

    您可能正在溢出缓冲器、从而使 MCU 感到困惑。 MCU 是否能够在下一帧到达之前处理该"帧"?

    我建议你在590帧左右打破,看看所有的缓冲区都被完全清除了,你已经为下一帧做好了准备。

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

    可以。

    您可能因缓冲区过载而使 MCU 困惑。 MCU 是否能够在下一帧到达之前处理该"帧"?

    我正在等待 MCU 的确认、然后再发送下一帧。 这种等待也足以让 MCU 处理该帧。  

    我建议在590帧左右中断,并希望看到所有缓冲区都已完全清除,并且您已经为下一帧做好了准备。

    我要确保缓冲器被 清除、

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

    那么我认为您需要共享您的代码。 我建议您将其归结为一个简单的非工作示例-这通常有助于您找到问题。

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

    这是代码的一部分。  

    从脚本端:(主机计算机)

    我正在运行一个接收线程 receive_data(),  

    DEF RECEIVE_DATA:
      提供响应到达所需的延迟、
      从串行端口读取数据、
      autyticate_data()
       
    DEF Authenticate_data:
      验证数据、
      send_data()

    DEF SEND_DATA():
      通过串行端口发送数据

    器件端:

    //UART 初始化
    void ESP_UART_init ()

    {
      //针对 UART 模式配置 USCI_A3
      UCA3CTLW0 = UCSWRST;           //将 eUSCI 置于复位状态
      UCA3CTLW0 |= UCSSEL__ACLK;        // CLK = ACLK
      UCA3BRW = 3              // 9600波特
      UCA3MCTLW |= 0x5300          // 32768/9600 - INT (32768/9600)=0.41
                          // UCBRSx 值= 0x53 (请参见 UG)
      UCA3CTLW0 &=~μ H UCSWRST;          //初始化 eUSCI
      UCA3IE |= UCRXIE           //启用 USCI_A0 RX 中断
      //配置 RX 中断以接收 UART 消息
    //UART 中断  
    #pragma vector=EUSCI_A3_Vector
    __interrupt void USCI_A3_ISR (void)
    {
      switch (__even_in_range (UCA3IV、USCI_UART_UCTXCPTIFG))
      {

        USCI_NONE:中止
        案例 USCI_UART_UCRXIFG:
          while ((UCA3IFG&UCTXIFG);
          G_RxByte = UCA3RXBUF;
          填充缓冲器 (G_RxByte);

           ___ no_operation();
          中断;
        USCI_UART_UCTXIFG 情况:中断
        案例 USCI_UART_UCSTTIFG:中断
        案例 USCI_UART_UCTXCPTIFG:中断
        默认值中断
      }
    #endif

    FillBuffer()描述:
    它是一个执行 CRC 检查传入数据并相应填充我的 ESP 缓冲区的 FSM。  
    我在一些帖子中看到有人说、在中断中进行额外/不必要的处理是不好的做法。 但是、为什么会  发生这样的情况:我可以获得大多数初始帧的响应、然后停止工作(重申不会触发 UART 中断)。 是否存在 UART 无响应的任何其他原因?
    我仍然会尝试移动此填充缓冲区、看看它是否可以解决问题。   
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    1) 1)我可以认为在响应接收中断时没有很好的理由等待 TXIFG 被设置。

    2)有很多原因,你的程序会变得无响应。 这与您的代码的其余部分有关。

    当程序停止响应数据时、它在做什么?

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

    我想我应该更清楚一些。 我们需要一个可编译且正在运行的示例、该示例展示了我们可以在 MCU 上运行的问题。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    1)我觉得在响应接收中断时没有很好的理由要等待 TXIFG 被设置。

    谢谢您的关注。 是的、这不是必需的。 我将其删除、但仍然遇到相同的问题。

    当程序停止响应数据时,它在做什么?

    我 遇到  的问题与本主题中提到的大多数人都是相同的。  https://e2e.ti.com/support/processors-group/processors/f/processors-forum/274366/uart-not-receiving-interrupts。 但 没有人找到这种情况的根本原因。  

    我已经为我的 Rx 中断附加了参考代码。  
    对于 Tx:

    void SendData (unsigned char buff[]unsigned int tx_len)
    {
      int count = 0

      for (count=0;count<tx_len;count++)
      {
        while ((UCA3IFG&UCTXIFG));// USCI_A0 TX 缓冲器是否准备就绪?
        UCA3TXBUF = 缓冲区[计数];//发送缓冲区数据
      }

    这是我在本例中观察到的情况:

    UART 中断在前2到3分钟内正常运行、然后停止触发。 UART 中断停止响应后、我暂停调试器、看到 RXIE 和 GIE 置1、但 RXIFG 未置1。 我已附上了 UART 开始在我的第一条消息中重复写入时的寄存器屏幕截图。  代码的另一部分其他中断、定时器继续按预期工作。   

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

    要扩展 Keith 所说的内容、请发布一个展示此问题的完整程序。 这会执行两项操作:

    1)它使他人有机会看到完整的画面,使它更容易帮助你。 比长时间猜测更好。

    2)削减时,你可能会注意到一些事情,并意识到问题是什么。 或者删除某些内容可能会使问题消失。

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

    在您未连接到调试器时是否会发生这种情况?

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

    可以。 即使我没有连接调试器、也会发生这种情况。  

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    要扩展 Keith 所说的内容,请发布一个显示此问题的完整程序

    我会尽量减少程序、看看我是否能够重现同样的问题。