NRF24L01+的使用
来源:互联网 发布:排畸b超数据看男女 编辑:程序博客网 时间:2024/09/21 06:33
这是数据手册上的一个图例,根据它得到一个粗略的流程图:
发射数据
1)首先将nRF24L01配置为发射模式
2)接着把接收节点地址TX_ADDR和有效数据TX_PLD按照时序由SPI口写入nRF24L01缓存区,TX_PLD必须在CSN为低时连续写入,而TX_ADDR在发射时写入一次即可,然后CE置为高电平并保持至少10μs,延迟130μs后发射数据;
3)若自动应答开启,那么nRF24L01在发射数据后立即进入接收模式,接收应答信号(自动应答接收地址应该与接收节点地址TX_ADDR一致)。如果收到应答,则认为此次通信成功,TX_DS置高,同时TX_PLD从TX
4)最后发射成功时,若CE为低则nRF24L01进入空闲模式1;
1)首先将nRF24L01配置为接收模式,接着延迟130μs进入接收状态等待数据的到来。
2)当接收方检测到有效的地址和CRC时,就将数据包存储在RX
3)若此时自动应答开启,接收方则同时进入发射状态回传应答信号。最后接收成功时,若CE变低,则nRF24L01进入空闲模式1
#define NRF24L01_READ_REG
#define NRF24L01_WRITE_REG
#define RD_RX_PLOAD
#define WR_TX_PLOAD
#define FLUSH_TX
#define FLUSH_RX
#define REUSE_TX_PL
#define NOP
#define CONFIG
#define EN_AA
#define EN_RXADDR
#define SETUP_AW
#define SETUP_RETR
#define RF_CH
#define RF_SETUP
#define STATUS
#define OBSERVE_TX
#define CD
#define RX_ADDR_P0
#define RX_ADDR_P1
#define RX_ADDR_P2
#define RX_ADDR_P3
#define RX_ADDR_P4
#define RX_ADDR_P5
#define TX_ADDR
#define RX_PW_P0
#define RX_PW_P1
#define RX_PW_P2
#define RX_PW_P3
#define RX_PW_P4
#define RX_PW_P5
#define FIFO_STATUS
初始化函数:
void NRF24L01SPI_Init( NRF_t * NRF)
{
NRF24L01_Write_Buf(NRF24L01_WRITE_REG+TX_ADDR,TX_ADDRESS,TX_ADR_WIDTH,NRF);
NRF24L01_Write_Buf(NRF24L01_WRITE_REG+RX_ADDR_P0,RX_ADDRESS,TX_ADR_WIDTH,NRF);
}
进入接收模式:
void NRF24L01_RX_Mode(NRF_t * NRF)
{
}
这里注意,根据第一张图可知,进入接收模式后,只要CE不为低,就一直处于接收模式,可以不停滴接收数据。
进入发射模式并发送数据:
void NRF24L01_TxPacket(u8* txbuf, NRF_t * NRF)
{
}
接收数据:
u8 NRF24L01_RxPacket(u8 * rxbuf, NRF_t * NRF)
{
中断处理函数
void EXTI9_5_IRQHandler(void)
{
u8 NEF24L01_State ;
if(EXTI_GetITStatus(EXTI_Line5) != RESET)
{
PrintfUsart1("%s","进入发送端中断");
PrintfUsart1("\r\n");
if(NRF1.NRF_SPI_Ready)
{
NEF24L01_State = NRF24L01_Read(STATUS,&NRF1);
if(NEF24L01_State&0x20)
{
NRF1.NRF_SPI_TX_Time++ ;
PrintfUsart1("%d",NRF1.NRF_SPI_TX_Time);
PrintfUsart1("\r\n");
}
if(NEF24L01_State&0x10)
{
NRF1.NRF_SPI_MAX_RT_Time++ ;
PrintfUsart1("%s","重发溢出次数:");
PrintfUsart1("%d",NRF1.NRF_SPI_MAX_RT_Time);
PrintfUsart1("\r\n");
}
NRF24L01_RW_Reg(NRF24L01_WRITE_REG + STATUS, NEF24L01_State,&NRF1);
NRF1.NRF_SPI_TX_Over = 0;
}
EXTI_ClearITPendingBit(EXTI_Line5);
}
- NRF24L01+的使用
- NRF24L01+的使用
- NRF24L01的使用
- [单片机]NRF24L01的使用
- STM32中nRF24L01的使用
- 无线串口NRF24L01的使用与调试
- nRF24L01无线 使用
- NRF24L01 无线通信模块使用
- 无线通讯项目使用NRF24l01
- NRF24L01使用注意
- 基于51单片机的NRF24L01的使用笔记
- 关于NRF24L01模块使用的部分个人总结
- nrf24l01+的接收代码
- NRF24L01的使用方法
- NRF24L01的通信距离
- NRF24L01的配置详解
- NRF24L01 的双向通信
- NRF24L01的通信距离
- hdu 2200
- 继承中的类作用域
- Java 抽奖算法
- 《开源框架那点事儿18》:为什么要先从测试用例编写和文档编写开始?
- 快速排序枢纽值(基元)选择方法(转载)
- NRF24L01+的使用
- VS2010使用时的不常见错误
- 【转】大并发下的高性能编程 – 改进的(用户态)自旋锁
- java多线程并发系列之锁的深入了解
- Subclipse logoEclipse的SVN插件 Subclipse编辑/纠错
- Using Raw Devices for Oracle Databases
- Replication 线程
- Maven依赖jar包的查询
- awk应用-获取文件的信息(二)