/** * @file nrf24l01.h * @brief NRF24L01 驱动 - 接收机端 (RX 模式 + ACK 发送) */ #ifndef __NRF24L01_H #define __NRF24L01_H #include "stc8h.h" #include #include "config.h" /* SPI 命令 */ #define NRF_CMD_R_REGISTER 0x00 #define NRF_CMD_W_REGISTER 0x20 #define NRF_CMD_R_RX_PAYLOAD 0x61 #define NRF_CMD_W_TX_PAYLOAD 0xA0 #define NRF_CMD_FLUSH_TX 0xE1 #define NRF_CMD_FLUSH_RX 0xE2 #define NRF_CMD_REUSE_TX_PL 0xE3 #define NRF_CMD_NOP 0xFF #define NRF_CMD_W_ACK_PAYLOAD 0xA8 /* P0: 0xA8, P1: 0xA9 ... */ /* 寄存器 */ #define NRF_REG_CONFIG 0x00 #define NRF_REG_EN_AA 0x01 #define NRF_REG_EN_RXADDR 0x02 #define NRF_REG_SETUP_AW 0x03 #define NRF_REG_SETUP_RETR 0x04 #define NRF_REG_RF_CH 0x05 #define NRF_REG_RF_SETUP 0x06 #define NRF_REG_STATUS 0x07 #define NRF_REG_OBSERVE_TX 0x08 #define NRF_REG_RPD 0x09 #define NRF_REG_RX_ADDR_P0 0x0A #define NRF_REG_TX_ADDR 0x10 #define NRF_REG_RX_PW_P0 0x11 #define NRF_REG_FIFO_STATUS 0x17 #define NRF_REG_DYNPD 0x1C #define NRF_REG_FEATURE 0x1D #define NRF_STATUS_RX_DR (1 << 6) #define NRF_STATUS_TX_DS (1 << 5) #define NRF_STATUS_MAX_RT (1 << 4) /* 操作结果 */ #define NRF_OK 0 #define NRF_ERR_CHECK 1 /* 运行时状态 */ typedef struct { uint8_t last_status; uint8_t rx_count; /* 接收帧计数 */ uint8_t bind_state; /* 0=正常,1=对频中 */ uint8_t ack_pending; /* 有待发送的 ACK payload */ uint8_t ack_payload[NRF_PAYLOAD_LEN]; } NRF_Status_t; extern NRF_Status_t __xdata g_nrf_status; void nrf24_init(void); uint8_t nrf24_check(void); void nrf24_set_channel(uint8_t ch); void nrf24_set_address(const uint8_t *addr5); void nrf24_set_rx_mode(void); /* 进入 RX 模式 */ uint8_t nrf24_data_ready(void); /* 检查是否有数据,有则读出到 buf */ void nrf24_write_ack_payload(const uint8_t *buf); /* 写入 ACK payload */ /* IRQ 中断处理 (NRF IRQ 接 P1.7) */ void nrf24_irq_handler(void); #endif