2

pic32 ファミリ デバイスのシリアル ポートを構成するコードを書いています。ほとんどの場合、初期化は機能しているように見えますが、書き込んだ最初の 6 文字の代わりにガベージ データが取得されます。ただし、初期化関数の最後に任意の長い待機を追加すると、これがなくなることに気付きました。初期化の最後に待機する必要があるレジスタ フラグはありますか? 私の初期化コードは以下です。それが役立つ場合は、この初期化をpic32 リファレンス マニュアルの UART セクションに基づいています。送信機能にも以下のコードを追加しました。期待される出力文字列は「Hello from the bootloader code.\r\n」ですが、実際に取得するバイト数は次のとおりです。

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);
}
4

2 に答える 2

4

MAX3161は、モードを RS232 に切り替えた後、安定するまでに少なくとも 100 ns 必要です。

また、これらの行:

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

逆にする必要があります。出力を設定してから方向レジスタを設定して、グリッチを回避します。

于 2014-02-05T16:17:06.003 に答える
2

チャージポンプを備えたMAX3161チップが、安定した動作電圧に達するまでにさらに時間が必要であると考えてください。

わずかな時間か 2 時間だけかもしれませんが、メッセージの送信が早すぎると、静かな時間が発生するまでシリアル出力が乱れます。

劣る候補: 問題は、これと unposted send ルーチンの間の相互作用です。

注: 未投稿の「ガベージ データ」のような情報を使用して表示すると、どのように役立つかは驚くべきことです。また、「適切な」最初の 6 バイト程度を知ることも役立ちます。


[編集] @Doug Currie は正しい軌道に乗っています。

を出力に変更するRS232_RS485_TRIS1と、データが送信されるまでに彼が提案する遅延時間が必要になります。これは、ここだけでなく、コードの他の場所にも当てはまります。

さらに、RS232_RS485_TRIS1入力に変更する前に、コードはすべてのデータが完全に送信されることを保証する必要があります。これは、PIC が xmit バッファが空であると宣言した後の 10/baud である可能性があります。または、バスの向きを変える前に、適切な xmit ステータス ビットをチェックします。(シフト レジスタが空です。名前はコンパイラによって異なります。)

于 2014-02-05T16:14:01.467 に答える