NRF24L01模块的使用(基于STM32 HAL库)
新文章:https://blog.youkuaiyun.com/Cloud_dm/article/details/144947329?spm=1001.2014.3001.5502
新文章:https://blog.youkuaiyun.com/Cloud_dm/article/details/144947329?spm=1001.2014.3001.5502
新文章:https://blog.youkuaiyun.com/Cloud_dm/article/details/144947329?spm=1001.2014.3001.5502
使用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 0x20
PackageSize_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 0x20
Max_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 0x00
Speed设置发射时通信速率大小。
#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()处理错误。