首页 文章

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

提问于
浏览
0

所以我在使用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

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

    1.验证msp430 TX正在发挥作用:每1秒发送一个已知值并查看PI是否正在获取它 .

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

    3.中断部分:

    • 你的代码确认RX中断是关闭的 .

    • 你应该过滤仅为RX生成的中断 .

    • ,你的代码也不处理溢出/帧错误 .

    • 共享"in"变量用于TX和RX(以及中断和主循环部分) - 不是好主意..

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

相关问题