2

pic24f からメッセージを送信するたびにフレーミング エラーが発生します。メッセージの長さや、送信するメッセージの数は関係ありません。私の場合、最後の文字 ('\0' または 0x00) が送信された後、フレーミング エラーが表示されますが、その理由はわかりません。これはボー レートの問題だと思いましたが、メッセージの長さに関係なく同じ場所またはその付近でオフ ビット サンプルが発生し、その時点でフレーミング エラーが発生するはずです。これはそうではありません。エラーは、最後の文字が送信された後に発生します。ここに画像の説明を入力

初期化コードは次のとおりです。

_TRISF5 = 0;    //TX pin to output
_TRISF3 = 1;    //RX pin to input

iPPSOutput(OUT_PIN_PPS_RP17,OUT_FN_PPS_U1TX);   //RP17 tied to TX
iPPSInput(IN_FN_PPS_U1RX,IN_PIN_PPS_RP16);      //RP26 tied to RX

U1MODE = 0;                 //disable, set defaults

//setup
U1MODEbits.STSEL=0;//one stop bit
U1MODEbits.PDSEL=0;//8 bit no parity
U1MODEbits.BRGH=1;//High speed mode (baud clock from Fcy/4)
U1MODEbits.RXINV=0;//UxRX idle state is '1' (don't invert)
U1MODEbits.ABAUD=0;//baud rate measurement disabled or completed
U1MODEbits.LPBACK=0;//loopback disabled
U1MODEbits.WAKE=0;//No wake up enabled
U1MODEbits.UEN1=0;//TX,RX enabled (others controlled by latch)
U1MODEbits.UEN0=0;//TX,RX enabled (others controlled by latch)
U1MODEbits.RTSMD=0;//RTS pin in flow control mode (don't think this applies for UEN = 0)
U1MODEbits.IREN=0;//irda encoder and decoder disabled
U1MODEbits.USIDL=1;//stop in idle mode

IFS0bits.U1RXIF = 0;        //clear rx flag
IFS0bits.U1TXIF = 0;        //clear tx flag
IEC0bits.U1RXIE = 1;        //enable rx interrupt
IEC0bits.U1TXIE = 1;        //enable tx interrrupt

U1BRG = 34;                 //115200, -0.62% Error

U1STAbits.URXISEL = 0;      //Interupt when RX buffer has one or more characters
U1STAbits.UTXISEL1 = 0;     //Interrupt when all transmit operations are complete
U1STAbits.UTXISEL0 = 0;     //Interrupt when all transmit operations are complete

U1STAbits.UTXEN = 1;

U1MODEbits.UARTEN = 1;      //enable

送信コードは次のとおりです。

void send_msg(const char* msg){
    char* p = (char*) msg;
    U1STAbits.UTXEN = 1;
    while(*p != '\0'){
        while(U1STAbits.UTXBF);  //wait for buffer room (1: buffer full, 0: buffer has room)
            U1TXREG = *p++;
        }
    while(!U1STAbits.TRMT); //wait for transmission to complete
    U1STAbits.UTXEN = 0; //disable the transmitter
}

salae ロジック キャプチャへのリンク:

4

1 に答える 1

3

ここを見ると、次のようになります。

UART 送信を有効にするには、UTXEN イネーブル ビット (UxSTA<10>) をセットします。実際の送信は、UxTXREG にデータがロードされ、レジスタ UxBRG の値に従ってボーレート ジェネレータがシフト クロックを生成するまで発生しません。送信は、最初に UxTXREG レジスタをロードし、UTXEN イネーブル ビットをセットすることによっても開始できます。

送信中に UTXEN ビットをクリアすると、送信が中止され、送信機がリセットされます。その結果、UxTX ピンはハイ インピーダンス状態に戻ります

[大胆な鉱山]

私は PIC に詳しくありませんが、送信機を有効または無効にするべきではないように思えます。TX ピンが High-Z になると、レベル コンバーターへの入力がフローティングになり、これがおそらくフレーミング エラーの原因となります。

初期化中に送信機を有効にし、有効のままにしておくことをお勧めします。UART に新しい送信文字を供給しない限り、UART はアイドル状態のままになります。

割り込みを使用する場合は、トランスミッタがアイドル状態のときに、トランスミッタを無効にする代わりに割り込みをマスクします。

于 2014-03-26T05:57:16.413 に答える