Buenas amigos de Todopic!
En esta ocasión vengo con un problema que tengo al comunicar mi PIC 24FJ128GA310 con el Módulo SIM5320. Resulta que quiero colocar en modo transparente la comunicación entre el PIC y este ultimo, para ello lo que hago es Byte que recibo por el UART1 lo mando por el UART2(que visualizo en el Hercules) y vicerveza, BYTE que recibo por el UART2, lo mando por el UART1 hacia el Módulo; asi:
void Modulo_3G1(){
//unsigned int j = 0; Se enciende el Módulo
M3G_ON_OFF = 1; __delay_ms(500);
PWRKEY = 1; __delay_ms(120); PWRKEY = 0; __delay_ms(500);
UA2("Inicio...");
LED_PRUEBA = 0;
// _____________________________________________________
while(1){
if(BandUx == 1){
U2(Dato1);
Dato1 = 0; BandUx = 0;
}
if(BandUx == 2){
U1(Dato2);
Dato2 = 0; BandUx = 0;
}
}
}
Los métodos U1 y U2 son los que siguen:
/************************
* Salida del UART2 *
************************/
void U2( unsigned char s ){
U2TXREG = s;
while( U2STAbits.TRMT == 0 );
}
/************************
* Salida del UART1 *
************************/
void U1( unsigned char s ){
U1TXREG = s;
while( U1STAbits.TRMT == 0 );
}
Y los valores Dato1 y Dato2 se cargan al momento en que hay una interrupción de recepción por el UART correspondiente:
void __attribute__ ((interrupt, no_auto_psv)) _U2RXInterrupt(void) {
Dato2 = U2RXREG;
BandUx = 2;
IFS1bits.U2RXIF = 0;
}
/********************************
* Interrupciones del UART1 *
********************************/
void __attribute__ ((interrupt, no_auto_psv)) _U1RXInterrupt(void) {
Dato1 = U1RXREG;
BandUx = 1;
IFS0bits.U1RXIF = 0;
}
Ahora bien, el problema que tengo es que al enviarle datos al Módulo manualmente, es decir, escribo en la pantalla del Hercules por ejemplo A T + C S Q (presiono enter), el módulo me responde, pero los Datos los recibo incompletos, véase:
at+csq{0D}{0D}+S:2,9{0A}{0A}K{0A} cuando en realidad la pregunta/respuesta deberia ser: at+csq{0D}{0D}{0A}+CSQ: 13,0{0D}{0A}{0D}{0A}OK{0D}{0A}
Por otro lado, al mandar el comando completo sin escribirlo "manualmente", el módulo no responde sencillamente, es como si los datos se perdieran y no le llegaran completos o no sé en realidad.
El FCY es 16 000 000UL, el BaudRate que estoy empleado es 115200, velocidad con la que funciona el módulo, y la manera como configuro los UART son:
void InitUART2(){
U2MODE = 0X8008;
U2BRG = ((FCY/BRG_DIV)/BaudRate)-1;
U2STA = 0x0000;
IFS1bits.U2TXIF = 0; // Limpia la interrupcion de TX
IEC1bits.U2TXIE = 0; // Habilita la interrupcion de TX
IFS1bits.U2RXIF = 0; // Limpia la interrupcion de RX
IEC1bits.U2RXIE = 1; // Habilita la interrupcion de RX
IPC7bits.U2RXIP = 7; // Habilita la prioridad 2 de RX
U2MODEbits.WAKE = 1; // Habilita para despertar al puerto
U2MODEbits.UARTEN = 1; // Habilita el puerto
U2STAbits.UTXEN = 1; // Habilita la transmision
}
/********************************
* Configuracion del UART 1 *
********************************/
void InitUART1(){
//U1MODE = 0x0808;
U1MODE = 0X8008;
U1BRG = ((FCY/BRG_DIV)/BaudRate)-1;
U1STA = 0x0000;;
IFS0bits.U1TXIF = 0; // Limpia la interrupcion de TX
IEC0bits.U1TXIE = 0; // Habilita la interrupcion de TX
IFS0bits.U1RXIF = 0; // Limpia la interrupcion de RX
IEC0bits.U1RXIE = 1; // Habilita la interrupcion de RX
IPC2bits.U1RXIP = 7; // Habilita la prioridad 2 de RX
U1MODEbits.WAKE = 1; // Habilita para despertar al puerto
U1MODEbits.UARTEN = 1; // Habilita el puerto
U1STAbits.UTXEN = 1; // Habilita la transmision
}
A este punto ya no sé que hacer, asi que por favor amigos les agradezco que me ayuden con esto, Gracias!!!!!!!!!!!!!!