|
本帖最后由 正是河豚 于 2019-6-10 10:12 编辑
1、模式配置函数:MCU可通过SPI总线配置nRF24L01P寄存器使其工作在发送还是接收模式,配置函数如下。
1)初始化NRF24L01到接收模式,配置相关参数。
- /***************************************************************************
- * 描 述 : 初始化NRF24L01到接收模式,配置相关参数
- * 入 参 : 无
- * 返回值 : 无
- **************************************************************************/
- void Set_RxMode_MB(void)
- {
- CE_MB_LOW;
- //写RX节点地址
- NRF24L01_WriteBuf_MB(SPI_WRITE_REG+RX_ADDR_P0,(uint8_t*)RX_ADDRESS_MB,RX_ADDR_WIDTH);
- //使能通道0的自动应答
- NRF24L01_WriteReg_MB(SPI_WRITE_REG+EN_AA,0x01);
- //使能通道0的接收地址
- NRF24L01_WriteReg_MB(SPI_WRITE_REG+EN_RXADDR,0x01);
- //设置RF通道工作频率
- NRF24L01_WriteReg_MB(SPI_WRITE_REG+RF_CH,55);
- //选择通道0的有效数据宽度
- NRF24L01_WriteReg_MB(SPI_WRITE_REG+RX_PW_P0,RX_PLOAD_WIDTH);
- //设置TX发射参数,0db增益,250Kbps,低噪声增益开启
- NRF24L01_WriteReg_MB(SPI_WRITE_REG+RF_SETUP,0x26);
- //设置为接收模式PRX,使能PWR_UP、EN_CRC,使能CRC为2字节,开启RX_DR、TX_DS、MAX_RT中断引脚
- NRF24L01_WriteReg_MB(SPI_WRITE_REG+CONFIG, 0x0f);
- //CE为高,进入接收模式
- CE_MB_HIGH;
- }
2)初始化NRF24L01到发送模式,配置相关参数。
- /***************************************************************************
- * 描 述 : 初始化NRF24L01到发送模式,配置相关参数
- * 入 参 : 无
- * 返回值 : 无
- **************************************************************************/
- void Set_TxMode_MB(void)
- {
- CE_MB_LOW;
- //写TX节点地址
- NRF24L01_WriteBuf_MB(SPI_WRITE_REG+TX_ADDR,(uint8_t*)TX_ADDRESS_MB,TX_ADDR_WIDTH);
- //设置RX节点地址,使能ACK(应答)
- NRF24L01_WriteBuf_MB(SPI_WRITE_REG+RX_ADDR_P0,(uint8_t*)RX_ADDRESS_MB,RX_ADDR_WIDTH);
- //使能通道0的自动应答
- NRF24L01_WriteReg_MB(SPI_WRITE_REG+EN_AA,0x01);
- //使能通道0的接收地址
- NRF24L01_WriteReg_MB(SPI_WRITE_REG+EN_RXADDR,0x01);
- //设置自动重发间隔时间:750us+86us ;最大自动重发次数:5次
- NRF24L01_WriteReg_MB(SPI_WRITE_REG+SETUP_RETR,0x25);
- //设置RF通道工作频率
- NRF24L01_WriteReg_MB(SPI_WRITE_REG+RF_CH,55);
- //设置TX发射参数,0db增益,250Kbps,低噪声增益开启
- NRF24L01_WriteReg_MB(SPI_WRITE_REG+RF_SETUP,0x26);
- //设置为发送模式PTX,使能PWR_UP、EN_CRC,使能CRC为2字节,开启RX_DR、TX_DS、MAX_RT中断引脚
- NRF24L01_WriteReg_MB(SPI_WRITE_REG+CONFIG,0x0e);
- }
注:在配置发送、接收模式时,是否应答、重发间隔、通道工作频率、通信速率、是否CRC等都是可以根据自己需求配置的,上面举例仅是参考。
2、数据处理函数:nRF24L01P模块无线发送或接收也是通过操作nRF24L01P寄存器实现的,函数如下。
1)启动NRF24L01读取一次数据。
- /***************************************************************************
- * 描 述 : 启动NRF24L01读取一次数据
- * 入 参 : buf:待发送数据首地址
- * 返回值 : 0:未接收到数据;RX_OK:接收到数据
- **************************************************************************/
- uint8_t NRF24L01_RxPacket_MB(uint8_t *buf)
- {
- uint8_t state;
-
- state=NRF24L01_ReadReg_MB(STATUS); //读取状态寄存器的值
- NRF24L01_WriteReg_MB(SPI_WRITE_REG+STATUS,state); //清除RX_DR、TX_DS或MAX_RT中断标志
- if(state&RX_OK) //接收到数据
- {
- NRF24L01_ReadBuf_MB(RD_RX_PLOAD,buf,RX_PLOAD_WIDTH); //读取数据
- NRF24L01_WriteReg_MB(FLUSH_RX,0xff); //清除RX FIFO寄存器
- return RX_OK; //返回0x10
- }
- return 0; //没收到任何数据
- }
2)启动NRF24L01发送一次数据。
- /***************************************************************************
- * 描 述 : 启动NRF24L01发送一次数据
- * 入 参 : buf:待发送数据首地址
- * 返回值 : TX_OK:发送完成;MAX_TX:达到最大重发次数;0xff:发送失败
- **************************************************************************/
- uint8_t NRF24L01_TxPacket_MB(uint8_t *buf)
- {
- uint8_t state;
-
- CE_MB_LOW;
- NRF24L01_WriteBuf_MB(WR_TX_PLOAD,buf,TX_PLOAD_WIDTH); //写数据到TX BUF
- CE_MB_HIGH; //启动发送
- while(READ_NRF24L01_MB_IRQ!=0); //等待发送完成
- state=NRF24L01_ReadReg_MB(STATUS); //读取状态寄存器的值
- NRF24L01_WriteReg_MB(SPI_WRITE_REG+STATUS,state); //清除RX_DR、TX_DS或MAX_RT中断标志
- if(state&MAX_TX) //达到最大重发次数
- {
- NRF24L01_WriteReg_MB(FLUSH_TX,0xff); //清除TX FIFO寄存器
- return MAX_TX; //返回0x10
- }
- if(state&TX_OK) //发送完成
- {
- return TX_OK; //返回0x20
- }
- return 0xff; //发送失败,返回0xff
- }
注:模式配置函数和数据处理函数属于功能函数,常供外部调用。
3、nRF24L01P寄存器基本操作函数笔者常使用4个,罗列如下。
1)NRF24L01寄存器写函数。
- /***************************************************************************
- * 描 述 : NRF24L01寄存器写函数
- * 入 参 : regaddr:要写的寄存器地址;data:写入到寄存器的数据
- * 返回值 : 读取的状态值
- **************************************************************************/
- uint8_t NRF24L01_WriteReg_MB(uint8_t regaddr,uint8_t dat)
- {
- uint8_t status;
-
- CS_MB_LOW; //使能SPI传输
- status =SPI2_ReadWriteByte(regaddr); //发送寄存器地址
- SPI2_ReadWriteByte(dat); //写入寄存器的值
- CS_MB_HIGH; //禁止SPI传输
- return(status); //返回状态值
- }
2)NRF24L01寄存器读函数。
- /***************************************************************************
- * 描 述 : NRF24L01寄存器读函数
- * 入 参 : regaddr:要读取的寄存器地址
- * 返回值 : 读取的寄存器的值
- **************************************************************************/
- uint8_t NRF24L01_ReadReg_MB(uint8_t regaddr)
- {
- uint8_t reg_val;
-
- CS_MB_LOW; //使能SPI传输
- SPI2_ReadWriteByte(regaddr); //发送寄存器号
- reg_val=SPI2_ReadWriteByte(0XFF); //读取寄存器内容
- CS_MB_HIGH; //禁止SPI传输
- return(reg_val); //返回读取的值
- }
3)从指定地址读出指定长度的数据。
- /***************************************************************************
- * 描 述 : 从指定地址读出指定长度的数据
- * 入 参 : pBuf:读出数据的存放地址;datlen:读出的数据字节数
- * 返回值 : 读取的寄存器的值
- **************************************************************************/
- uint8_t NRF24L01_ReadBuf_MB(uint8_t regaddr,uint8_t *pBuf,uint8_t datlen)
- {
- uint8_t status,temp;
- CS_MB_LOW; //使能SPI
- status=SPI2_ReadWriteByte(regaddr); //发送寄存器值,并读取状态值
- for(temp=0;temp<datlen;temp++)
- {
- pBuf[temp]=SPI2_ReadWriteByte(0XFF); //读出数据
- }
- CS_MB_HIGH; //禁止SPI
- return status; //返回读到的状态值
- }
4)向指定地址写入指定长度的数据。
- /***************************************************************************
- * 描 述 : 向指定地址写入指定长度的数据
- * 入 参 : pBuf:读出数据的存放地址;datlen:读出的数据字节数
- * 返回值 : 读取的状态寄存器值
- **************************************************************************/
- uint8_t NRF24L01_WriteBuf_MB(uint8_t regaddr, uint8_t *pBuf, uint8_t datalen)
- {
- uint8_t status,temp;
- CS_MB_LOW; //使能SPI
- status = SPI2_ReadWriteByte(regaddr); //发送寄存器值,并读取状态值
- for(temp=0; temp<datalen; temp++)
- {
- SPI2_ReadWriteByte(*pBuf++); //写入数据
- }
- CS_MB_HIGH; //禁止SPI
- return status; //返回读到的状态值
- }
4、nRF24L01P寄存器基本操作函数使用的SPI读写函数是根据MCU不同而不同,可以使用硬件SPI,也可以使用模拟SPI。此处不详述。
5、附件是基于艾克姆IK-ZET6的开发板关联nRF24L01P模块进行收发的例程,仅供参考。
|
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有账号?立即注册
x
|