[英]MSP430 UART unwanted loopback with Raspberry Pi
因此,讓TI微控制器與Raspberry Pi B +通信時遇到了問題。 我使用的確切的微控制器是TI cc430f5137。 我遇到的問題是,我似乎無法讓Raspberry Pi正確接收我從MSP430發送的數據。 對於那些不知道的人,430為此有2個緩沖區,即RX和TX,允許在代碼仍在執行時使用UART模塊。 當我收到一個字節時,我已經啟用了一個中斷,我只是設置一個標志並立即發送相同的字節。 在我嘗試傳輸之前,它一直有效。 該代碼坐下來並在無限循環中等待,直到它接收到它的第一個字節。 那時,它只是保存字節,如果它是“ T”(用於測試),則使LED閃爍。 返回循環后,它將檢測到已保存的字節已更改,並將其放入緩沖區以將其發送回。 在此之前,一切都可以正常運行。 每次它接收到正確的字節,讓我知道我的時鍾是完美的,我的中斷正在工作,並且我的UART初始化是正確的。 發生錯誤的地方是在發送字節之后,似乎存在某種內部環回(這是一個選項,但我確定不是這種情況),這會導致中斷重新觸發,從而導致無限循環傳輸並再次接收相同的字節,但是通過Pi調用該字節時,我不會返回具有相同字符的循環,而是返回了一個隨機垃圾字節,其后面沒有一致性或邏輯。 我分析了一下位,看計時是否剛剛結束,似乎並非如此。 作為參考,我的波特僅為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上以1200運行minicom的輸出,一次發送“ T”:
UÔÿÿïÕuU_þýÿÿÿÿÿÿÕԯÿÿôÕüÿÝUõï\þþÿÿÕ¿ÿÿýýTÿýUÿÿÿïÿÿÿõÿýýÿõûÿ
假設Pi正在正常工作...
1.驗證msp430 TX是否令人擔憂:每隔1秒發送一次已知值,然后查看PI是否正確獲取它。
2.驗證MSP430 RX是否正常工作:每1秒從Pi發送一個已知值。
3.中斷部分:
4.您的輸出示例表明您遇到波特率不匹配的問題。 如果您發送字符“ T”並應返回“ T”。 我希望看到'TTTTTT ...'順便說一句,這個垃圾可能表明您忘記了在兩個MCU之間連接GND線...
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.