C8T6通过2.4G(NRF24L01)模块实现双向通信(二)

代码实现(文末附代码连接)

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

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值