代码实现(文末附代码连接)
main.c函数
// An highlighted block
int main()
{
u8 mode=0;
//u8 mode=1;
u8 rx_buf[33]="he bei ke ji da xue";
SysTick_Init(72);
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); //中断优先级分组 分2组
LED_Init();
USART1_Init(9600);
NRF24L01_Init();
OLED_Init(); // 初始化OLED
OLED_Clear(); // 清屏
OLED_ShowString(0, 0, "2.4G Telecontrol");
//----------------------------
//有这么多的 检测函数了,可以自己写一个检测OLED的函数***
//----------------------------
while(NRF24L01_Check()) //检测NRF24L01是否存在
{
OLED_ShowString(0, 2, "2G4 ERROR");
}
OLED_ShowString(0, 2, "2G4 OK");
if(mode==1)
{
NRF24L01_TX_Mode();//先设置为发送函数
while(1)
{
NRF24L01_TxPacket(rx_buf);
// if(NRF24L01_TxPacket(rx_buf)==TX_OK)//这个是检测函数,检测到是否发送。
// {
//
// led2=!led2;
//
// }
}
}
//---------
if(mode==0)
{
NRF24L01_RX_Mode();
while(1)
{
if(NRF24L01_RxPacket(rx_buf)==0) //接收到数据显示
{
rx_buf[32]='\0';
printf("收到的数据是:%s\r\n",rx_buf);
if(strcmp((const char*)rx_buf,"he bei ke ji da xue")==0)
led2=!led2; //打开LED1
// if(rx_buf[0]='h')
// {
// led2=!led2; //一秒钟改变一次状态
// }
}
}
}
}
在主函数中有一个NRF24L01_Check()函数,这个函数的大致思路如下:
在同一个寄存器中写入数据(比如u8 buf[5]={0XA5,0XA5,0XA5,0XA5,0XA5}),然后再读出来,判断两者是否一样,如果一样,那么模块正常,否则检测失败
当初我有个疑问,因为SPI是写和读是同步的,那这个函数在写入的时候,肯定会返回一个数据,那再要去读的时候那?这个过程具体是怎么实现的?
在底层代码中,写的很清楚:
(1)写入u8 buf[5]={0XA5,0XA5,0XA5,0XA5,0XA5}时,肯定会有一个返回值,但是因为我是写入数据,返回的东西我不管是什么,不要了;
(2)当我要读的时候(注意,读数据的位置一定要和写数据的位置一样),我循环发字节(0xff)去触发,然后得到想要的返回值。而因为寄存器位置相同,返回值恰好是我刚刚写入的数据(这个也仅仅是我自己的理解^ 0 ^)。
这样基本就实现了。
如果你想实现其他功能的话,也可以往上面加,
①比如我判断收到的数据是否是” he bei ke ji da xue”,若果接受正确则让led状态反转。
②我现在发送和接受的是固定的值,那我也可以发送变量,比如加一个dht11温湿度采集模块,将温湿度实时上传。
③在②的基础上,我也可以将接受到的温湿度显示在OLED屏或者串口屏上
ZH 每一天! 加油。
代码链接: link
提取码:hlon