簡體   English   中英

Raspberry Pi的MSP430 UART有害回送

[英]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.中斷部分:

  • 您的代碼確定RX中斷已關閉。
  • 您應該過濾僅為RX生成的中斷。
  • 另外,您的代碼不處理溢出/幀錯誤。
  • 為TX和RX(以及在中斷和主循環部分)共享“輸入”變量-不是一個好主意。

4.您的輸出示例表明您遇到波特率不匹配的問題。 如果您發送字符“ T”並應返回“ T”。 我希望看到'TTTTTT ...'順便說一句,這個垃圾可能表明您忘記了在兩個MCU之間連接GND線...

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM