PIC32mx UART a Bluetooth RN4020

0

Estoy tratando de establecer una comunicación UART entre PIC32MX110F016 y un RN4020 Módulo Bluetooth.

Soy nuevo en PIC32mx pero creo que estoy haciendo suficiente código / configuración para que puedan comunicarse pero desafortunadamente no lo están y realmente no sé por qué. No sé la razón por la que vuelvo con ustedes. Este es el código que he hecho. ¿Alguien tiene algún consejo?

#pragma config   FNOSC       = FRCPLL
#pragma config   FPLLIDIV    = DIV_2
#pragma config   FPLLMUL     = MUL_20
#pragma config   FPLLODIV    = DIV_2
#pragma config   FPBDIV      = DIV_1
#pragma config   ICESEL      = ICS_PGx2 
#pragma config   WDTPS       = PS16384

#define GetSystemClock()       (40000000ul)
#define GetPeripheralClock()    (GetSystemClock())
#define CORE_TICK_RATE (GetSystemClock() / 2 / 1000) 

#define BaudRate   38400 

char Message[] = "Hello!";

void __ISR(_UART_1_VECTOR, ipl2)UART1_RX_INT(void){
if(INTGetFlag(INT_SOURCE_UART_RX(    
       INTClearFlag(INT_SOURCE_UART_RX(UART1)); 
}   
if(INTGetFlag(INT_SOURCE_UART_TX(UART1))){        
 INTClearFlag(INT_SOURCE_UART_TX(UART1));    
}
}  

void Serial_print(char *buffer)
{ 
while(*buffer != (char)0) 
{
  while(!UARTTransmitterIsReady(UART1)); 
  UARTSendDataByte(UART1, *buffer++); 
}
while(!UARTTransmissionHasCompleted(UART1)); 
UARTSendDataByte(UART1, '\r'); 
UARTSendDataByte(UART1, '\n'); 
} 

void uartconfig(void){
PPSUnLock;                        // Allow PIN Mapping 
  PPSOutput(1, RPA0, U1TX);     // MAP Tx to RA0 set to digital out
  PPSInput (3, U1RX, RPA2);     // MAP Rx to RA2 set to digital in
PPSLock;                         // Prevent Accidental Mapping

#define UART1TX TRISAbits.TRISA0
#define UART1RX TRISAbits.TRISA2

UART1TX = 0;//output
UART1RX = 1;//input     

UARTConfigure(UART1, UART_ENABLE_PINS_TX_RX_ONLY); 
UARTSetLineControl(UART1, UART_DATA_SIZE_8_BITS | UART_PARITY_NONE |UART_STOP_BITS_1); 
UARTSetDataRate(UART1, GetPeripheralClock(), BaudRate); 
UARTEnable(UART1, UART_ENABLE_FLAGS(UART_PERIPHERAL | UART_RX | UART_TX));  
UARTSetFifoMode(UART1, UART_INTERRUPT_ON_TX_NOT_FULL | UART_INTERRUPT_ON_RX_NOT_EMPTY);          
INTEnable(INT_SOURCE_UART_RX(UART1), INT_ENABLED);   
INTSetVectorPriority(INT_VECTOR_UART(UART1), INT_PRIORITY_LEVEL_2);   
INTSetVectorSubPriority(INT_VECTOR_UART(UART1), INT_SUB_PRIORITY_LEVEL_0); 
}


int32_t main(void) {
__asm__("EI"); 
SYSTEMConfig(GetSystemClock(), SYS_CFG_WAIT_STATES | SYS_CFG_PCACHE);
INTConfigureSystem(INT_SYSTEM_CONFIG_MULT_VECTOR); //configure multi vector
INTEnableSystemMultiVectoredInt(); //enable interrupts
uartconfig();
WDTCONbits.WDTCLR = 1; // feed the watchdog
WDTCONbits.ON = 1; // enable the watchdog

uartconfig();

Serial_print(Message);
while(1);
}

Para una mejor comprensión, puedes ver mi esquema:

    
pregunta scuba

1 respuesta

2

Su código parece funcionar bien (aparte de un poco que falta en la rutina de interrupción, que asumo es solo un error de copiar / pegar porque no se compilará como está).

Sin embargo, solo envía el mensaje serial una vez en el inicio, luego espera para siempre. El PIC comienza a enviar datos aproximadamente 1 ms después de reiniciarse, por lo que si tanto el Bluetooth como el PIC se encienden al mismo tiempo, es posible que el módulo Bluetooth no esté listo a tiempo para recibir el mensaje.

Para la depuración, enviaría el mensaje repetidamente en el bucle while (), con un retraso de aproximadamente 1 segundo antes de cada transmisión. Para probar que el PIC está enviando datos, puede conectar un LED (y una resistencia en serie) desde el pin TX a Vcc. El LED debería parpadear brevemente en el mensaje. Si esto funciona, pero el mensaje aún no llega, verifique el cableado y la configuración de su módulo Bluetooth.

    
respondido por el Bruce Abbott

Lea otras preguntas en las etiquetas