2014-02-05 51 views
2

我正在編寫代碼以在pic32系列設備上配置串行端口。初始化似乎大部分工作,但我得到垃圾數據,而不是我寫的前6個字符。然而,我注意到,如果我在初始化函數結束時增加一個任意長的等待,這就消失了。在初始化結束時是否需要等待一些註冊標誌?我的初始化代碼如下。如果它有幫助,我將這個初始化關閉在pic32 reference manual的UART部分。我也爲我的傳輸功能添加了以下代碼。我的預期輸出字符串是「你好,從Bootloader代碼\ r \ n」,但我得到的實際字節爲:PIC32 UART在初始化後發送垃圾字符

00000000 00 00 aa b1 b1 bd 81 66 72 6f 6d 20 74 68 65 20 |.......from the | 
00000010 62 6f 6f 74 6c 6f 61 64 65 72 20 63 6f 64 65 2e |bootloader code.| 
00000020 0d 0a 


void initializeUART2() 
{ 
    uint32 counter; 
    initialized = TRUE; 
    U2MODE = 0; 
    U2STA = 0; 
    U2BRG = 0; 

    IEC1bits.U2TXIE = 0; 
    IEC1bits.U2RXIE = 0; 
    IEC1bits.U2EIE = 0; 

    //disable UART transmission before config 
    U2STA &= ~UART_TRANSMIT_ENABLED_STATUS_FLAG; 

    //disable UART before config 
    U2MODE &= ~UART_ENABLED_MODE_FLAG; 

    RS232_RS485_TRIS=0; //set to output 
    RS232_RS485=0; //select RS-232 mode on MAX3161 

    //set baudrate BAUDRATE = CLOCK_FREQUENCY/(16*(U2BRG + 1)) 
    //solve for U2BRG value 
    U2BRG = (UINT16)(((PERIPHERAL_CLOCK_FREQUENCY/UART2_BAUDRATE)/16)-1); 

    //set mode to 8 bit no parity 
    U2MODE &= ~UART_PARITY_DATA_MODE_BITS; 

    //set number of stop bits to 1 
    U2MODE &= ~UART_EXTRA_STOP_MODE_BIT_FLAG; 

    //enable the UART port 
    U2MODE |= UART_ENABLED_MODE_FLAG; 

    //enable serial transmission 
    U2STA |= UART_TRANSMIT_ENABLED_STATUS_FLAG; 

    //without this loop, I get garbage in first 6 bytes of my first message 
    counter = 1000; 
    while(counter--); 
} 

void putUART2(uint32 value) 
{ 
    if(!initialized) 
    { 
     initializeUART2(); 
    } 

    //make sure value is in range of writable values 
    value &= UINT32_MASK(8); 

    //clear transmit interrupt flag 
    IFS1bits.U2TXIF = 0; 

    //wait for the transmit buffer to be empty 
    while((U2STA & UART_TRANSMIT_STATUS_FLAG) == 0); 

    //set the data byte to be written in the write register 
    //also starts transmission 
    U2TXREG = value; 

    //wait for the transmit buffer to be empty 
    //both of these waits are necessary to avoid missing bytes 
    while((U2STA & UART_TRANSMIT_STATUS_FLAG) == 0); 
} 

回答

3

在將模式切換到RS232後,MAX3161需要至少100 ns才能穩定。

此外,這些行:

RS232_RS485_TRIS=0; //set to output 
RS232_RS485=0; //select RS-232 mode on MAX3161 

應調換;設置輸出,然後設置方向寄存器以避免毛刺。

+0

你知道什麼我翻轉了順序,並添加了1微秒的延遲,它完美的工作。謝謝 –

2

懷疑MAX3161芯片,它具有電荷泵,需要更多的時間來達到穩定運行電壓。

它可能只有一點點時間或2,但如果一個消息發送得太早,串行輸出就會混亂,直到一個安靜的時間發生。

較少的候選人:問題是這和未發佈的發送例程之間的交互。

注意:看到使用諸如未發佈的「垃圾數據」之類的信息可能會有所幫助,這真是太神奇了。也知道什麼是「好」前6個字節左右是有用的。


[編輯] @Doug Currie是在正確的軌道上。

RS232_RS485_TRIS1更改爲輸出時,數據發送之前需要延遲時間(如他建議的那樣)。這適用於此處以及代碼中的其他位置。

此外,在將RS232_RS485_TRIS1更改爲輸入之前,代碼需要確保所有數據完全發送。在PIC聲明xmit緩衝區爲空之後,這可能是10 /波特率。或者在轉車前檢查合適的xmit狀態位。 (移位寄存器爲空 - 名稱因編譯器而異。)

+0

S E感謝您提供數據。與@Doug Currie一起,我希望你有解決方案。給一些時間1)使系統穩定在通電狀態2)允許時間_打開輸出(可能有多個代碼位置)3)允許時間_before_關閉輸出。 (可能在代碼中有多個地方) – chux

+0

謝謝,你是非常有幫助的 –