TODOPIC
Microcontroladores PIC => Pic32 => Mensaje iniciado por: boanerxe en 03 de Diciembre de 2012, 14:20:20
-
Hola a todos,
Estoy tratando de adaptar las librerias que provee Microchip para una de sus placas de desarrollo (M2M) para comunicarse con un modulo GPRS y GPS de UBlox, pero para un micro PIC32MX440F512h.
El caso es que tengo un problema de lo mas tonto con la UART. Resulta que consigo transmitir un comando al modulo GPRS, y este envia una respuesta (lo he comprobado con un osciloscopio y con un "espia USB".
Sin embargo, esos datos enviados nunca llegan a estar disponibles en el micro (si justo despues de enviar de enviar ejecuto while (!UARTReceivedDataIsAvailable(UART2)); se queda bloqueado ahi).
Y claro, obviamente la interrupcion no salta.
Como datos os pongo como inicializo la UART:
INTSetVectorPriority(INT_UART_2_VECTOR, INT_PRIORITY_LEVEL_5);
INTSetVectorSubPriority(INT_UART_2_VECTOR, INT_SUB_PRIORITY_LEVEL_1);
INTEnable(INT_U2RX, INT_ENABLED);
INTClearFlag(INT_SOURCE_UART_RX(UART2));
INTClearFlag(INT_SOURCE_UART_TX(UART2));
UARTConfigure(UART2 , UART_ENABLE_PINS_CTS_RTS | UART_RTS_WHEN_RX_NOT_FULL);
UARTSetDataRate(UART2 , p32GetPeripheralBusClock(), 19200);
UARTSetLineControl(UART2 , UART_DATA_SIZE_8_BITS | UART_PARITY_NONE | UART_STOP_BITS_1);
UARTSetFifoMode(UART2 , UART_INTERRUPT_ON_RX_NOT_EMPTY);
UARTEnable(UART2 , UART_ENABLE_FLAGS(UART_PERIPHERAL | UART_TX | UART_RX));
Estoy usando MPLAB X .
Mis bits de configuracion:
#pragma config UPLLEN = ON
#pragma config UPLLIDIV = DIV_2
#pragma config FPLLMUL = MUL_16
#pragma config FPLLIDIV = DIV_2
#pragma config FPLLODIV = DIV_4
#pragma config FPBDIV = DIV_2
#pragma config FWDTEN = OFF
#pragma config WDTPS = PS2048
#pragma config FCKSM = CSECME
#pragma config OSCIOFNC = OFF
#pragma config POSCMOD = XT
#pragma config IESO = OFF
#pragma config FSOSCEN = ON
#pragma config FNOSC = PRIPLL
#pragma config CP = OFF
#pragma config BWP = OFF
#pragma config PWP = OFF
#pragma config ICESEL = ICS_PGx2
#pragma config DEBUG = OFF
Alguna idea de que puede estar pasando???
Gracias!
-
Algo parecido que me paso a mi fue que el uart2 en realidad es el uart3, no tengo ni idea de por que, pero alli donde dice
UARTConfigure(UART2 , UART_ENABLE_PINS_CTS_RTS | UART_RTS_WHEN_RX_NOT_FULL); puedes presionar la tecla Ctrl+click sobre UART2 y te mostrara una lista como esta #define UART2 UART3A
#define UART3 UART2A
#define UART4 UART1B
#define UART5 UART3B
#define UART6 UART2B
Muestra la interrupción de recepción del uart a ver si de pronto por allí esta el problema.
void configuracion_uart2(){
UARTConfigure(UART2, UART_ENABLE_PINS_TX_RX_ONLY);
UARTSetFifoMode(UART2, UART_INTERRUPT_ON_TX_NOT_FULL | UART_INTERRUPT_ON_RX_NOT_EMPTY);
UARTSetLineControl(UART2, UART_DATA_SIZE_8_BITS | UART_PARITY_NONE | UART_STOP_BITS_1);
UARTSetDataRate(UART2, GetPeripheralClock(), DESIRED_BAUDRATE);
UARTEnable(UART2, UART_ENABLE_FLAGS(UART_PERIPHERAL | UART_RX | UART_TX));
// Configure UART2 RX Interrupt
INTEnable(INT_SOURCE_UART_RX(UART2), INT_ENABLED);
INTSetVectorPriority(INT_VECTOR_UART(UART2), INT_PRIORITY_LEVEL_4);
INTSetVectorSubPriority(INT_VECTOR_UART(UART2), INT_SUB_PRIORITY_LEVEL_0);
}
void __ISR(_UART2_VECTOR, ipl4) IntUart2Handler(void){//_UART2_VECTOR
while ( !U2STAbits.URXDA); // wait for a new char to arrive
Dato = U2RXREG;
IFS1bits.U2RXIF = 0;
}