Estoy escribiendo el código para que un ESP32 envíe datos utilizando un módulo NRF24L01 + a otro módulo NRF24L01 + conectado a un Arduino Pro Mini. El Arduino puede enviar datos con éxito al ESP32. Así que todo está correctamente conectado y la configuración de RF es compatible. Sin embargo, cuando cambio de roles, no se reciben paquetes en el Arduino y todos los paquetes transmitidos establecen el indicador MAX_RT (máximo de reintentos alcanzado) en el registro de estado (en el lado de ESP32).
Lo más extraño es que no puedo vaciar la cola FIFO de TX, cuál se supone que debe hacer para continuar con el siguiente paquete. El envío de 0xE1 al módulo de RF parece no tener efecto. Después de tres paquetes fallidos, tanto el ESTADO como el registro FIFO_STATUS indican TX FIFO lleno . Y ninguna cantidad de comandos de descarga puede borrarlo.
Pregunta : ¿Por qué el comando FLUSH_TX no tiene efecto?
El código está escrito en C para el SDK ESP32 (también conocido como ESP32 IDF) basado en FreeRTOS. La comunicación es una comunicación unidireccional simple: cualquiera de los extremos es solo el remitente o el receptor.
Ya he descartado muchas cosas:
- He verificado la comunicación SPI con un analizador lógico y no he encontrado ningún problema.
- He comparado la comunicación SPI del ESP32 con el Arduino y son casi idénticas. Principales diferencias: tiempo; y el código ESP32 almacena los registros de configuración en la memoria para reducir el número de lecturas de registros.
- He cambiado los módulos NRF24L01 + sin ningún efecto.
- He agregado un condensador de 47µF entre GND y VCC cerca del módulo de RF.
Aquí hay un volcado de la mayoría de los registros:
STATUS = 0x0f: RX_DR=0 TX_DS=0 MAX_RT=0 RX_P_NO=1 TX_FULL=1
FIFO_STATUS = 0x21
RX_ADDR_P0 = 0x38a8bb7201
RX_ADDR_P1 = 0x389f30cc1b
RX_ADDR_P2-5 = 0xc3 0xc4 0xc5 0xc6
TX_ADDR = 0x38a8bb7201
RX_PW_P0-6 = 0x20 0x20 0x00 0x00 0x00 0x00
EN_AA = 0x3f
EN_RXADDR = 0x03
SETUP_AW = 0x03
REG_SETUP_RETR = 0x5f
RF_CH = 0x52
RF_SETUP = 0x03
CONFIG = 0x0e
DYNPD/FEATURE = 0x00 0x00