NRF24L01收发测试程序
来源:互联网 发布:windows vista 镜像 编辑:程序博客网 时间:2024/05/21 17:34
调试好了NRF24L01的程序,前几天一直接收不到,今天发现是寄存器设置错误,更新最新调试好的程序:
接收:
#include "include.h"unsigned char sta; // 状态变量 unsigned char rx_dr_flag;//接收成功标志位#define RX_DR (sta & 0x40) // 接收成功中断标志#define TX_DS (sta & 0x20) // 发射成功中断标志#define MAX_RT (sta & 0x10) // 重发溢出中断标志sbit IRQ = P0^0;sbit MISO = P0^1;sbit MOSI = P0^2;sbit SCK = P0^3;sbit CSN = P0^4;sbit CE = P0^5;unsigned char const TX_ADDRESS[TX_ADR_WIDTH]= {0x34,0x43,0x10,0x10,0x01};//接收地址unsigned char const RX_ADDRESS[RX_ADR_WIDTH]= {0x34,0x43,0x10,0x10,0x01};//本地地址/********************************************************************************** 函数名称:void Init_io(void)** 功 能:初始化io口** 调用清单:无** 参 数:1)无** 返 回 值:无** 注 意:1) * 2) *********************************************************************************/void Init_NRF24L01(void){CE = 0; // 待机CSN = 1; // SPI禁止SCK = 0; // SPI时钟置低IRQ = 1; // 中断复位}/********************************************************************************** 函数名称:unsigned char SPI_RW(unsigned char byte) ** 功 能:写时序** 调用清单:无** 参 数:1)byte: 写入的数据** 返 回 值:byte** 注 意:1) * 2) *********************************************************************************/unsigned char SPI_RW(unsigned char byte){ unsigned char bit_ctr;for(bit_ctr = 0; bit_ctr < 8; bit_ctr++) { MOSI = (0x80 & byte); byte <<= 1; SCK = 1;byte |= MISO;SCK = 0; }return (byte);}/********************************************************************************** 函数名称:unsigned char SPI_RW_Reg(unsigned char reg, unsigned char value) ** 功 能:设置寄存器的值** 调用清单:1)unsigned char SPI_RW(unsigned char byte)** 参 数:1)reg : 待设置寄存器地址 2)value: 设置寄存器的值** 返 回 值:status** 注 意:1) * 2) *********************************************************************************/unsigned char SPI_RW_Reg(unsigned char reg, unsigned char value){ unsigned char status; CSN = 0; status = SPI_RW(reg); SPI_RW(value); CSN = 1; return (status);}/********************************************************************************** 函数名称:unsigned char SPI_Read(unsigned char reg)** 功 能:读取寄存器中的值** 调用清单:1)unsigned char SPI_RW(unsigned char byte)** 参 数:1)reg: 待读取寄存器的地址** 返 回 值:1)reg_val: 读取的值** 注 意:1) * 2) *********************************************************************************/unsigned char SPI_Read(unsigned char reg){ unsigned char reg_val; CSN = 0; SPI_RW(reg); reg_val = SPI_RW(0); CSN = 1; return (reg_val);}/********************************************************************************** 函数名称:unsigned char SPI_Read_Buf(unsigned char reg, unsigned char *pBuf, unsigned char bytes)** 功 能:在接收时读取FIFO缓冲区中的值** 调用清单:1)unsigned char SPI_RW(unsigned char byte)** 参 数:1)reg : 寄存器地址 2)pBuf : 待读取的数据地址 3)bytes: 读出数据的个数** 返 回 值:status: 寄存器状态** 注 意:1) * 2) *********************************************************************************/unsigned char SPI_Read_Buf(unsigned char reg, unsigned char *pBuf, unsigned char bytes){ unsigned char status; unsigned char byte_ctr; CSN = 0; status = SPI_RW(reg); for(byte_ctr = 0; byte_ctr < bytes; byte_ctr++) { pBuf[byte_ctr] = SPI_RW(0); } CSN = 1; return (status);}/********************************************************************************** 函数名称:unsigned char SPI_Write_Buf(unsigned char reg, unsigned char *pBuf, unsigned char bytes)** 功 能: 把数组里的数放到发射FIFO缓冲区中去** 调用清单:1)unsigned char SPI_RW(unsigned char byte)** 参 数:1)reg : 寄存器地址 2)pBuf : 待写入数据地址 3)bytes: 读出字节的个数** 返 回 值:status: 寄存器状态** 注 意:1) * 2) *********************************************************************************/unsigned char SPI_Write_Buf(unsigned char reg, unsigned char *pBuf, unsigned char bytes){ unsigned char status; unsigned char byte_ctr; CSN = 0; status = SPI_RW(reg); Delay_Us(10); for(byte_ctr = 0; byte_ctr < bytes; byte_ctr++) { SPI_RW(*pBuf++); } CSN = 1; return (status);}/********************************************************************************** 函数名称:void RX_Mode(void)** 功 能:设置NRF24L01为接收方式** 调用清单:1)unsigned char SPI_Write_Buf(unsigned char reg, unsigned char *pBuf, unsigned char bytes)*2)unsigned char SPI_RW_Reg(unsigned char reg, unsigned char value)* 参 数:无** 返 回 值:无** 注 意:1) * 2) *********************************************************************************/#if 1void RX_Mode(void){ CE = 0; SPI_Write_Buf(WRITE_REG + RX_ADDR_P0, TX_ADDRESS, TX_ADR_WIDTH); SPI_RW_Reg(WRITE_REG + EN_AA, 0x01); SPI_RW_Reg(WRITE_REG + EN_RXADDR, 0x01); SPI_RW_Reg(WRITE_REG + RF_CH, 40); SPI_RW_Reg(WRITE_REG + RX_PW_P0, TX_PLOAD_WIDTH); SPI_RW_Reg(WRITE_REG + RF_SETUP, 0x07); SPI_RW_Reg(WRITE_REG + CONFIG, 0x0f); CE = 1; Delay_Us(130);}#endif/********************************************************************************** 函数名称:void TX_Mode(void)** 功 能:设置NRF24L01为发射方式** 调用清单:1)unsigned char SPI_Write_Buf(unsigned char reg, unsigned char *pBuf, unsigned char bytes)*2)unsigned char SPI_RW_Reg(unsigned char reg, unsigned char value)* 参 数:无** 返 回 值:无** 注 意:1) * 2) *********************************************************************************///void TX_Mode(unsigned char *tx_data)//{// CE = 0; //待机// SPI_Write_Buf(WRITE_REG + TX_ADDR, TX_ADDRESS, TX_ADR_WIDTH); //写寄存器指令 + 接收节电地址 + 地址宽度// SPI_Write_Buf(WRITE_REG + RX_ADDR_P0, TX_ADDRESS, TX_ADR_WIDTH); //为了接收设备应答信号,接收通道0地址与发送地址相同// SPI_Write_Buf(TX_PLOAD_WIDTH, tx_data, TX_ADR_WIDTH); //写有效数据地址 + 有效数据 + 有效数据宽度//// SPI_RW_Reg(WRITE_REG + EN_AA, 0x01); // 使能接收通道0自动应答// SPI_RW_Reg(WRITE_REG + EN_RXADDR, 0x01); // 使能接收通道0// SPI_RW_Reg(WRITE_REG + SETUP_RETR, 0x0a); // 自动重发延时等待250us+86us,自动重发10次// SPI_RW_Reg(WRITE_REG + RF_CH, 40); // 选择射频通道0x40 (2.4G HZ)// SPI_RW_Reg(WRITE_REG + RF_SETUP, 0x07); // 数据传输率1Mbps,发射功率0dBm,低噪声放大器增益// SPI_RW_Reg(WRITE_REG + CONFIG, 0x0e); // CRC使能,16位CRC校验,上电// CE = 1; //启动发射// Delay_Ms(1); //CE高电平持续事件最少10us以上//}//unsigned char Check_ACK(void)//{//while(IRQ);//sta = SPI_RW(NOP); // 返回状态寄存器//if(MAX_RT || TX_DS)// {// SPI_RW_Reg(WRITE_REG + STATUS, sta); // 清除TX_DS或MAX_RT中断标志// CSN = 0;// SPI_RW(FLUSH_TX);// CSN = 1;//// return 0x00;// }//// return 0xff;//}/******************************************************************************************************//*函数:unsigned char nRF24L01_RxPacket(unsigned char* rx_buf)/*功能:数据读取后放如rx_buf接收缓冲区中/******************************************************************************************************/unsigned char nRF24L01_RxPacket(unsigned char* rx_buf){ unsigned char revale=0;sta=SPI_Read(STATUS);// 读取状态寄存其来判断数据接收状况if(RX_DR)// 判断是否接收到数据{ rx_dr_flag = 1; //成功接受数据置1 CE = 0; //SPI使能SPI_Read_Buf(RD_RX_PLOAD,rx_buf,TX_PLOAD_WIDTH);// read receive payload from RX_FIFO bufferrevale =1;//读取数据完成标志}SPI_RW_Reg(WRITE_REG+STATUS,sta); //接收到数据后RX_DR,TX_DS,MAX_PT都置高为1,通过写1来清楚中断标志return revale;}
#include "include.h"extern unsigned char rx_dr_flag;/********************************************************************************** 主函数*********************************************************************************/void main(){ unsigned char i; unsigned char RX_Buf[20] = {0}; Init_NRF24L01(); i = 0; while(1) { RX_Mode(); nRF24L01_RxPacket(&RX_Buf[i]); Delay_Ms(2); if(rx_dr_flag)//接收一次数据,为P1赋值一次 { P1 = RX_Buf[i]; i++; if(8 == i) { i = 0; } rx_dr_flag = 0; //赋值之后清空标志位 } } }
发送:
#include "include.h"unsigned char giv_status; // 状态变量#define RX_DR (giv_status & 0x40) // 接收成功中断标志#define TX_DS (giv_status & 0x20) // 发射成功中断标志#define MAX_RT (giv_status & 0x10) // 重发溢出中断标志sbit IRQ = P0^0;sbit MISO = P0^1;sbit MOSI = P0^2;sbit SCK = P0^3;sbit CSN = P0^4;sbit CE = P0^5;unsigned char const TX_ADDRESS[TX_ADR_WIDTH]= {0x34,0x43,0x10,0x10,0x01};//接收地址unsigned char const RX_ADDRESS[RX_ADR_WIDTH]= {0x34,0x43,0x10,0x10,0x01};//本地地址/********************************************************************************** 函数名称:void Init_io(void)** 功 能:初始化io口** 调用清单:无** 参 数:1)无** 返 回 值:无** 注 意:1) * 2) *********************************************************************************/void Init_NRF24L01(void){CE = 0; // 待机CSN = 1; // SPI禁止SCK = 0; // SPI时钟置低IRQ = 1; // 中断复位}/********************************************************************************** 函数名称:unsigned char SPI_RW(unsigned char byte) ** 功 能:写时序** 调用清单:无** 参 数:1)byte: 写入的数据** 返 回 值:byte** 注 意:1) * 2) *********************************************************************************/unsigned char SPI_RW(unsigned char byte){ unsigned char bit_ctr;for(bit_ctr = 0; bit_ctr < 8; bit_ctr++) { MOSI = (0x80 & byte); byte <<= 1; SCK = 1;byte |= MISO;SCK = 0; }return (byte);}/********************************************************************************** 函数名称:unsigned char SPI_RW_Reg(unsigned char reg, unsigned char value) ** 功 能:设置寄存器的值** 调用清单:1)unsigned char SPI_RW(unsigned char byte)** 参 数:1)reg : 待设置寄存器地址 2)value: 设置寄存器的值** 返 回 值:status** 注 意:1) * 2) *********************************************************************************/unsigned char SPI_RW_Reg(unsigned char reg, unsigned char value){ unsigned char status; CSN = 0; status = SPI_RW(reg); SPI_RW(value); CSN = 1; return (status);}/********************************************************************************** 函数名称:unsigned char SPI_Read(unsigned char reg)** 功 能:读取寄存器中的值** 调用清单:1)unsigned char SPI_RW(unsigned char byte)** 参 数:1)reg: 待读取寄存器的地址** 返 回 值:1)reg_val: 读取的值** 注 意:1) * 2) *********************************************************************************/unsigned char SPI_Read(unsigned char reg){ unsigned char reg_val; CSN = 0; SPI_RW(reg); reg_val = SPI_RW(0); CSN = 1; return (reg_val);}/********************************************************************************** 函数名称:unsigned char SPI_Read_Buf(unsigned char reg, unsigned char *pBuf, unsigned char bytes)** 功 能:在接收时读取FIFO缓冲区中的值** 调用清单:1)unsigned char SPI_RW(unsigned char byte)** 参 数:1)reg : 寄存器地址 2)pBuf : 待读取的数据地址 3)bytes: 读出数据的个数** 返 回 值:status: 寄存器状态** 注 意:1) * 2) *********************************************************************************///unsigned char SPI_Read_Buf(unsigned char reg, unsigned char *pBuf, unsigned char bytes)//{// unsigned char status;// unsigned char byte_ctr;//// CSN = 0;// status = SPI_RW(reg);// for(byte_ctr = 0; byte_ctr < bytes; byte_ctr++)// {// pBuf[byte_ctr] = SPI_RW(0);// }// CSN = 1;//// return (status);//}/********************************************************************************** 函数名称:unsigned char SPI_Write_Buf(unsigned char reg, unsigned char *pBuf, unsigned char bytes)** 功 能: 把数组里的数放到发射FIFO缓冲区中去** 调用清单:1)unsigned char SPI_RW(unsigned char byte)** 参 数:1)reg : 寄存器地址 2)pBuf : 待写入数据地址 3)bytes: 读出字节的个数** 返 回 值:status: 寄存器状态** 注 意:1) * 2) *********************************************************************************/unsigned char SPI_Write_Buf(unsigned char reg, unsigned char *pBuf, unsigned char bytes){ unsigned char status; unsigned char byte_ctr; CSN = 0; status = SPI_RW(reg); Delay_Us(10); for(byte_ctr = 0; byte_ctr < bytes; byte_ctr++) { SPI_RW(*pBuf++); } CSN = 1; return (status);}/********************************************************************************** 函数名称:void RX_Mode(void)** 功 能:设置NRF24L01为接收方式** 调用清单:1)unsigned char SPI_Write_Buf(unsigned char reg, unsigned char *pBuf, unsigned char bytes)*2)unsigned char SPI_RW_Reg(unsigned char reg, unsigned char value)* 参 数:无** 返 回 值:无** 注 意:1) * 2) *********************************************************************************/#if 0void RX_Mode(void){ CE = 0; SPI_Write_Buf(WRITE_REG + RX_ADDR_P0, TX_ADDRESS, TX_ADR_WIDTH); SPI_RW_Reg(WRITE_REG + EN_AA, 0x01); SPI_RW_Reg(WRITE_REG + EN_RXADDR, 0x01); SPI_RW_Reg(WRITE_REG + RF_CH, 40); SPI_RW_Reg(WRITE_REG + RX_PW_P0, TX_PLOAD_WIDTH); SPI_RW_Reg(WRITE_REG + RF_SETUP, 0x07); SPI_RW_Reg(WRITE_REG + CONFIG, 0x0f); CE = 1;}#endif/********************************************************************************** 函数名称:void TX_Mode(void)** 功 能:设置NRF24L01为发射方式** 调用清单:1)unsigned char SPI_Write_Buf(unsigned char reg, unsigned char *pBuf, unsigned char bytes)*2)unsigned char SPI_RW_Reg(unsigned char reg, unsigned char value)* 参 数:无** 返 回 值:无** 注 意:1) * 2) *********************************************************************************/void TX_Mode(unsigned char *tx_data){ CE = 0; //待机 SPI_Write_Buf(WRITE_REG + TX_ADDR, TX_ADDRESS, TX_ADR_WIDTH); //写寄存器指令 + 接收节电地址 + 地址宽度 SPI_Write_Buf(WRITE_REG + RX_ADDR_P0, TX_ADDRESS, TX_ADR_WIDTH); //为了接收设备应答信号,接收通道0地址与发送地址相同 SPI_Write_Buf(WR_TX_PLOAD, tx_data, TX_ADR_WIDTH); //写有效数据地址 + 有效数据 + 有效数据宽度 SPI_RW_Reg(WRITE_REG + EN_AA, 0x01); // 使能接收通道0自动应答 SPI_RW_Reg(WRITE_REG + EN_RXADDR, 0x01); // 使能接收通道0 SPI_RW_Reg(WRITE_REG + SETUP_RETR, 0x0a); // 自动重发延时等待250us+86us,自动重发10次 SPI_RW_Reg(WRITE_REG + RF_CH, 40); // 选择射频通道0x40 (2.4G HZ) SPI_RW_Reg(WRITE_REG + RF_SETUP, 0x07); // 数据传输率1Mbps,发射功率0dBm,低噪声放大器增益 SPI_RW_Reg(WRITE_REG + CONFIG, 0x0e); // CRC使能,16位CRC校验,上电 CE = 1; //启动发射 Delay_Ms(1); //CE高电平持续事件最少10us以上}//void nRF24L01_TxPacket(unsigned char * tx_buf)//{//CE=0;//StandBy I模式//SPI_Write_Buf(WRITE_REG + RX_ADDR_P0, TX_ADDRESS, TX_ADR_WIDTH); // 装载接收端地址//SPI_Write_Buf(WR_TX_PLOAD, tx_buf, TX_PLOAD_WIDTH); // 装载数据//SPI_RW_Reg(WRITE_REG + CONFIG, 0x0e); // IRQ收发完成中断响应,16位CRC,主发送//CE=1; //置高CE,激发数据发送// Delay_Us(10);//}unsigned char Check_ACK(void){while(IRQ);giv_status = SPI_RW(NOP); // 返回状态寄存器if(MAX_RT || TX_DS) { SPI_RW_Reg(WRITE_REG + STATUS, giv_status); // 清除TX_DS或MAX_RT中断标志 CSN = 0; SPI_RW(FLUSH_TX); CSN = 1; IRQ = 1; return 0x00; } IRQ = 1; return 0xff;}
#include "include.h"sbit led = P1^0;/********************************************************************************** 主函数*********************************************************************************/void main(){ unsigned char i; unsigned char TX_Buf[8] = {0xfe, 0xfd, 0xfb, 0xf7, 0xef, 0xdf, 0xbf, 0x7f}; //1111 1110, 1111 1101, 1111 1011, 1111 0111, //1110 1111, 1101 1111, 1011 1111, 0111 1111 Init_NRF24L01(); while(1) { for(i = 0; i < 8; i++) { TX_Mode(&TX_Buf[i]); while(Check_ACK()); led = ~led; Delay_S(1); } i = 0; } }
0 0
- NRF24L01收发测试程序
- STM32+NRF24L01收发程序
- NRF24l01无线温度传感 收发程序
- NRF24l01无线温度传感 收发程序
- NRF24l01无线温度传感 收发程序
- nrf24l01的调试测试程序
- 单片机基于2.4G无线收发模块NRF24L01的无线通信(基本测试通过)
- 单片机基于2.4G无线收发模块NRF24L01的无线通信(基本测试通过)续
- 【Espruino】NO.15 nRF24L01+无线收发器
- Arduino连接nRF24L01无线收发模块
- NRF24L01参考程序
- nrf24l01(程序)
- NRF24L01测试板子完成了
- 2.4G无线模块/无线通讯/无线收发/nRF24L01
- 基于ATmega16单片机 NRF24L01无线收发驱动程序源代码
- NRF24L01/Si24R1(2.4G无线收发射频IC)
- 基于UDP的多线程网络数据包收发测试程序
- nrf24l01+
- Greenplum优化--数据库配置篇
- [JavaEE - JPA] 5. ORM的核心注解 - 访问方式,表映射以及主键生成
- python 原始列表直接去重的方法
- hihoCoder#1128 : 二分·二分查找
- poj--2446 Chessboard(二分图最大匹配)
- NRF24L01收发测试程序
- 数字滚动
- 使用Android Studio搭建Android集成开发环境
- C语言,day09
- Android进阶之(Dailog详解)
- TreeSet与EnumSet
- maven项目环境配置与搭建
- 纯虚函数和虚函数的区别
- 配置本地php环境,80端口被system占用怎么办?百度大部分都不行,最后才解决。。