2017-12-27 38 views
0

RX FIFO에서 1 바이트 당 8 바이트를 읽으려고합니다. 문제는 첫 번째 바이트가 수신되면 U1RXREG의 첫 번째 바이트를 마침내 얻으려면 8 개의 다른 바이트를 기다려야한다는 것입니다. 특정 바이트에 액세스하여 "플러시"하기 위해 FIFO에서 더미 읽기를 수행하는 방법을 알고 싶습니다. 단순히 U1RXREG를 배열에 넣는 것은 그 트릭을 수행하지 않습니다. 성공하지, 내가 같이 읽기 시도 순간PIC32MX270F256B UART : RX FIFO에서 단일 바이트를 얻는 방법?

void UART_Initialize(void) 
{ 
    // SIDL: Stop in Idle Mode bit : 1 = Discontinue module operation when the device enters Idle mode 
    U1MODEbits.SIDL = 0; 
    // IREN: IrDA Encoder and Decoder Enable bit : 0 = IrDA is disabled 
    U1MODEbits.IREN = 0; 
    // RTSMD: Mode Selection for UxRTS Pin bit : 0 = UxRTS pin is in Flow Control mode 
    U1MODEbits.RTSMD = 0; 
    // UEN<1:0>: UARTx Enable bits : 10 = UxTX, UxRX, UxCTS and UxRTS pins are enabled and used 
    U1MODEbits.UEN1 = 1; 
    U1MODEbits.UEN0 = 0; 
    // WAKE: Enable Wake-up on Start bit Detect During Sleep Mode bit : 0 = Wake-up disabled 
    U1MODEbits.WAKE = 0; 
    // LPBACK: UARTx Loopback Mode Select bit : 0 = Loopback mode is disabled 
    U1MODEbits.LPBACK = 0; 
    // ABAUD: Auto-Baud Enable bit : 0 = Baud rate measurement disabled or completed 
    U1MODEbits.ABAUD = 0; 
    // RXINV: Receive Polarity Inversion bit : 0 = UxRX Idle state is ‘1’ 
    U1MODEbits.RXINV = 0; 
    // BRGH: High Baud Rate Enable bit : 0 = Standard Speed mode – 16x baud clock enabled 
    U1MODEbits.BRGH = 0; 
    // PDSEL<1:0>: Parity and Data Selection bits : 01 = 8-bit data, even parity 
    U1MODEbits.PDSEL1 = 0; 
    U1MODEbits.PDSEL0 = 1; 
    // STSEL: Stop Selection bit : 0 = 1 Stop bit 
    U1MODEbits.STSEL = 0; 

    // ADM_EN: Automatic Address Detect Mode Enable bit : 0 = Automatic Address Detect mode is disabled 
    U1STAbits.ADM_EN = 0; 
    // UTXISEL<1:0>: TX Interrupt Mode Selection bits : 00 = Interrupt is generated and asserted while the transmit buffer contains at least one empty space 
    U1STAbits.UTXISEL1 = 0; 
    U1STAbits.UTXISEL0 = 0; 
    // UTXINV: Transmit Polarity Inversion bit : 0 = UxTX Idle state is ‘1’ (with IrDA disbled) 
    U1STAbits.UTXINV = 0; 
    // URXEN: Receiver Enable bit : 1 = UARTx receiver is enabled. UxRX pin is controlled by UARTx (if ON = 1) 
    U1STAbits.URXEN = 1; 
    // UTXBRK: Transmit Break bit : 0 = Break transmission is disabled or completed 
    U1STAbits.UTXBRK = 0; 
    // URXISEL<1:0>: Receive Interrupt Mode Selection bit : 00 = Interrupt flag bit is asserted while receive buffer is not empty (i.e., has at least 1 data character) 
    U1STAbits.URXISEL1 = 0; 
    U1STAbits.URXISEL0 = 0; 
    // ADDEN: Address Character Detect bit (bit 8 of received data = 1) : 0 = Address Detect mode is disabled 
    U1STAbits.ADDEN = 0; 

    // Baud Rate Calculation : 
    // FPB = 10MHz ; Desired Baud Rate = 9600 bauds 
    // => U1BRG = FPB/(16*BaudRate)-1 = 64 (error = 0,16%) 
    U1BRG = 64; 

    // Enable UART RX interrupts 
    //IEC1bits.U1RXIE = 1; 

    // Enable UART 
    // ON: UARTx Enable bit : 1 = UARTx is enabled. UARTx pins are controlled by UARTx as defined by the UEN<1:0> and UTXEN control bits. 
    U1MODEbits.ON = 1; 
    // UTXEN: Transmit Enable bit : 1 = UARTx transmitter is enabled. UxTX pin is controlled by UARTx (if ON = 1). 
    U1STAbits.UTXEN = 1; 

} 

의 동안 (1) 루프 : 여기

내 초기화의 [] rxbytes에서

while (1) 
    { 
     uint8_t rxbyte[8]; 
     bool b; 
     //if (U1STAbits.URXDA == 1) 
     while(!U1STAbits.URXDA); 
     rxbyte[0] = U1RXREG; 
     rxbyte[1] = U1RXREG; 
     rxbyte[2] = U1RXREG; 
     rxbyte[3] = U1RXREG; 
     rxbyte[4] = U1RXREG; 
     rxbyte[5] = U1RXREG; 
     rxbyte[6] = U1RXREG; 
     rxbyte[7] = U1RXREG; 
     sprintf(s, "I received : %u %u %u %u %u %u %u %u\n\r", rxbyte[0], rxbyte[1], rxbyte[2], rxbyte[3], rxbyte[4], rxbyte[5], rxbyte[6], rxbyte[7]); 
     myPrint(s); 
     IFS1bits.U1RXIF = 0; 
    } 

8 바이트 항상 같은. 나는 읽기 사이에 RX 인터럽트 플래그를 지우려고했는데, 읽기 사이에 URXDA를 읽었고, 지연을 추가하고, 여전히 성공하지 못했고, 처음 들어온 8 바이트를 기다려야했습니다.

고맙습니다. 도움을 받으려면 미리!

감사합니다. 나는 이중 구성, MCC 하나 자신에 의해 하나 있었는데, 활성화 된 중단을 가진 것은이 발생하는 것 같습니다 :

에릭

답변

0

나는 마침내 해결책을 발견. 이제는 인터럽트를 해제하고 간단히 URXDA를 폴링합니다. 모든 것이 잘 작동합니다. 불편을 드려 죄송합니다.