Problema con la comunicación SPI (PIC24H)

3

Estoy intentando comunicarme con un módulo de transceptor NRF24L01 con un PIC24HJ128GP202. Además de todo el código, aquí está la parte importante:

void NRF_Config()
{
  NRF_WriteRegister(0x02, 0x01); //PIPE 0 ENABLE
  NRF_ActivateSR();
  NRF_WriteRegister(0x1D, 0x06); //FEATURE REG - Enable Dynamic Payload && Enable ACK Payload
  NRF_WriteRegister(0x1C, 0x01); //ENABLE DYNAMIC PAYLOAD PIPE0
  NRF_WriteRegister(0x00, 0x5A); //CONFIG REG
  Delay(Delay_2ms);
  NRF_EN(); //CHIP ENABLED PIN = TRUE
}

siendo la función WriteRegister:

unsigned char NRF_WriteRegister(unsigned char reg, unsigned char data)
{
   SPI1_BEGIN(); //CHIP SELECT = LOW  (START COMMUNICATION)

   IFS0bits.SPI1IF = 0;
   while (SPI1STATbits.SPITBF);
   WriteSPI1(0x20 | reg);
   while (!IFS0bits.SPI1IF);

   IFS0bits.SPI1IF = 0;
   while (SPI1STATbits.SPITBF);
   WriteSPI1(data);
   while (!IFS0bits.SPI1IF);

   SPI1_END(); //CHIP SELECT = HIGH (END COMMUNICATION)
   return ReadSPI1();
}

Esto funciona bien (al menos parece funcionar). El código se ejecuta correctamente y O'scope muestra que el pin CS se está agotando, luego 2 grupos de 8 pulsos en el pin SCK seguidos por el CS alto.

Entonces tengo esto:

unsigned char NRF_PutTXPayload(unsigned char *data, char len)
{

   if (len > TX_DATA_SIZE)
       return 0;
   SPI1_BEGIN();

   //SEND BYTE 1
   IFS0bits.SPI1IF = 0;
   while (SPI1STATbits.SPITBF);
   WriteSPI1(0xA0);
   while (!IFS0bits.SPI1IF);

   //SEND BYTE 2
   IFS0bits.SPI1IF = 0;
   while (SPI1STATbits.SPITBF);
   WriteSPI1(0xEF);
   while (!IFS0bits.SPI1IF);

   //SEND BYTE 3
   IFS0bits.SPI1IF = 0;
   while (SPI1STATbits.SPITBF);
   WriteSPI1(0xEF);
   while (!IFS0bits.SPI1IF);

  SPI1_END();
  return ReadSPI1();

}

Como puede ver, esta función de arriba es una versión modificada de la original que quería usar. Actualmente no estoy usando esos argumentos y solía tener un bucle For para enviar un grupo de bytes de longitud variable. Luego entré a esta versión anterior porque estaba congelando mi PIC en algún lugar dentro del bucle For. Entonces me doy cuenta de que si mantengo solo los dos primeros bloques (ENVIAR BYTE 1 y ENVIAR BYTE 2) está bien. Cuando agrego el tercero, se congela el PIC.

Sé que podría reducir mi código cuando me ocupo de los bits de bandera, pero copié exactamente las mismas líneas de la función WriteRegister para asegurarme de que funcionara. Además, debería funcionar porque primero reinicio el indicador de interrupción; luego espero a que TX buffer vacío comience a copiar; entonces simplemente escribo a TX buf; y luego espero para interrumpir el indicador que significa que la transmisión ha finalizado. Aunque no sea la forma mejor / más rápida de hacerlo, creo que debería funcionar bien, pero no lo hace.

Es extraño porque funciona con 2 bytes pero no con tres. El O'scope muestra que el pin CS está bajando, luego muestra los tres grupos de 8 relojes en el pin SCK, pero el pin CS nunca vuelve a estar alto (y el PIC está congelado).

¿Alguna idea de lo que podría estar pasando?

    
pregunta Felipe_Ribas

1 respuesta

1

Uno de los errata en ese chip es:

  
  1. Módulo SPI El indicador de búfer lleno de transmisión SPI (SPITBF) no se establece inmediatamente después de escribir en el búfer.
  2.   

Entonces, tal vez intente un retraso (quizás 10 NOP o algo así) antes de probar el indicador SPITBF. No parece haber una alternativa oficial.

    
respondido por el Spehro Pefhany

Lea otras preguntas en las etiquetas