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.

[参考译文] MSP430F5358:UART0溢出 Rx

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

https://e2e.ti.com/support/microcontrollers/msp-low-power-microcontrollers-group/msp430/f/msp-low-power-microcontroller-forum/1407893/msp430f5358-uart0-overrun-rx

器件型号:MSP430F5358
主题中讨论的其他器件: MSP430F5510

工具与软件:

大家好、

我正在尝试通过 UART 在我的 MSP430F5358芯片和另一个微控制器(Atmel AtxMega32e5)之间实现串行通信。 我在 Uart0上设置了接收中断、以便接收来自其他微控制器的消息。 消息的测量单位是字节、即当一个字节到达 Uart_Rx 引脚时触发中断。 其串行工作的波特率为115.2KHz (与 Atmel 串行设置的波特率相同)->每个位的持续时间约为8.6us。
我遇到的问题是、当我收到"long"消息时、串行似乎溢出、无法跟上到达的字节(这些字节逐渐保存在循环缓冲区中)。 消息的最后一部分始终是脏的、这意味着整个实现的消息解析协议不能正常工作、从而在接收到的消息的帧上返回错误。

示例(短消息):
实际收到的消息(用示波器查看):
0x55、0x02、0x7F (消息标签)、0x03
在 UART0的 dubug 中读取的消息:
0x55、0x02、0x7F (消息标签)、0x03     (确定!!)

示例(长消息):
实际收到的消息(用示波器查看):
0x55、0x02、0xB0 (消息标签)、0x00、0x00、 0x00、0x00、0x03
在 UART0的 dubug 中读取的消息:
0x55、0x02、0xB0 (消息标签)、0x00、0x00   (缺少3个字节!!)

目前、我已验证了以下内容:
-两个串行端口的波特率是精确的且相同的(等于115.2KHz);
-接收中的中断函数响应并正常工作,从而得到每个传入字节的正确时序(通过在每次执行中断时插入一个 GPIO 引脚切换来验证);
-不存在可能导致接收时序出现问题的虚假中断;

这是 UART 设置的函数

空洞 InitUartMan (无效)

  UCA0CTL1 |= UCSWRST;//禁用 USCI 模块、启用设置更改

  UCA0CTL0并且=~μ s UC7BIT;          // 8位数据
  UCA0CTL1 |= UCSSEL__ACLK;   // UCLK = ACLK
  UCA0BRW_L = BAUDIB115;         // 115200bps 波特率@ ACLK = 4096000Hz。
  UCA0BRW_H = BAUDI0;
  UCA0MCTL = 0x00;        

  UCA0CTL1 &=~(UCSWRST);      //启用 USCI 模块、禁用设置更改

  UCA0IE |= UCRXIE;             //接收中断使能、发送中断禁用

  AckCmdMan = 0;                //初始化命令状态
}

 以下为为 UART0接收而编写的中断函数

#pragma VECTOR=USCI_A0_VECTOR
_interrupt void UartRx0 (无效)

  char rxchar;

  rxchar = UCA0RXBUF;        //保存接收到的字节。

  *InpkcqMan.wr++= rxchar;      //输入数据的循环缓冲。
  if (InpkcqMan.wr>InpkcqMan.top)
  InpkcqMan.wr = InpkcqMan.bot;

}

如果任何人有任何建议,给我解决这个问题,我会感激!

非常感谢!!

Matteo

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

    什么是 MSP430F5358的 MCLK 运行? 也许问题是其他地方。 不知道中断函数的 C 编译器优化、以及最后它有多少(以 CPU 周期为单位) 也许我读错了、但为什么行中有两个而不是一个"+"。

     *InpkcqMan.wr++= rxchar;  

    因为我想收到的是一个字节、而不是两个字节。

    我能够在高度优化的汇编器代码上推送 MSP430F5510 @ 24 MHz 以在 UART 的@ 4Mbps (从两个 MSP430x2xx 同时发送、而不会出现任何延迟)上进行接收、然后通过 CDC 将其发送到 PC 而不会丢失任何字符。

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

    您好、zrno、

    我的 MSP430F5358具有8MHz 的外部时钟源。 UART 生成波特率时钟源为4MHz。 至于可设置的最大速度、我被强制将速度保持在115.2KHz。 我绝对必须能够使一切都以这个速度运转。
    话虽如此、您有什么进一步的建议吗?
    谢谢。

    Matteo

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

    您应该尝试提高 MCLK 的速度。

    我对实际的比特率有点困惑。 在不同位置、比特率时钟的输入是4MHz 或4.096MHz。 一个获得精确的比特率、而另一个没有。 也许可以把有关时钟系统和这个外部时钟源设置的细节弄清楚。