HAL库源码移植与使用之spi驱动NRF24L01与常见错误

常见错误:

1.你的发送端发送地址与接收地址和接收端接收地址三者不一样

因为ENHANCED自动回应模式流程,发送地址是发送端根据自己发送地址,对接收端(发送端发送地址指向的对象)发送数据,接收端地址接收地址数据,并以自己的接收地址为发送地址自动回应对方,这样就可以知道是否接收正常

2.无线电频率不一样

虽说一个发送设备的接收发送通道频率能不一样,但相互通信的两设备,发送端要和接收端一样的无线电频率

3.是enhanced模式却不是自动发送应答

CE可选择芯片是否启动

 上面是三个会触发中断信号的条件,FIFO是专门存储要发送或接收字节的存储区,发送和接收各一个独立的。

不能太快,7-8M就好

 spi下具体时序:

从这可以看出它属于SPI工作模式零,要注意!!!!!!!!

 NRF24L01命令字节有两种,

1:要指定地址的命令就需要一个字节既有地址又有命令,一般前三位为命令读写,后5位为地址。如上图读寄存器命令就是0x20或上寄存器地址,那就代表前三位为0x2的高三位001后面五位全由或的对象寄存器地址决定

2:不需要地址的命令比如擦除与读取FIFO

示例代码:

工作模式:

FIFO一共分为三级每级32byte

发送模式前者是一把CE拉高就启动发送全部FIFO的三级

发送模式后者是一次下降沿发送一级FIFO的数据,要给三次才全部发送

代码用的前者

 发送模式有两个,前者被选择后发送完毕时会进入待机模式II

后者发送完毕后会进入待机模式l

NRF24L01数据处理模式:

 选择打开自动应答功能,就说明你打开了Enhanced ShockBurstTM模式他俩的区别也就这是这里的不同导致的

代码里只展示了利用通道零的数据传输

地址与通道:

注意:发送端的发送接收地址与接收端的接收地址要一模一样

接收通道一共最多有6个

其中通道零是40位自身地址,通道1-5是八位自身地址加32为共用地址,

自身地址就是自己可以随便改的,共用地址则不行是固定的

发送模式配置:

示例代码:

发送模式初始化

//发送模式初始化
void nrf24l01_tx_mode( void )
{	
	NRF24L01_CE ( 0 );
	
	/*  发去哪里? */	
    	nrf24l01_write_buf ( NRF_WRITE_REG + TX_ADDR, (uint8_t *)TX_ADDRESS, TX_ADR_WIDTH );
	/*  哪里接收应答信号? */	
	nrf24l01_write_reg ( NRF_WRITE_REG + RX_ADDR_P0, (uint8_t *)TX_ADDRESS, TX_ADR_WIDTH ); 
	nrf24l01_write_reg ( NRF_WRITE_REG + EN_AA, 0x01);		/* 使能通道0的自动应答 */ 
	nrf24l01_write_reg ( NRF_WRITE_REG + EN_RXADDR, 0x01);	/* 使能通道0的接收地址 */ 
	/*  发送失败如何处理? */	
	nrf24l01_write_reg ( NRF_WRITE_REG + SETUP_RETR, 0x1a);	/* 设置自动重发间隔时间 */ 
	/*  无线条件怎么样?*/
	nrf24l01_write_reg ( NRF_WRITE_REG + RF_CH, 0x01); 		/* 设置RF通信频率 */ 
	nrf24l01_write_reg ( NRF_WRITE_REG + RF_SETUP, 0x01); 	/* 设置TX发射参数 */
	/*  如何配置身份?*/
	nrf24l01_write_reg ( NRF_WRITE_REG + CONFIG, 0x0e);		/* 配置基本工作模式参数 */ 

    	NRF24L01_CE ( 1 );			
}

 配置完FIFO后,启动发送

//启动发送
uint8_t nrf24l01_tx_packet(uint8_t *ptxbuf)
{	
    	uint8_t sta, rval = 0xff;

	NRF24L01_CE ( 0 );			
    	nrf24l01_write_buf ( WR_TX_PLOAD, ptxbuf, TX_PLOAD_WIDTH );	/* 写数据到TX_FIFO */
    	NRF24L01_CE ( 1 );			/* 启动传输 */

	while (NRF24L01_IRQ != 0);

	sta = nrf24l01_read_reg(STATUS);					 /* 读取状态寄存器的值 */
	nrf24l01_write_reg(NRF_WRITE_REG + STATUS, sta);	 /* 清除TX_DS或MAX_RT中断标记 */

 	if ( sta & MAX_TX) { 	 /* 达到最大重发次数 */
		nrf24l01_write_reg(FLUSH_TX, 0xff);
		rval = 1;	
	}	
	if ( sta & TX_OK)		rval = 0;	/* 发送完成 */

    	return rval;		/* 返回结果*/
}

接受模式配置:

接收模式初始化 

//接收模式初始化
void nrf24l01_rx_mode( void )
{	
	NRF24L01_CE ( 0 );
	
	/*  接收谁的数据 */	
    	nrf24l01_write_buf ( NRF_WRITE_REG + RX_ADDR_P0, (uint8_t *)RX_ADDRESS, RX_ADR_WIDTH )	nrf24l01_write_reg ( NRF_WRITE_REG + EN_RX_ADDR, 0x01); 	/* 使能通道0的接收地址 */ 
	nrf24l01_write_reg ( NRF_WRITE_REG + RX_PW_P0, RX_PLOAD_WIDTH); 	/* 选择通道0的有效数据宽度 */ 

	/*  如何发送应答信号? */
	nrf24l01_write_reg ( NRF_WRITE_REG + EN_AA, 0x01);		/* 使能通道0的自动应答 */ 

	/*  无线条件怎么样?*/
	nrf24l01_write_reg ( NRF_WRITE_REG + RF_CH, 0x01); 		/* 设置RF通信频率 */ 
	nrf24l01_write_reg ( NRF_WRITE_REG + RF_SETUP, 0x01);	/* 设置TX发射参数 */

	/*  如何配置身份?*/
	nrf24l01_write_reg ( NRF_WRITE_REG CONFIG, 0x0f); 		/* 配置基本工作模式参数 */

    	NRF24L01_CE ( 1 );			
}

 接收模式启动

