上篇博客链接:https://blog.youkuaiyun.com/DIVIDADA/article/details/130599974?spm=1001.2014.3001.5501
以下单片机例程都是基于STM32 HAL库,在文档末尾,我会提供参考博客和源码程序的链接。
通讯实例与代码实现
在CubeMx中配置单片机时钟、SPI通讯接口、NRF24L01接口等,并生成Keil工程

将NRF24L01的驱动程序的.c文件和.h文件添加到工程目录下,重新编译程序

nrf24l01实现一对一单向通讯
1.流程分析:
A端:
- 设置成发送模式(TX_Mode(0))
- 每隔100ms发送一次数据(NRF24L01_TxPacket())
B端:
- 设置成接收模式(RX_Mode(0),B端地址设置要同A端一致)
- 循环判断是否接受到数据(NRF24L01_RxPacket())
2.源码程序
A端:
//....................
uint8_t tx_buf[8];
//....................
int main(void)
{
//...................
NRF24L01_Init(); //NRF24L01初始化
while(NRF24L01_Check()); //检测NRF24L01模块是否在位
TX_Mode(0); //将NRF24L01模块设置为发送模式,传入参数0设置地址
//....................
while (1)
{
/* USER CODE END WHILE */
/* USER CODE BEGIN 3 */
HAL_Delay(100);
if(NRF24L01_TxPacket(tx_buf)==0X20) //NRF24L01模块发送数据并判断是否发送成功
{
HAL_GPIO_TogglePin(LED_GPIO_Port,LED_Pin); //若发送成功,LED电平反转
tx_buf[0]++; //若发送成功,tx_buf[0]自增加
}
}
/* USER CODE END 3 */
}
B端:
//....................
uint8_t rx_buf[8];
//....................
int main(void)
{
//...................
NRF24L01_Init(); //NRF24L01初始化
while(NRF24L01_Check()); //检测NRF24L01模块是否在位
RX_Mode(0); //将NRF24L01模块设置为发送模式,传入参数0设置地址(同发送模块地址相同)
//....................
while (1)
{
/* USER CODE END WHILE */
/* USER CODE BEGIN 3 */
if(NRF24L01_RxPacket(rx_buf)==0X00) //NRF24L01模块接收数据并判断是否接收成功
{
HAL_GPIO_TogglePin(LED_GPIO_Port,LED_Pin); //若接收成功,LED电平反转
}
}
/* USER CODE END 3 */
}
3.实验结果
在B端程序中进入debug模式,将rx_buf添加到watch窗口中,可以观察到rx_buf[0]值不断增加

nrf24l01实现一对一双向通讯
1.流程分析:
A端:
- 设置成发送模式(TX_Mode(0))
- 发送一次数据(NRF24L01_TxPacket())
- 发送完成立马转变成接收模式(RX_Mode(0))
- 等待接收数据成功(while(READ_NRF24L01_IRQ!=0))
- 接收数据成功后立马转换发送模式(TX_Mode(0))
- 进入下一次收发数据,如此循环
B端:
- 设置成接收模式(RX_Mode(0),B端地址设置要同A端一致)
- 循环判断是否接受到数据(NRF24L01_RxPacket())
- 接收到数据成功后立马转换成发送模式(TX_Mode(0))
- 发送成后立马转换成接收模式(RX_Mode(0)),方便下一次接收
实际上这种双向收发的方式对A、B端的时序要求非常高,通俗点说就是A端处于发送模式并发送数据的时候,B端一定要处于接收模式,否则就是两个哑巴在通讯。所以为了保证通讯的稳定性,需要对上述的通讯流程进行一定的优化,具体优化的地方就是:A端在等待接收数据成功的时候(while(READ_NRF24L01_IRQ!=0)计数等待,若计数值超过阈值,再发送一次,最多发送10次;B端在发送数据时候计数,若计数值超过阈值还未发送成功,立马转变成接收模式。具体实现方法可以见下面的源程序。
经过测试,这种双向收发机制,通讯十分稳定(NICE)
2.源码程序
A端:
//....................
uint8_t tx_buf[8];
uint8_t rx_buf[8];
void NRF_Intercommunication(uint8_t Seq_Nrf,

本文详细介绍了如何使用STM32HAL库配合nrf24l01模块实现一对一单向、一对双向往返以及一对多双向通讯。通过配置单片机时钟、SPI接口及NRF24L01接口,结合具体的C代码示例,展示了通讯流程和关键代码,包括发送模式与接收模式的切换、错误处理机制以及通讯稳定性优化。实验结果显示通讯过程稳定,可以通过调试观察数据传输情况。
最低0.47元/天 解锁文章
1824

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



