Interrupción UART no funcionará

0

Tengo un problema al intentar probar enviar y recibir líneas en la comunicación RS485, ¿alguien sabe qué puede causar un problema aquí? Funciona sin interrupción pero con interrupción no funcionará. Estoy trabajando en NXP LPC1788, y tratando de hacer un programa de eco de interrupción para RS485 (lo que envío, me envía de vuelta al terminal). Gracias de antemano.

int main(void) {

    uart2()

    NVIC_EnableIRQ(UART2_IRQn); 

    while(1) {

    } //while   

} //main

void receive(void) {

    SMR_485RECEIVE; //Receive data flow
    delay_1_ms();
    delay_1_ms();   
    receive_byte = LPC_UART2->RBR;
    }

void send(void) {

    SMR_485TRANSMIT; //Transmit data flow
    delay_1_ms();
    delay_1_ms();
    LPC_UART2->THR = receive_byte;
    }

void UART2_IRQHandler(void) __irq {

    BYTE tip = LPC_UART2->IIR & 0x06;       
    if((tip == 0x04) && !(LPC_UART2->RBR == '
void receive(void) {


    SMR_485RECEIVE;
    delay_1_micro();
    receive_byte = LPC_UART2->RBR;
    }

void send(void) {


    SMR_485TRANSMIT;//Transmit data flow
    delay_1_micro();
    LPC_UART2->THR = receive_byte;
    }

void UART2_IRQHandler(void) __irq {

    BYTE tip = LPC_UART2->IIR & 0x06;       
    if(tip == 0x04){
        receive();
        delay_1_micro();
        send();
        }       
    }
')){ receive(); delay_1_ms(); send(); } }

Si tengo razón antes de enviar necesito llamar a SMR_485TRANSMIT y luego almacenar BYTE en el registro de datos de salida THR, cuando deseo recibir el byte, llamo a SMR_485RECEIVE y luego almacenar datos del registro de datos de entrada RBR a la variable receive_byte Eliminé los retrasos de 1 ms y mi código se ve así ahora mismo:

int main(void) {

    uart2()

    NVIC_EnableIRQ(UART2_IRQn); 

    while(1) {

    } //while   

} //main

void receive(void) {

    SMR_485RECEIVE; //Receive data flow
    delay_1_ms();
    delay_1_ms();   
    receive_byte = LPC_UART2->RBR;
    }

void send(void) {

    SMR_485TRANSMIT; //Transmit data flow
    delay_1_ms();
    delay_1_ms();
    LPC_UART2->THR = receive_byte;
    }

void UART2_IRQHandler(void) __irq {

    BYTE tip = LPC_UART2->IIR & 0x06;       
    if((tip == 0x04) && !(LPC_UART2->RBR == '
void receive(void) {


    SMR_485RECEIVE;
    delay_1_micro();
    receive_byte = LPC_UART2->RBR;
    }

void send(void) {


    SMR_485TRANSMIT;//Transmit data flow
    delay_1_micro();
    LPC_UART2->THR = receive_byte;
    }

void UART2_IRQHandler(void) __irq {

    BYTE tip = LPC_UART2->IIR & 0x06;       
    if(tip == 0x04){
        receive();
        delay_1_micro();
        send();
        }       
    }
')){ receive(); delay_1_ms(); send(); } }

Pero no funciona, no entiendo cuál es el problema en mi código al cambiar la dirección del flujo de datos.

    
pregunta Lazar

1 respuesta

2

Su controlador de interrupción intenta leer RBR dos veces (una vez en el controlador, una vez en la recepción). Eso no funcionará, el RBR lee un byte de FIFO cada vez.

El cambio de RS485 también parece ser incorrecto. Usualmente, cambia al modo de transmisión inmediatamente antes de enviar un byte, y vuelve a recibir la interrupción THRE cuando finaliza la transmisión.

Los retrasos de 1 ms serán problemáticos con las velocidades en baudios > 2400 , causando cuadros perdidos.

    
respondido por el Turbo J

Lea otras preguntas en las etiquetas