//接收模式启动
uint8_t nrf24l01_rx_packet(uint8_t *prxbuf)		 /* return 0:succeed	1:fail */
{	
    	uint8_t sta, rval = 1;

	sta = nrf24l01_read_reg(STATUS);					 /* 读取状态寄存器的值 */
	nrf24l01_write_reg(NRF_WRITE_REG + STATUS, sta);	 /* 清除RX_DS标记 */

 	if ( sta & RX_OK)	 	/* 接收到数据 */
	{ 	 		
		nrf24l01_read_buf(RD_RX_PLOAD, prxbuf, RX_PLOAD_WIDTH); 	/* 读取数据 */
		nrf24l01_write_reg(FLUSH_RX, 0xff);	 /* 清除RX_FIFO */
		rval = 0;	
	}	

    	return rval;		/* 返回结果*/
}

地址

寄存器名字

功能

0x00

CONFIG

设置24L01工作模式

0x01

EN_AA

设置接收通道的自动应答

0x02

EN_RXADDR

使能接收通道地址

0x04

SETUP_RETR

设置自动重发数据时间和次数

0x05

RF_CH

设置工作通道频率

0x06

RF_SETUP

配置发射参数

0x07

STATUS

状态寄存器,用来判定工作状态

0x0A

RX_ADDR_P0

设置接收通道0地址

0x10

TX_ADDR

设置发送地址(先写低字节)

0x11

RX_PW_P0

设置接收通道0的有效数据宽度

参数

复位值

类型

描述

Reserved

7

0

R/W

保留位

MASK_RX_DR

6

0

R/W

可屏蔽中断RX_RD1IRQ引脚不显示RX_RD中断)

                                    (0RX_RD中断时,IRQ输出低电平)

MASK_TX_DS

5

0

R/W

可屏蔽中断TX_RD1IRQ引脚不显示TX_DS中断)

                                    (0TX_DS中断时,IRQ输出低电平)

MASK_MAX_RT

4

0

R/W

可屏蔽中断MAX_RT1IRQ引脚不显示MAX_RT中断)

                                       (0MAX_RT中断时,IRQ输出低电平)

EN_CRC

3

1

R/W

CRC使能(如果EN_AA中任意一位设置为高,则EN_CRC强迫为高)

CRCO

2

0

R/W

CRC模式(116CRC校验    08CRC校验)

PWR_UP

1

0

R/W

上电/掉电模式设置位(1:上电    0:掉电)

PRIM_RX

0

0

R/W

接收/发送模式设置位(1:接收模式    0:发送模式)

开启自应答就是开启ENHANCE模式 

 这个自动应答虽说是发送数据给对方但是不会存入FIFO只会让enhanced模式下的接收端接受状态寄存器置一

 开启接收通道

 设置地址宽度会是你的地址位数改变一般默认11 40位

设置这个可以在发送消息后没收到回讯认为发送失败时 自动重新发送可以设置重新发送次数和用公式算重新发送间隔时间

 可以配置发射频率,发射端发送频率与接收端接收频率要一致(用公式算),但发送端接收端自己的发送频率与接收频率可以不一样

射频数据传输速率与射频频率不一样,射频频率是数据介质,可以理解为波形峰值与周期和波长, 无限速率是指发送数据字节时发送时的位间隔时间(类似波特率只是快,但bootloader可以支持所有波特率)

参数

复位值

类型

描述

CONT_WAVE

7

0

R/W

高电平时,可使载波连续传输

Reserved

6

0

R/W

只允许写‘0

RF_DR_LOW

5

0

R/W

设置射频数据速率250kbps(结合RF_DR_HIGH查看)

PLL_LOCK

4

0

R/W

PLL_LOCK允许,仅用于测试模式

RF_DR_HIGH

3

1

R/W

RF_DR_LOW决定传输速率 [RF_DR_LOW, RF_DR_HIGH] :

‘ 00 ’: 1Mbps                             ‘ 01 ’: 2Mbps

‘ 10 ’: 250kbps                         ‘ 11 ’: 保留

RF_PWR

2:1

11

R/W

设置射频输出功率

‘00’: -18dBm                          ‘01’: -12dBm

‘10’: -6dBm                            ‘11’: 0dBm

Obsolete

0

不用关心

 

参数

复位值

类型

描述

Reserved

7

0

R/W

保留位

RX_DR

6

0

R/W

接收数据标记,收到数据后置1。写1清除中断

TX_DS

5

0

R/W

数据发送完成标记,如果工作在自动应答模式,则必须收到ACK才会置1。写1清除中断

MAX_RT

4

0

R/W

达到最大重发次数标志。写1清除中断(如果MAX_RX中断产生则必须清除后系统才能进行通信)

RX_P_NO

3:1

111

R/W

接收数据通道:

000 ~ 101:数据通道号   

110:未使用                            111RX_FIFO寄存器为空

TX_FULL

0

0

R/W

TX_FIFO寄存器满标志:

1TX_FIFO寄存器满            0TX_FIFO寄存器未满

要根据前面设定的地址宽度来填: 

通道零是自己单独配

 通道1-5是由通道1寄存器来配高32位地址,只有低八位是自己通道寄存器来配

  • 8
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

广药门徒

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值