使用NRF24L01库
1.移植和初始化
(1)重新定义函数void Wait_us(uint16_t time),实现微秒级延时,否则数据发送的效率会很低(但也不是不能用)。
(2)声明一个RF_HandlerTypeDef 结构体以准备初始化NRF24L01模块
(3)调用NRF_DeInit()将NRF24L01将模块恢复缺省配置。
如果声明了NRF_SPI,NRF_CE_PORT,NRF_CE_PIN,NRF_NSS_PORT,NRF_NSS_PIN,NRF_INT_PORT,NRF_INT_PIN宏来表示硬件SPI的使用和引脚定义,那么接下来可以直接调用NRF_Init()进行初始化,否则需要再次传参给Gpio_CE,Gpio_CE_Pin等成员变量确定硬件使用
(4)对RF_HandlerTypeDef结构体参数的详细阐述:
myspi=&hspi1 (该NRF24L01模块使用的硬件SPI的句柄)
Gpio_CE=GPIOA(该模块CE控制引脚使用的端口号)
Gpio_CE_Pin=GPIO_PIN_0)(该模块使用的引脚号)
Gpio_SS,Gpio_SS_Pin,Gpio_INT,Gpio_INT_Pin同理(注意CE,SS应配置为输出,INT应配置为输入)
AddressSize=3 表示使用的地址位数为3字节(只能位3,4,5)
Address_Pipe0=0x123456 表示设置接收通道0的地址为0x123456(3字节)【如果使用自动回复,必须设置该通道地址与发送时的地址(接收方的某个通道地址)相同】
Address_Pipe1=0x345678 表示设置接收通道1的地址为0x345678。同时,以后的通道2,3,4,5均使用该地址的高位(0x3456XX)作为通道2,3,4,5的地址,最低8位可以设置不同的地址以相互区分
Address_Pipex[i] (i=0~3)表示设置通道2,3,4,5的地址(低8位)。高位使用Pipe1地址的高位
EnablePipe使能接收通道。传入多个宏定义的或运算结果
#define NRF24L01_INIT_ENABLE_CHANNEL0 0x01 #define NRF24L01_INIT_ENABLE_CHANNEL1 0x02 #define NRF24L01_INIT_ENABLE_CHANNEL2 0x04 #define NRF24L01_INIT_ENABLE_CHANNEL3 0x08 #define NRF24L01_INIT_ENABLE_CHANNEL4 0x10 #define NRF24L01_INIT_ENABLE_CHANNEL5 0x20PackageSize_Pipex[i] (i=(0~5))设置某个通道需要接收的数据的字节数
EnablePipeAck使能某个接收通道的自动确认(即某个收到数据的管道,会发送确认信息给发送方)。传入多个宏定义的或运算结果
#define NRF24L01_INIT_ENABLE_ACK_IN_PIP0 0x01 #define NRF24L01_INIT_ENABLE_ACK_IN_PIP1 0x02 #define NRF24L01_INIT_ENABLE_ACK_IN_PIP2 0x04 #define NRF24L01_INIT_ENABLE_ACK_IN_PIP3 0x08 #define NRF24L01_INIT_ENABLE_ACK_IN_PIP4 0x10 #define NRF24L01_INIT_ENABLE_ACK_IN_PIP5 0x20Max_Repet当发送方没有收到接收方的自动确认消息时(受干扰因素丢包),自动重新发送该消息的最大次数(超过该次数后,会通过INT置低电平通知处理器)
RetryTime当发送方没有收到接收方的自动确认消息时(受干扰因素丢包),自动重新发送该消息的间隔时间
Channel设置频道(通信频率),如果多个模块要通信,必须设置该值为同一个
DeviceMode=NRF24L01_INIT_CONFIG_EN_CRC|NRF24L01_INIT_CONFIG_CRC_ONE_BYTE|NRF24L01_INIT_CONFIG_POWER_ON;通常不需要更改(启用CRC,CRC占位为1字节,开启电源)
Power设置发射功率增益。
#define NRF24L01_INIT_POWER_0dBm 0x06 #define NRF24L01_INIT_POWER_6dBm 0x04 #define NRF24L01_INIT_POWER_12dBm 0x02 #define NRF24L01_INIT_POWER_18dBm 0x00Speed设置发射时通信速率大小。
#define NRF24L01_INIT_SPEED_1Mbps 0x00 #define NRF24L01_INIT_SPEED_2Mbps 0x08 #define NRF24L01_INIT_SPEED_250kbps 0x20
(5)调用NRF_Init()初始化NRF24L01模块。
2.使用
(1).接收信息
(1)调用一次NRF_StartReceive(RF_HandlerTypeDef *hRF);进行接收监听。
(2)当模块接收到数据后,会将INT引脚由高电平置低。可以轮询检测引脚状态,或者由外部中断触发执行处理数据的代码。
(3)在中断处理回调函数中,首先使用函数NRF_ReceiveData()获取接收到的数据的来源通道,数据长度,以及数据本体,如果成功,会返回NRF24L01_MSG_RX_SUCCESS。然后可以编写用户的对接收到的数据进行处理。
如果本次中断不是由接收数据引起的,该函数可能会返回NRF24L01_MSG_RX_FIFO_EMPTY或NRF24L01_MSG_RX_NOT_READY。
(2).发送信息
(1)调用一次NRF_SendData();发送数据。函数会阻塞,直到数据发送完成或出错后返回。如果发送成功,函数返回值为本次发送数据包的数据包因为干扰问题而重新发送的次数,如果重新发送次数达到15,表示发送失败,停止发送。同时会调用弱定义函数NRF_ErrorDeal()处理错误。
3.文件内容
#ifndef __NRF24L01_H__
#define __NRF24L01_H__
#include "stm32f1xx_hal.h"
// SPI(nRF24L01) commands
#define NRF24L01_CMD_REGISTER_R 0x00 // Register read
#define NRF24L01_CMD_REGISTER_W 0x20 // Register write
#define NRF24L01_CMD_ACTIVATE 0x50 // (De)Activates R_RX_PL_WID, W_ACK_PAYLOAD, W_TX_PAYLOAD_NOACK features
#define NRF24L01_CMD_RX_PLOAD_WID_R 0x60 // Read RX-payload width for the top R_RX_PAYLOAD in the RX FIFO.
#define NRF24L01_CMD_RX_PLOAD_R 0x61 // Read RX payload
#define NRF24L01_CMD_TX_PLOAD_W 0xA0 // Write TX payload
#define NRF24L01_CMD_ACK_PAYLOAD_W 0xA8 // Write ACK payload
#define NRF24L01_CMD_TX_PAYLOAD_NOACK_W 0xB0 //Write TX payload and disable AUTOACK
#define NRF24L01_CMD_FLUSH_TX 0xE1 // Flush TX FIFO
#define NRF24L01_CMD_FLUSH_RX 0xE2 // Flush RX FIFO
#define NRF24L01_CMD_REUSE_TX_PL 0xE3 // Reuse TX payload
#define NRF24L01_CMD_LOCK_UNLOCK 0x50 // Lock/unlock exclusive features
#define NRF24L01_CMD_NOP 0xFF // No operation (used for reading status register)
//Regsiters
#define NRF24L01_REG_CONFIG 0x00 // Configuration register
#define NRF24L01_REG_EN_AA 0x01 // Enable "Auto acknowledgment"
#define NRF24L01_REG_EN_RXADDR 0x02 // Enable RX addresses
#define NRF24L01_REG_SETUP_AW 0x03 // Setup of address widths
#define NRF24L01_REG_SETUP_RETR 0x04 // Setup of automatic re-transmit
#define NRF24L01_REG_RF_CH 0x05 // RF channel
#define NRF24L01_REG_RF_SETUP 0x06 // RF setup
#define NRF24L01_REG_STATUS 0x07 // Status register
#define NRF24L01_REG_OBSERVE_TX 0x08 // Transmit observe register
#define NRF24L01_REG_RPD 0x09 // Received power detector
#define NRF24L01_REG_RX_ADDR_P0 0x0A // Receive address data pipe 0
#define NRF24L01_REG_RX_ADDR_P1 0x0B // Receive address data pipe 1
#define NRF24L01_REG_RX_ADDR_P2 0x0C // Receive address data pipe 2
#define NRF24L01_REG_RX_ADDR_P3 0x0D // Receive address data pipe 3
#define NRF24L01_REG_RX_ADDR_P4 0x0E // Receive address data pipe 4
#define NRF24L01_REG_RX_ADDR_P5 0x0F // Receive address data pipe 5
#define NRF24L01_REG_TX_ADDR 0x10 // Transmit address
#define NRF24L01_REG_RX_PW_P0 0x11 // Number of bytes in RX payload in data pipe 0
#define NRF24L01_REG_RX_PW_P1 0x12 // Number of bytes in RX payload in data pipe 1
#define NRF24L01_REG_RX_PW_P2 0x13 // Number of bytes in RX payload in data pipe 2
#define NRF24L01_REG_RX_PW_P3 0x14 // Number of bytes in RX payload in data pipe 3
#define NRF24L01_REG_RX_PW_P4 0x15 // Number of bytes in RX payload in data pipe 4
#define NRF24L01_REG_RX_PW_P5 0x16 // Number of bytes in RX payload in data pipe 5
#define NRF24L01_REG_FIFO_STATUS 0x17 // FIFO status register
#define NRF24L01_REG_DYNPD 0x1C // Enable dynamic payload length
#define NRF24L01_REG_FEATURE 0x1D // Feature register
//设备工作模式
#define RF_MODULE_WORKMODE_RECEIVE 0x01 //CE(GPIO_START)保持高接收数据
#define RF_MODULE_WORKMODE_SEND 0x00 //CE(GPIO_START)高到低跳变发送数据
//#define RF_MODULE_WORKMODE_HOLD1 //自动进入该模式(CE为低<处于发送完成的状态>,且开机)
//#define RF_MODULE_WORKMODE_HOLD2 //自动进入该模式(CE为高<处于接收状态>,且开机)
#define RF_MODULE_WORKMODE_POWERON 0x02 //电源
//设备初始化配置
#define NRF24L01_INIT_CONFIG_RX_DR_IRQ 0x40
#define NRF24L01_INIT_CONFIG_TX_DS_IRQ 0x20
#define NRF24L01_INIT_CONFIG_MAX_RT_IRQ 0x10
#define NRF24L01_INIT_CONFIG_EN_CRC 0x08
#define NRF24L01_INIT_CONFIG_CRC_ONE_BYTE 0x00
#define NRF24L01_INIT_CONFIG_CRC_TWO_BYTE 0x04
#define NRF24L01_INIT_CONFIG_POWER_ON 0x02
#define NRF24L01_INIT_ENABLE_CHANNEL0 0x01
#define NRF24L01_INIT_ENABLE_CHANNEL1 0x02
#define NRF24L01_INIT_ENABLE_CHANNEL2 0x04
#define NRF24L01_INIT_ENABLE_CHANNEL3 0x08
#define NRF24L01_INIT_ENABLE_CHANNEL4 0x10
#define NRF24L01_INIT_ENABLE_CHANNEL5 0x20
#define NRF24L01_INIT_POWER_0dBm 0x06
#define NRF24L01_INIT_POWER_6dBm 0x04
#define NRF24L01_INIT_POWER_12dBm 0x02
#define NRF24L01_INIT_POWER_18dBm 0x00
#define NRF24L01_INIT_SPEED_1Mbps 0x00
#define NRF24L01_INIT_SPEED_2Mbps 0x08
#define NRF24L01_INIT_SPEED_250kbps 0x20
#define NRF24L01_INIT_ENABLE_ACK_IN_PIP0 0x01
#define NRF24L01_INIT_ENABLE_ACK_IN_PIP1 0x02
#define NRF24L01_INIT_ENABLE_ACK_IN_PIP2 0x04
#define NRF24L01_INIT_ENABLE_ACK_IN_PIP3 0x08
#define NRF24L01_INIT_ENABLE_ACK_IN_PIP4 0x10
#define NRF24L01_INIT_ENABLE_ACK_IN_PIP5 0x20
#define NRF24L01_MSG_RX_SUCCESS 0
#define NRF24L01_MSG_RX_NOT_READY -1
#define NRF24L01_MSG_RX_FIFO_EMPTY -2
#define NRF24L01_MSG_RX_FAILED -3
typedef struct
{
//Hardware Info
SPI_HandleTypeDef *myspi;
GPIO_TypeDef *Gpio_CE;
GPIO_TypeDef *Gpio_INT;
GPIO_TypeDef *Gpio_SS;
uint16_t Gpio_CE_Pin;
uint16_t Gpio_INT_Pin;
uint16_t Gpio_SS_Pin;
//Device Info
//uint8_t WorkMode;
uint8_t EnablePipeAck;
uint8_t DeviceMode;
uint8_t EnablePipe;
uint8_t Max_Repet;
uint8_t AddressSize;
uint8_t Channel;
uint16_t RetryTime;
uint8_t Power;
uint8_t Speed;
uint64_t Address_Pipe0;
uint64_t Address_Pipe1;
uint8_t Address_Pipex[4];
uint8_t PackageSize_Pipex[6];
//Data deal
//uint8_t Address;
//uint8_t DataLength;
//uint8_t *Buffer;
//uint8_t Error;
}RF_HandlerTypeDef;
void Wait_us(uint16_t time);
void NRF_DeInit(RF_HandlerTypeDef *hRF); //恢复缺省配置
void NRF_Init(RF_HandlerTypeDef *hRF);
void NRF_StartReceive(RF_HandlerTypeDef *hRF);
void NRF_WriteReg(RF_HandlerTypeDef *hRF,uint8_t cmd,uint8_t *p_value,uint8_t data_length);
void NRF_ReadReg(RF_HandlerTypeDef *hRF,uint8_t cmd,uint8_t *p_value,uint8_t data_length);
uint8_t NRF_SendData(RF_HandlerTypeDef *hRF,uint8_t *source,uint8_t length,uint64_t DeviceAddress);
int8_t NRF_ReceiveData(RF_HandlerTypeDef *hRF,uint8_t *buffer,uint8_t *length,uint8_t *channel);
#endif
#include "nrf24l01.h"
__weak void Wait_us(uint16_t time)
{
UNUSED(time);
HAL_Delay(1);
}
__weak uint8_t NRF_ErrorDeal() //检测到发送失败时调用该函数
{
}
/**
* @brief 将NRF24L01模块句柄参数设置为缺省默认值.
* @param hRF NRF24L01模块句柄
*/
void NRF_DeInit(RF_HandlerTypeDef *hRF)
{
#ifndef NRF_SPI
hRF->myspi=NULL;
#else
hRF->myspi=NRF_SPI;
#endif
#ifndef NRF_CE_PORT
hRF->Gpio_CE=NULL;
#else
hRF->Gpio_CE=NRF_CE_PORT;
#endif
#ifndef NRF_CE_PIN
hRF->Gpio_CE_Pin=NULL;
#else
hRF->Gpio_CE_pin=NRF_CE_PIN;
#endif
#ifndef NRF_NSS_PORT
hRF->Gpio_SS=NULL;
#else
hRF->Gpio_SS=NRF_CE_PORT;
#endif
#ifndef NRF_NSS_PIN
hRF->Gpio_SS_Pin=NULL;
#else
hRF->Gpio_SS_Pin=NRF_NSS_PIN;
#endif
#ifndef NRF_INT_PORT
hRF->Gpio_INT=NULL;
#else
hRF->Gpio_INT=NRF_INT_PORT;
#endif
#ifndef NRF_INT_PIN
hRF->Gpio_INT_Pin=NULL;
#else
hRF->Gpio_INT_Pin=NRF_INT_PIN;
#endif
hRF->AddressSize=3; //传输使用的地�???宽度(hRF->Address_Pipe0)
hRF->EnablePipe=NRF24L01_INIT_ENABLE_CHANNEL0; //使能接收通道0
hRF->EnablePipeAck=NRF24L01_INIT_ENABLE_ACK_IN_PIP0; //使能通道0的自动确认
hRF->Max_Repet=10; //最大重发次数(距离过远或受到干扰发送失败时,自动重新发送的次数
hRF->Channel=0; //频道(多个模块互相通信应该使用同一频道)
hRF->DeviceMode=NRF24L01_INIT_CONFIG_EN_CRC|NRF24L01_INIT_CONFIG_CRC_ONE_BYTE|NRF24L01_INIT_CONFIG_POWER_ON; //设备工作模式(使用CRC,CRC占用1位,电源开启
hRF->RetryTime=2000; //自动重发间隔时间(us)详细设置要求见技术手册P
hRF->Address_Pipe0=0x123456UL; //通道0地址(当接收到数据后,目标会发送ACK确认包到0x123456UL,所以必须设置通道0地址为0x123456UL以实现自动确认)
hRF->PackageSize_Pipex[0]=4; //通道0要接收的数据包长为x
}
//写寄存器
void NRF_WriteReg(RF_HandlerTypeDef *hRF,uint8_t cmd,uint8_t *p_value,uint8_t data_length)
{
HAL_GPIO_WritePin(hRF->Gpio_SS,hRF->Gpio_SS_Pin,GPIO_PIN_RESET);
Wait_us(10);
HAL_SPI_Transmit(hRF->myspi,&cmd,1,HAL_MAX_DELAY);
HAL_SPI_Transmit(hRF->myspi,p_value,data_length,HAL_MAX_DELAY);
Wait_us(10);
HAL_GPIO_WritePin(hRF->Gpio_SS,hRF->Gpio_SS_Pin,GPIO_PIN_SET);
Wait_us(10);
}
//读寄存器
void NRF_ReadReg(RF_HandlerTypeDef *hRF,uint8_t cmd,uint8_t *p_value,uint8_t data_length)
{
HAL_GPIO_WritePin(hRF->Gpio_SS,hRF->Gpio_SS_Pin,GPIO_PIN_RESET);
Wait_us(10);
HAL_SPI_Transmit(hRF->myspi,&cmd,1,HAL_MAX_DELAY);
HAL_SPI_Receive(hRF->myspi,p_value,data_length,HAL_MAX_DELAY);
Wait_us(10);
HAL_GPIO_WritePin(hRF->Gpio_SS,hRF->Gpio_SS_Pin,GPIO_PIN_SET);
Wait_us(10);
}
/**
* @brief 初始化NRF24L01模块
* @param hRF NRF24L01模块句柄
*/
void NRF_Init(RF_HandlerTypeDef *hRF)
{
uint8_t buf;
NRF_WriteReg(hRF,NRF24L01_REG_CONFIG|NRF24L01_CMD_REGISTER_W,&(hRF->DeviceMode),1); //配置CONFIG寄存器(使能电源,CRC等)
NRF_WriteReg(hRF,NRF24L01_REG_RF_CH|NRF24L01_CMD_REGISTER_W,&(hRF->Channel),1); //设置信道
NRF_WriteReg(hRF,NRF24L01_REG_EN_AA|NRF24L01_CMD_REGISTER_W,&(hRF->EnablePipeAck),1); //配置使能的管道的自动应答
NRF_WriteReg(hRF,NRF24L01_REG_EN_RXADDR|NRF24L01_CMD_REGISTER_W,&(hRF->EnablePipe),1); //配置使能的管道
buf=hRF->AddressSize>>1;
NRF_WriteReg(hRF,NRF24L01_REG_SETUP_AW|NRF24L01_CMD_REGISTER_W,&buf,1); //配置地址宽度
buf=(((hRF->RetryTime/250)-1)<<4)|((hRF->Max_Repet)&0x0F);
NRF_WriteReg(hRF,NRF24L01_REG_SETUP_RETR|NRF24L01_CMD_REGISTER_W,&buf,1); //配置自动重传间隔和最大计数
buf=hRF->Speed|hRF->Power;
NRF_WriteReg(hRF,NRF24L01_REG_RF_SETUP|NRF24L01_CMD_REGISTER_W,&buf,1); //配置传输速率和功率选项
NRF_WriteReg(hRF,NRF24L01_REG_RX_ADDR_P0|NRF24L01_CMD_REGISTER_W,(uint8_t*)&(hRF->Address_Pipe0),hRF->AddressSize); //设置接收地址0
NRF_WriteReg(hRF,NRF24L01_REG_RX_ADDR_P1|NRF24L01_CMD_REGISTER_W,(uint8_t*)&(hRF->Address_Pipe1),hRF->AddressSize); //设置接收地址1
for(uint8_t i=0;i<4;i++) //配置接收地址2~5
NRF_WriteReg(hRF,NRF24L01_CMD_REGISTER_W+NRF24L01_REG_RX_ADDR_P1+i,&hRF->Address_Pipex[i],1);
for(uint8_t i=0;i<6;i++) //配置0~5接收通道的数据长度
NRF_WriteReg(hRF,NRF24L01_CMD_REGISTER_W+NRF24L01_REG_RX_PW_P0+i,&hRF->PackageSize_Pipex[i],1);
HAL_GPIO_WritePin(hRF->Gpio_CE,hRF->Gpio_CE_Pin,GPIO_PIN_RESET); //默认进入接收模式下的待机模式
}
/**
* @brief 开启NRF24L01模块接收监听
* @param hRF NRF24L01模块句柄
*/
void NRF_StartReceive(RF_HandlerTypeDef *hRF)
{
uint8_t buf=(hRF->DeviceMode&0xFE)|RF_MODULE_WORKMODE_RECEIVE;
NRF_WriteReg(hRF,NRF24L01_REG_CONFIG|NRF24L01_CMD_REGISTER_W,&buf,1);
HAL_GPIO_WritePin(hRF->Gpio_CE,hRF->Gpio_CE_Pin,GPIO_PIN_SET); //接收数据
}
/**
* @brief 通过NRF24L01模块发送数据
* @param hRF NRF24L01模块句柄
* @param source 要发送的数据的首地址
* @param length 要发送的数据长度(最大32字节)
* @param DeviceAddress 数据要发往的地址
* @retval 如果发送成功,返回本次重新发送的次数,其它详见REMAND.md
*/
uint8_t NRF_SendData(RF_HandlerTypeDef *hRF,uint8_t *source,uint8_t length,uint64_t DeviceAddress)
{
uint8_t buf;
HAL_GPIO_WritePin(hRF->Gpio_CE,hRF->Gpio_CE_Pin,GPIO_PIN_RESET); //重置CE电平
Wait_us(10);
NRF_WriteReg(hRF,NRF24L01_CMD_REGISTER_W|NRF24L01_REG_TX_ADDR,(uint8_t*)&DeviceAddress,5);
NRF_WriteReg(hRF,NRF24L01_CMD_TX_PLOAD_W,source,length);
buf=((hRF->DeviceMode)&0xFE)|RF_MODULE_WORKMODE_SEND; //配置为发送模式
NRF_WriteReg(hRF,NRF24L01_CMD_REGISTER_W|NRF24L01_REG_CONFIG,&buf,1);
HAL_GPIO_WritePin(hRF->Gpio_CE,hRF->Gpio_CE_Pin,GPIO_PIN_SET); //拉高一次CE启动发送
Wait_us(20);
HAL_GPIO_WritePin(hRF->Gpio_CE,hRF->Gpio_CE_Pin,GPIO_PIN_RESET);
while(HAL_GPIO_ReadPin(hRF->Gpio_INT,hRF->Gpio_INT_Pin)); //等待发送完成
NRF_ReadReg(hRF,NRF24L01_CMD_REGISTER_R|NRF24L01_REG_STATUS,&buf,1); //读取到STATUS寄存器的值
NRF_WriteReg(hRF,NRF24L01_CMD_REGISTER_W|NRF24L01_REG_STATUS,&buf,1); //写1清除中断标志位
NRF_ReadReg(hRF,NRF24L01_CMD_REGISTER_R|NRF24L01_REG_OBSERVE_TX,&buf,1); //检查发送状态
if(buf&0xF0) //存在丢失的数据包(重发次数大于15),请求错误处理函数
{
NRF_ErrorDeal();
NRF_WriteReg(hRF,NRF24L01_REG_RF_CH|NRF24L01_CMD_REGISTER_W,&(hRF->Channel),1); //重置错误计数器(技术手册手册要求P59)
}
return buf&0x0F; //返回本次发送重传次数
}
/**
* @brief 读取寄存器,接收数据
* @param hRF NRF24L01模块句柄
* @param buffer 接收数据的缓冲区
* @param buffer 接收到的数据的长度
* @param channel 接收到的数据来自的通道号
* @retval 如果接收成功,返回NRF24L01_MSG_RX_SUCCESS,详见REMAND.md
*/
int8_t NRF_ReceiveData(RF_HandlerTypeDef *hRF,uint8_t *buffer,uint8_t *length,uint8_t *channel)
{
uint8_t rec=0,reg=0;
NRF_ReadReg(hRF,NRF24L01_CMD_REGISTER_R|NRF24L01_REG_STATUS,&rec,1); //读取到STATUS寄存器的值
NRF_WriteReg(hRF,NRF24L01_CMD_REGISTER_W|NRF24L01_REG_STATUS,&rec,1); //写1清除中断标志位
if(!(rec&0x40)) //数据准备好中断
return NRF24L01_MSG_RX_NOT_READY;
if((rec&0x0E)==0x0E) //接收缓冲区为空
return NRF24L01_MSG_RX_FIFO_EMPTY;
if((rec&0x0E)==0x0C) //未启用
return NRF24L01_MSG_RX_FAILED;
*channel=(rec&0x0E)>>1;
reg=(*channel)+NRF24L01_REG_RX_PW_P0; //计算出要读取的寄存器的地址
NRF_ReadReg(hRF,NRF24L01_CMD_REGISTER_R|reg,&rec,1); //获取当前包的大小
*length=rec;
NRF_ReadReg(hRF,NRF24L01_CMD_RX_PLOAD_R,buffer,rec); //读取数据包中的数据
return NRF24L01_MSG_RX_SUCCESS;
}
2万+

被折叠的 条评论
为什么被折叠?



