MSP430 UART 不需要的环回 Raspberry Pi

MSP430 UART unwanted loopback with Raspberry Pi

所以我在让 TI 微控制器与 Raspberry Pi B+ 进行通信时遇到了问题。我使用的确切微控制器是 TI cc430f5137。我遇到的问题是我似乎无法让 Raspberry Pi 正确接收我从 MSP430 发送的数据。对于那些不知道的人,430 有 2 个缓冲区用于此目的,一个 RX 和 TX,这允许在代码仍在执行时使用 UART 模块。当我收到一个字节时,我已经启用了一个中断,我只是设置一个标志并立即发送回相同的字节。它一直有效,直到我尝试传输。 代码在无限循环中等待,直到它收到它的第一个字节。那时它只是保存字节并闪烁 LED,如果它是 'T'(用于测试)。返回循环后,它检测到保存的字节已更改,并将其放入缓冲区以将其发回。到此为止,一切正常。它每次都接收到正确的字节,让我知道我的时钟是完美的,我的中断正在工作,我的 UART 初始化是正确的。出错的地方是在发送字节后,似乎有某种内部环回(这是一个选项,但我确定不是这种情况)导致中断重新触发,导致无限循环传输并再次接收相同的字节,但是在通过 Pi 调用它时,我没有返回相同字符的循环,而是一个随机垃圾字节,其背后没有一致性或逻辑。我分析了这些位以查看时间是否刚刚好,但似乎并非如此。作为参考,我的波特率只有可怜的 1200,两个设备的电压肯定是 3.3v,而且我确定 Pi 正在工作,因为当我短接 RX 和 TX 时,我可以毫无问题地取回字节。我切换到 UART 是因为 SPI 给了我类似的问题,而且我想不出除了 I2C 之外的任何其他协议对这里有帮助。我正在使用外部 32768hz crystal。另外,我已经在两个不同的微控制器上试过了,所以它绝对是问题所在的代码。

#include <msp430.h> 

char temp;
char in;


int main(void) {
    WDTCTL = WDTPW | WDTHOLD;   // Stop watchdog timer

    P1OUT = 0x00; // Make sure pins are tturned off
    P1DIR = 0x01; // Led out
    P1SEL |= BIT5 + BIT6; // UART as pin mode

    UCSCTL6 &= ~BIT0; // Turn on XT1

    P5SEL |= BIT0 + BIT1; // Select XT1 as pin function

    UCA0CTL1 |= BIT0; // Set UART to reset mode
    UCA0CTL1 |= BIT6; // Choose ACLK as source

    UCA0BR0 = 27; // Set speed to 1200 Baud
    UCA0MCTL = 0x02 << 1; // Set speed to 1200 Baud

    UCA0CTL1 &= ~BIT0; // Turn UART on

    UCA0IE = BIT0; // Enable RX interrupt
    __enable_interrupt();

    while(1)
    {
        if(in != 0)
        {
            UCA0TXBUF = in;
            temp = in;
            in = 0;
        }
    }
}

#pragma vector=USCI_A0_VECTOR
__interrupt void UCSIA0(void)
{
    in = UCA0RXBUF;
    if(in == 0x54)
        P1OUT ^= BIT0;
} 

Pi 上 1200 处 运行 minicom 的输出,一次发送 'T' 个:

UÔÿÿïÕuU_þýÿÿÿÿÿÿÕԯÿÿôÕüÿÝUõï\þþÿÿÕ¿ÿÿýýTÿýUÿÿÿïÿÿÿõÿýýÿõûÿ

假设 Pi 目前正在工作...

1.verify msp430 TX 正在工作:每 1 秒发送一次已知值并查看 PI 是否正确获取它。

2.verify MSP430 RX 工作:每 1 秒从 Pi 发送一次已知值。

3.interrupt 部分:

  • 您的代码确认 RX 中断已关闭。
  • 您应该过滤仅为 RX 生成的中断。
  • 此外,您的代码不处理 overrun/frame 错误。
  • 为 TX 和 RX(以及在中断和主循环部分)共享 "in" 变量——不是个好主意..

4.your 输出示例表明您有波特率不匹配问题。 如果您发送字符 'T' 并且应该返回 'T'。我希望看到 'TTTTTT...' 顺便说一句,这个垃圾可能表明您忘记了在两个 MCU 之间连接 GND 线...