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í?