使用Raspberry Pi进行MSP430 UART不需要的环回

时间:2016-08-19 20:48:06

标签: c serial-port raspberry-pi uart msp430

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

#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上运行minicom的输出为1200,一次发送'T':

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

1 个答案:

答案 0 :(得分:0)

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

1.验证msp430 TX正在发挥作用:每1秒发送一个已知值,看看PI是否正好得到它。

2.验证MSP430 RX工作:每隔1秒从Pi发送已知值。

3.中断部分:

  • 您的代码确定RX中断已关闭。
  • 您应该过滤仅为RX生成的中断。
  • 另外,您的代码不会处理溢出/帧错误。
  • 为TX和RX共享“in”变量(以及中断和主循环部分) - 不是一个好主意..

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