常见错误:
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_RD(1:IRQ引脚不显示RX_RD中断) (0:RX_RD中断时,IRQ输出低电平) |
MASK_TX_DS | 5 | 0 | R/W | 可屏蔽中断TX_RD(1:IRQ引脚不显示TX_DS中断) (0:TX_DS中断时,IRQ输出低电平) |
MASK_MAX_RT | 4 | 0 | R/W | 可屏蔽中断MAX_RT(1:IRQ引脚不显示MAX_RT中断) (0:MAX_RT中断时,IRQ输出低电平) |
EN_CRC | 3 | 1 | R/W | CRC使能(如果EN_AA中任意一位设置为高,则EN_CRC强迫为高) |
CRCO | 2 | 0 | R/W | CRC模式(1:16位CRC校验 0:8位CRC校验) |
PWR_UP | 1 | 0 | R/W | 上电/掉电模式设置位(1:上电 0:掉电) |
PRIM_RX | 0 | 0 | R/W | 接收/发送模式设置位(1:接收模式 0:发送模式) |
开启自应答就是开启ENHANCE模式
这个自动应答虽说是发送数据给对方但是不会存入FIFO只会让enhanced模式下的接收端接受状态寄存器置一![](https://i-blog.csdnimg.cn/direct/447c152baab14d5e983bc221de625ab6.png)
开启接收通道
设置地址宽度会是你的地址位数改变一般默认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:未使用 111:RX_FIFO寄存器为空 |
TX_FULL | 0 | 0 | R/W | TX_FIFO寄存器满标志: 1:TX_FIFO寄存器满 0:TX_FIFO寄存器未满 |