Intercambio de paquetes sobre un nRF24L01 +

1

Tengo dos nRF24L01 + chips cada uno conectado a un Bus Pirate. Estoy tratando de escribir un código para probar el intercambio de paquetes entre ellos, al principio completamente en mi computadora portátil antes de que finalmente me mude a un chip AVR.

Si configuro uno de los chips en modo PRX, sondeo el bit de estado del RPD y configuro el otro chip en modo PTX con PLL_LOCK + CONT_WAVE habilitado, observo al operador en el lado de PRX. Así que puedo confirmar que la mayoría de mi código está funcionando y los módulos de radio en sí están funcionando, como lo demuestra esta sencilla prueba de detección de operador.

Sin embargo, cualquier intento de pasar un paquete real está fallando por completo. Cada vez que intento enviar, el módulo PTX alcanza una condición de error MAX_RT, y el módulo PRX nunca ve nada.

La configuración (prevista) de los módulos es la siguiente:

RF_DR=2M RF_CH=30 ARD=1500usec ARC=9 AW=5
TX_ADDR=55:AA:55:AA:55 RX_ADDR_P0=55:AA:55:AA:55 RX_PW_P0=16

Además, el módulo PRX tiene PRIM_RX=1 y el módulo PTX en PRIM_RX=0 . Luego procedo en el PRX:

FLUSH_RX_FIFO
W_REGISTER(STATUS) to clear the interrupt flags
W_REGISTER(CONFIG) to set PWR_UP
Enable the CE line
Poll NOP, waiting on RX_DR in the returned status

Mientras tanto en el PTX:

FLUSH_TX_FIFO
W_REGISTER(STATUS) to clear the interrupt flags
W_REGISTER(CONFIG) to set PWR_UP
W_TX_PAYLOAD a 16-byte payload
Enable the CE line
Poll NOP, waiting on either TX_DS or MAX_RT in the returned status

Lo que sucede cada vez es que finalmente obtengo MAX_RT en el módulo PTX (y veo los conteos esperados en OBSERVE_TX), mientras que el módulo PRX nunca ve nada. Ahora estoy bastante atorado por saber qué podría estar mal.

No estoy seguro si el error es un error en mis configuraciones de registro, o qué otra cosa podría ser. Aquí hay dos volcados de los valores de registro de cada módulo, justo antes de la prueba:

PTX config:
{
  ARC         => 9,
  ARD         => 1500,
  AW          => 5,
  CONT_WAVE   => 0,
  CRCO        => 1,
  EN_ACK_PAY  => 0,
  EN_CRC      => 1,
  EN_DPL      => 1,
  EN_DYN_ACK  => 1,
  MASK_MAX_RT => 0,
  MASK_RX_RD  => 0,
  MASK_TX_DS  => 0,
  PLL_LOCK    => 0,
  PRIM_RX     => 0,
  PWR_UP      => 0,
  RF_CH       => 30,
  RF_DR       => 2000000,
  RF_PWR      => 0,
  TX_ADDR     => "55:AA:55:AA:55",
}
{
  DYNPD     => 0,
  EN_AA     => 1,
  EN_RXADDR => 1,
  RX_ADDR   => "55:AA:55:AA:55",
  RX_PW     => 16,
}
[00] 08         | 00001000
[01] 3f         | 00111111
[02] 03         | 00000011
[03] 03         | 00000011
[04] 59         | 01011001
[05] 1e         | 00011110
[06] 0e         | 00001110
[07] 1e         | 00011110
[08] 29         | 00101001
[09] 00         | 00000000
[0A] 55aa55aa55 | 0101010110101010010101011010101001010101
[0B] c2c2c2c2c2 | 1100001011000010110000101100001011000010
[0C] c3         | 11000011
[0D] c4         | 11000100
[0E] c5         | 11000101
[0F] c6         | 11000110
[10] 55aa55aa55 | 0101010110101010010101011010101001010101
[11] 10         | 00010000
[12] 00         | 00000000
[13] 00         | 00000000
[14] 00         | 00000000
[15] 00         | 00000000
[16] 00         | 00000000
[17] 01         | 00000001
[1C] 00         | 00000000
[1D] 00         | 00000000

PRX config:
{
  ARC         => 9,
  ARD         => 1500,
  AW          => 5,
  CONT_WAVE   => 0,
  CRCO        => 1,
  EN_ACK_PAY  => 0,
  EN_CRC      => 1,
  EN_DPL      => 0,
  EN_DYN_ACK  => 0,
  MASK_MAX_RT => 0,
  MASK_RX_RD  => 0,
  MASK_TX_DS  => 0,
  PLL_LOCK    => 0,
  PRIM_RX     => 1,
  PWR_UP      => 0,
  RF_CH       => 30,
  RF_DR       => 2000000,
  RF_PWR      => 0,
  TX_ADDR     => "55:AA:55:AA:55",
}
{
  DYNPD     => 0,
  EN_AA     => 1,
  EN_RXADDR => 1,
  RX_ADDR   => "55:AA:55:AA:55",
  RX_PW     => 16,
}
[00] 09         | 00001001
[01] 3f         | 00111111
[02] 03         | 00000011
[03] 03         | 00000011
[04] 59         | 01011001
[05] 1e         | 00011110
[06] 0e         | 00001110
[07] 0e         | 00001110
[08] 00         | 00000000
[09] 00         | 00000000
[0A] 55aa55aa55 | 0101010110101010010101011010101001010101
[0B] c2c2c2c2c2 | 1100001011000010110000101100001011000010
[0C] c3         | 11000011
[0D] c4         | 11000100
[0E] c5         | 11000101
[0F] c6         | 11000110
[10] 55aa55aa55 | 0101010110101010010101011010101001010101
[11] 10         | 00010000
[12] 00         | 00000000
[13] 00         | 00000000
[14] 00         | 00000000
[15] 00         | 00000000
[16] 00         | 00000000
[17] 11         | 00010001
[1C] 00         | 00000000
[1D] 00         | 00000000

¿Alguien tiene alguna sugerencia adónde voy desde aquí?

    
pregunta LeoNerd

1 respuesta

1

Ahora he logrado solucionar este problema; Para la posteridad explicaré la solución aquí.

Resultaron ser dos problemas, ninguno de los cuales era visible desde el volcado de configuración pegado arriba. La configuración es correcta. Los problemas fueron:

  1. El retardo de retransmisión automática de 1500usec está bien para paquetes pequeños, pero mi programa de ejemplo estaba enviando paquetes de 16 bytes, para los cuales este retardo es demasiado pequeño. El envío de un paquete de un solo byte funciona bien.

  2. El nRF24L01 + necesita un condensador de desacoplamiento de energía conectado al chip, como las largas líneas de energía en uso en mi estuche (computadora portátil - > cable USB - > Bus Pirate - > cable de sonda pirata de bus - > nRF) significó una gran cantidad de energía en el momento en que enciende el transmisor.

Al adjuntar este límite y al usar paquetes de 1 byte, parece que todo funciona bien.

    
respondido por el LeoNerd

Lea otras preguntas en las etiquetas