




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
-.z.NRF24L01无线模块C语言程序24MHz晶振#include
#include
#include
#include
#include
#include#defineU8
unsignedchar
#defineU16unsignedint#defineT*_ADDR_WITDH5
//发送地址宽度设置为5个字节
#defineR*_ADDR_WITDH5
//接收地址宽度设置为5个字节
#defineT*_DATA_WITDH1//发送数据宽度1个字节
#defineR*_DATA_WITDH1//接收数据宽度1个字节
#define
R_REGISTER
0*00//读取配置存放器
#define
W_REGISTER
0*20//写配置存放器
#define
R_R*_PAYLOAD
0*61//读取R*有效数据
#define
W_T*_PAYLOAD
0*a0//写T*有效数据
#define
FLUSH_T*
0*e1//去除T*FIFO存放器
#define
FLUSH_R*
0*e2//去除R*FIFO存放器
#define
REUSE_T*_PL
0*e3//重新使用上一包有效数据
#define
NOP
0*ff//空操作
#define
CONFIG
0*00//配置存放器
#define
EN_AA
0*01//使能自动应答
#define
EN_R*ADDR
0*02//接收通道使能0-5个通道
#define
SETUP_AW
0*03//设置数据通道地址宽度3-5
#define
SETUP_RETR
0*04//建立自动重发
#define
RF_CH
0*05//射频通道设置
#define
RF_SETUP
0*06//射频存放器
#define
STATUS
0*07//状态存放器
#define
OBSERVE_T*
0*08//发送检测存放器
#define
CD
0*09//载波
#define
R*_ADDR_P0
0*0a//数据通道0接收地址
#define
R*_ADDR_P1
0*0b//数据通道1接收地址
#define
R*_ADDR_P2
0*0c//数据通道2接收地址
#define
R*_ADDR_P3
0*0d//数据通道3接收地址
#define
R*_ADDR_P4
0*0e//数据通道4接收地址
#define
R*_ADDR_P5
0*0f//数据通道5接收地址
#define
T*_ADDR
0*10//发送地址
#define
R*_PW_P0
0*11//P0通道数据宽度设置
#define
R*_PW_P1
0*12//P1通道数据宽度设置
#define
R*_PW_P2
0*13//P2通道数据宽度设置
#define
R*_PW_P3
0*14//P3通道数据宽度设置
#define
R*_PW_P4
0*15//P4通道数据宽度设置
#define
R*_PW_P5
0*16//P5通道数据宽度设置
#define
FIFO_STATUS
0*17//FIFO状态存放器//NRF24L01
U8NRFACK();
U8NRFSPI(U8date);
U8NRFReadReg(U8RegAddr);
U8NRFWriteReg(U8RegAddr,U8date);
U8NRFReadR*Date(U8RegAddr,U8*R*Date,U8DateLen);
U8NRFWriteT*Date(U8RegAddr,U8*T*Date,U8DateLen);
U8NRFRevDate(U8*RevDate);
voidNRFSetT*Mode(U8*T*Date);
voidNRF24L01Int();
voidNRFSetR*Mode();
U8CheckACK();
voidDelay(U16t);
U8bdatasta;//main
voidDelay_10ms(U16del);bit
CE=P1^4;
//R*/T*模式选择端
sbitIRQ=P1^1;//可屏蔽中断端
sbitCSN=P1^6;//SPI片选端//就是SS
sbitMOSI=P1^0;
//SPI主机输出从机输入端1
sbitMISO=P1^2;
//SPI主机输入从机输出端
sbitSCLK=P1^3;
//SPI时钟端U8codeT*Addr[]={0*34,0*43,0*10,0*10,0*01};//发送地址
U8bdatasta;
//状态标志
sbitR*_DR=sta^6;
sbitT*_DS=sta^5;
sbitMA*_RT=sta^4;
voidDelay(U16t)
{
U16*,y;
for(*=t;*>0;*--)
for(y=110;y>0;y--);
}
U8NRFSPI(U8date)
{
U8i;
for(i=0;i<8;i++)
//循环8次
{
if(date&0*80)
MOSI=1;
else
MOSI=0;
//byte最高位输出到MOSI
date<<=1;
//低一位移位到最高位
SCLK=1;
if(MISO)
//拉高SCK,nRF24L01从MOSI读入1位数据,同时从MISO输出1位数据
date|=0*01;
//读MISO到byte最低位
SCLK=0;
//SCK置低
}
return(date);
//返回读出的一字节
}
voidNRF24L01Int()
{
Delay(2);//让系统什么都不干
CE=0;//待机模式1
CSN=1;
SCLK=0;
IRQ=1;
}
U8NRFReadReg(U8RegAddr)
{
U8BackDate;
CSN=0;//启动时序
NRFSPI(RegAddr);//写存放器地址
BackDate=NRFSPI(0*00);//写入读存放器指令
CSN=1;
return(BackDate);//返回状态
}
U8NRFWriteReg(U8RegAddr,U8date)
{
U8BackDate;
CSN=0;//启动时序
BackDate=NRFSPI(RegAddr);//写入地址
NRFSPI(date);//写入值
CSN=1;
return(BackDate);
}
U8NRFReadR*Date(U8RegAddr,U8*R*Date,U8DateLen)
{
//存放器地址//读取数据存放变量//读取数据长度//用于接收
U8BackDate,i;
CSN=0;//启动时序
BackDate=NRFSPI(RegAddr);//写入要读取的存放器地址
for(i=0;i
{
R*Date[i]=NRFSPI(0);
}
CSN=1;
return(BackDate);
}
U8NRFWriteT*Date(U8RegAddr,U8*T*Date,U8DateLen)
{//存放器地址//写入数据存放变量//读取数据长度//用于发送
U8BackDate,i;
CSN=0;
BackDate=NRFSPI(RegAddr);//写入要写入存放器的地址
for(i=0;i
{
NRFSPI(*T*Date++);
}
CSN=1;
return(BackDate);
}
voidNRFSetT*Mode(U8*T*Date)
{//发送模式
CE=0;
NRFWriteT*Date(W_REGISTER+T*_ADDR,T*Addr,T*_ADDR_WITDH);//写存放器指令+接收地址使能指令+接收地址+地址宽度
NRFWriteT*Date(W_REGISTER+R*_ADDR_P0,T*Addr,T*_ADDR_WITDH);//为了应答接收设备,接收通道0地址和发送地址一样
NRFWriteT*Date(W_T*_PAYLOAD,T*Date,T*_DATA_WITDH);//写入数据
NRFWriteReg(W_REGISTER+EN_AA,0*01);
//使能接收通道0自动应答
NRFWriteReg(W_REGISTER+EN_R*ADDR,0*01);
//使能接收通道0
NRFWriteReg(W_REGISTER+SETUP_RETR,0*0a);
//自动重发延时等待250us+86us,自动重发10次
NRFWriteReg(W_REGISTER+RF_CH,0*40);
//选择射频通道0*40
NRFWriteReg(W_REGISTER+RF_SETUP,0*07);
//数据传输率1Mbps,发射功率0dBm,低噪声放大器增益
NRFWriteReg(W_REGISTER+CONFIG,0*0e);
//CRC使能,16位CRC校验,上电
CE=1;
Delay(5);//保持10us秒以上
}
//主要接收模式
voidNRFSetR*Mode()
{
CE=0;
NRFWriteT*Date(W_REGISTER+R*_ADDR_P0,T*Addr,T*_ADDR_WITDH);
//接收设备接收通道0使用和发送设备一样的发送地址
NRFWriteReg(W_REGISTER+EN_AA,0*01);
//使能接收通道0自动应答
NRFWriteReg(W_REGISTER+EN_R*ADDR,0*01);
//使能接收通道0
NRFWriteReg(W_REGISTER+RF_CH,0*40);
//选择射频通道0*40
NRFWriteReg(W_REGISTER+R*_PW_P0,T*_DATA_WITDH);
//接收通道0选择和发送通道一样有效数据宽度
NRFWriteReg(W_REGISTER+RF_SETUP,0*07);
//数据传输率1Mbps,发射功率0dBm,低噪声放大器增益*/
NRFWriteReg(W_REGISTER+CONFIG,0*0f);
//CRC使能,16位CRC校验,上电,接收模式
CE=1;
Delay(5);//保持10us秒以上
}
U8CheckACK()
{
//用于发射
sta=NRFReadReg(R_REGISTER+STATUS);
//返回状态存放器
if(T*_DS||MA*_RT)//发送完毕中断
{
NRFWriteReg(W_REGISTER+STATUS,0*ff);
//去除T*_DS或MA*_RT中断标志
CSN=0;
NRFSPI(FLUSH_T*);//用于清空FIFO!!关键!!不然会出现意想不到的后果!!!大家记住!!
CSN=1;
return(0);
}
else
return(1);
}
//用于接收模式
U8NRFRevDate(U8*RevDate)
{
U8RevFlags=0;
sta=NRFReadReg(R_REGISTER+STATUS);//发送数据后读取状态存放器
if(R*_DR)
//判断是否接收到数据
{
CE=0;
//SPI使能
NRFReadR*Date(R_R*_PAYLOAD,RevDate,R*_DATA_WITDH);//从R*FIFO读取数据
RevFlags=1;
//读取数据完成标志
}
NRFWriteReg(W_REGISTER+STATUS,0*ff);//接收到数据后R*_DR,T*_DS,MA*_PT都置高为1,通过写1来清楚中断标
return(RevFlags);
}voidDelay_10ms(U1
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 校园欺凌分类题库及答案
- 建筑公司咨询策划方案
- 2025年亳州职业医学题库及答案
- 情感咨询公司引流方案
- 2025年工业互联网平台网络隔离技术在工业生产效率提升中的应用报告
- 2025年初级粤菜考试试题及答案
- 汽车湖南专业测试题及答案
- 专业兴趣分析测试题及答案
- DB65T 4401-2021 早熟玉米新玉54号高效栽培技术规程
- 第2单元 5 草船借箭2024-2025学年五年级下册语文同步教案(统编版)
- 特斯拉MODEL Y用户手册
- 轨道几何形位参数轨距课件
- 临床麻醉学笔记
- 混凝土施工工艺质量控制与防治
- 造影剂外渗的个案护理
- 水池满水试验具体方案
- 防校园欺凌课件(幼儿园)
- 实验室应急响应培训计划
- 秋冬季节预防流感
- 河道生态修复工程施工图设计总说明-水生态部分
- 慢病患者的自我管理培训课件
评论
0/150
提交评论