NRF24L01无线模块C语言程序_第1页
NRF24L01无线模块C语言程序_第2页
NRF24L01无线模块C语言程序_第3页
NRF24L01无线模块C语言程序_第4页
NRF24L01无线模块C语言程序_第5页
已阅读5页,还剩9页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

-.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. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论