nRF24L01学习(2)

nRF24L01学习(2)

时间: 2020年10月~2021年2月
设备: 借的室友MiniSTM32、nRF24L01无线模块
语言: C语言

前言

用树莓派和Python搞硬件要求的水平过高,这次换成了单片机和C语言,单片机也是第一次接触,单是学习单片机的运用就花了不少时间,所以这次模块功能的实现,最大的收获就是单片机的学习和了解。

遇到的问题

nRF24L01模块的基本原理和使用基本没有问题了,遇到的问题基本都是与单片机相关的。唯一与nRF24L01模块相关的问题就是“接收端检测到了载波信号但是接收缓冲区里没有数据”,具体体现就是发送端成功后接收端的CD寄存器值为1,STATUS寄存器没有接收中断产生。

最后经过对代码的仔细分析,发现了问题所在。因为大部分寄存器的配置都是借鉴网上的数据,而网上的实验做的都是自带应答的收发,CONFIG寄存器中CRC检验是要使能的。而我为了方便分辨发送端出错还是接收端出错,关闭了自动应答,所以不应该使能CRC检验。CONFIG寄存器的值,接收端从0x0e改为0x02,发送端从0x0f改为0x03,之后就可以正常接收数据了。

十分怀疑上次接收不到数据也是这个原因。

相关代码


#include "sys.h"
#include "usart.h"
#include "delay.h"
#include "led.h"
#include "key.h"
#include "nrf24l01.h"
#include "stm32f10x_gpio.h"

int main(void)
{
   
	u8 Fifo1_Status0,Fifo1_Status1,Fifo2_Status0,Fifo2_Status1;
	int i;
	char data[32];
	unsigned char RxBuf[5];
	unsigned char Addr1[5]={
   0xE7,0xE7,0xE7,0xE7,0xE7};
	unsigned char Addr2[5]={
   0xE7,0xE7,0xE7,0xE7,0x77};
	Stm32_Clock_Init(9); 		//系统时钟设置
	delay_init(72);	     		//延时初始化 
	uart_init(72,115200);		//串口初始化为115200
	LED_Init();		  	 		//初始化与LED连接的硬件接口
	GPIO_nrf_Init();
	
	nRF1_Flush_Tx_Fifo();
	nRF2_Flush_Tx_Fifo();
	Fifo1_Status0=nRF1_Read_Reg(FIFO_STATUS);
	Fifo2_Status0=nRF2_Read_Reg(FIFO_STATUS);
	
	SPI1_SET_CE_LOW();
	SPI2_SET_CE_LOW();
	
	nRF1_Init(0x02,0x00,0x03,0x03,0x00,0x0F,0x0F,Addr2,Addr1,5);
	nRF2_Init(0x03,0x00,0x03,0x03,0x00,0x0F,0x0F,Addr1,Addr2,5);
	
	for(i=0;i<10000000;i++);		//上电1.5ms以上
	
	while(1)
	{
   
		nRF1_Check();
		nRF2_Check();
		
		SPI1_SET_CE_HIGH();
		SPI2_SET_CE_HIGH();
		
		for(i=0;i<100000;i++);			//大于130us
		if(USART_RX_STA&0x8000)
		{
   
			getdata(data);
		}
		printf("data%d",data[0]);
		printf("Fifo1_Status0:%x\n\r\n",Fifo1_Status0);
		nRF1_Write_Tx_Payload_Ack(data,32);
		Fifo1_Status1=nRF1_Read_Reg(FIFO_STATUS);
		printf("Fifo1_Status1:%x\n\r\n",Fifo1_Status1);
		
		for(i=0;i<100000;i++);			//大于130us
		
		printf("Fifo2_Status0:%x\n\r\n",Fifo2_Status0);
		Fifo2_Status1=nRF2_Read_Reg(FIFO_STATUS);
		printf("Fifo2_Status1:%x\n\r\n",Fifo2_Status1);
		
		nRF2_Read_Rx_Payload(RxBuf);
		
		printf("接收到的数据:%s\n\r\n",RxBuf);
		
		SPI1_SET_CE_LOW();
		SPI2_SET_CE_LOW();
	}
}

#ifndef __NRF24L01_H
#define __NRF24L01_H
#include "sys.h"
#include "delay.h"
#include "usart.h"

//nRF24L01操作指令常量
#define NRF_READ_REG        0x00    // 读配置寄存器, 低 5 位为寄存器地址
#define NRF_WRITE_REG       0x20    // 写配置寄存器, 低 5 位为寄存器地址
#define RD_RX_PLOAD         0x61    // 读取 Rx 有效数据, 1-32 字节
#define WR_TX_PLOAD         0xA0    // 写 Tx 有效数据, 1-32 字节
#define FLUSH_TX            0xE1    // 清除 Tx FIFO 寄存器
#define FLUSH_RX            0xE2    // 清除 Rx FIFO 寄存器
#define REUSE_TX_PL         0xE3    // 重新使用上一包数据, CE为高数据包被不断发送
#define R_RX_PL_WID         0x60
#define NOP                 0xFF    // 用来读取状态寄存器
#define W_ACK_PLOAD         0xA8
#define WR_TX_PLOAD_NACK    0xB0

//nRF24L01寄存器地址
#define CONFIG          	0x00
#define EN_AA           	0x01    // 使能自动应答功能 Bit0 - 5, 对应通道 0 - 5
#define EN_RXADDR       	0x02    // 接收地址允许, Bit0 - 5, 对应通道 0 - 5
#define SETUP_AW        	0x03    // 设置地址宽度 ( 所有数据通道 ) : Bit0-1: 00 3字节   01 4字节  10 5字节
#define SETUP_RETR      	0x04    // 建立自动重发, Bit0-3: 自动重发计数, Bit4-7: 自动重发延时 250 * x + 86us
#define RF_CH           	0x05    // RF 通道, Bit0-6: 工作通道频率
#define RF_SETUP        	0x06    // RF 寄存器, Bit3: 传输速度 (0: 1 Mbps, 1: 2 Mbps), Bit1-2: 发射功率, Bit0: 低噪声发大器增益
#define STATUS          	0x07    // 状态寄存器, Bit0: RX FIFO 满标志, Bit1-3: 接收数据通道号 (最大: 6 ), Bit4: 达到最多次重发, Bit5: 数据发送完成中断, Bit6: 接收数据中断
#define OBSERVE_TX      	0x08    // 发送检测寄存器, Bit4-7: 数据包丢失计数器, Bit0-3: 重发计数器
#define CD              	0x09    // 载波检测寄存器, Bit0: 载波检测
#define RX_ADDR_P0      	0x0A    
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值