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.

[参考译文] MSP430FR6922:MSP430FR6922:UART 中断中缺少字节

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

https://e2e.ti.com/support/microcontrollers/msp-low-power-microcontrollers-group/msp430/f/msp-low-power-microcontroller-forum/1136886/msp430fr6922-msp430fr6922-byte-missing-in-uart-interrupt

器件型号:MSP430FR6922

大家好、
我对 MSP430控制器有疑问。 我正在使用 msp430fr6922控制器。 我正在尝试使用串行 USB 转 TTL 电缆在 MSP430控制器和 Raspi 之间进行通信。 我为您的参考附上了代码。 UART 在32.768kHz 的 ACLK 上工作、波特率设置为9600。 在接收模式下、有时会丢失数据字节。 原因是什么?


#include "common.h"

int RPI_UART (空)

//将 USCI_A0配置为 UART 模式
UCA0CTLW0 = UCSWRST;//将 eUSCI 置于复位状态
UCA0CTLW0 |= UCSSEL_ACLK;// CLK = SMCLK
//波特率计算
// 800000000 /(16*9600)= 52.083
//分数部分= 0.083
//用户指南表21-4:UCBRSx = 0x04
// UCBRFx = int ((52.083-52)*16)= 1.
UCA0BR0 = 3;// 9600波特
UCA0MCTLW |= 0x5300;// 32768/9600 - INT (32768/9600)=0.41
// UCBRSx 值= 0x53 (请参阅 UG)
UCA0BR1=0;
UCA0CTLW0 &=~UCSWRST;//初始化 eUSCI
UCA0IE |= UCRXIE;//启用 USCI_A0 RX 中断

#if defined (__TI_Compiler_version__)|| Defined (__IAR_systems_ICC__)
#pragma vector=USCI_A0_Vector
_interrupt void USCI_A0_ISR (void)
#Elif defined (_GNU_)
void __attribute__((中断(USCI_A0_Vector)) USCI_A0_ISR (void)
其他
错误编译器不受支持!
#endif

switch (__evo_in_range (UCA0IV、USCI_UART_UCTXCPTIFG))

USCI_NONE 案例:中断;
USCI_UART_UCRXIFG 案例:

while (!(UCA0IFG&UCTXIFG));
RXDATA[p++]=UCA0RXBUF;

如果(RXDATA[0]=0x01)

如果(p==3)

P=0;
giNewFrameFlag=1;


其他

P=0;

中断;

案例 USCI_UART_UCTXIFG:中断;
案例 USCI_UART_UCSTTIFG:中断;
案例 USCI_UART_UCTXCPTIFG:中断;

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

    您好、Sayali、

    您说您有时会错过 数据字节、因此基本 函数 是正确的。

    我已经检查了您的 UART 配置、 下面的参数更合适:

    UCA0MCTLW |= 0x5300 ->  UCA0MCTLW |= 0x9200

    可在 用户指南的表30-5中查看。

    设置 BBURSx = 0x53将导致较大的 RX 错误、并使您丢失数据。  

    此致

    SAL

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

    为什么在接收中断中检查 TXIFG?

    我看到的东西类似于 ISR 中接收数据的缓冲。 那么、您的故障到底是如何发生的? 数据包无法启动? 数据包中缺少字符? 希望在错误格式的数据包到达时有一个错误恢复机制。

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

    您好 Sal、

      根据您的建议、我将  UCA0MCTLW 值更改为0x9200、但有时我仍然丢失了前3个字节。

    每次 Raspi 向 MSP430控制 器发送4个字节、即"0x01、0x0F、0x04、0xFF"。 但是、有时控制器仅接收最后一个字节、即阵列第一个位置的0xFF。 缺少前3个字节 。  

    请建议此问题与 MSP430FR6922控制器相关还是代码中的错误?

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

    您好、Sayali、

    如果问题仍然存在、我认为您应该重新检查您的代码。  

    正如 David 所说的、您将"!(UCA0IFG&UCTXIFG)"设置为" while "函 数的条件、这意味着当 UCTXIFG =0时、循环中断。 它在需要传输数据时使用、应检查 TX 缓冲区是否为空。 这将导致这样一种情况:当你从 UCA0RXBUF 中获得一个新数据、但由于'UCTXIFG=1'、所以你在 'UCTXIFG=0时才更新数据、然后你丢失数据。

    至于您的更新代码'RXDATA'、当您错过第一个字节时、以下三个字节将被放置在 RXDATA[0]中、因此只有一个字节存在、即最后一个字节-'0xFF'。

    如果不需要、请 删除'while (!(UCA0IFG&UCTXIFG)'并重试。 或者、您也可以考虑上述因素、并优化代码功能。

    此致

    SAL