所以我在使用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ÿÿÿïÿÿÿõÿýýÿõûÿ
答案 0 :(得分:0)
假设Pi正在工作......
1.验证msp430 TX正在发挥作用:每1秒发送一个已知值,看看PI是否正好得到它。
2.验证MSP430 RX工作:每隔1秒从Pi发送已知值。
3.中断部分:
4.您的输出示例表明您有波特率不匹配问题。 如果你发送字符'T'并且shoud回来'T'。我希望看到'TTTTTT ......' 顺便说一句,这个垃圾可能暗示你忘了连接两个MCU之间的GND线......