nrf24l01教程 FLUSH_RX 的地址怎么算出的 为什么是0xE1

关于nrf24l01模块,status为0x0e 这是怎么回事?_单片机吧_百度贴吧
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&签到排名:今日本吧第个签到,本吧因你更精彩,明天继续来努力!
本吧签到人数:0成为超级会员,使用一键签到本月漏签0次!成为超级会员,赠送8张补签卡连续签到:天&&累计签到:天超级会员单次开通12个月以上,赠送连续签到卡3张
关注:59,953贴子:
关于nrf24l01模块,status为0x0e 这是怎么回事?收藏
调了好几天都调不出来试了下分开调试也调不出,快要交作品了,好急...
#include &reg52.h& #include &intrins.h& typedef typede //****************************************IO端口定义*************************************** sbit
=P2^0;sbit
=P2^4;sbit
=P2^1;sbit
=P2^2;sbit
=P3^3;sbit
=P2^5; sbit LED = P1^0;//*********************************************NRF24L01************************************* #define TX_ADR_WIDTH
// 5 uints TX address width #define RX_ADR_WIDTH
// 5 uints RX address width #define TX_PLOAD_WIDTH
// 20 uints TX payload #define RX_PLOAD_WIDTH
// 20 uints TX payload //***************************************NRF24L01寄存器指令******************************************************* #define READ_REG
// 读寄存器指令 #define WRITE_REG
// 写寄存器指令 #define RD_RX_PLOAD
// 读取接收数据指令 #define WR_TX_PLOAD
// 写待发数据指令 #define FLUSH_TX
// 冲洗发送 FIFO指令 #define FLUSH_RX
// 冲洗接收 FIFO指令 #define REUSE_TX_PL
// 定义重复装载数据指令 #define NOP
// 保留 //*************************************SPI(nRF24L01)寄存器地址**************************************************** #define CONFIG
// 配置收发状态,CRC校验模式以及收发状态响应方式 #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
// 频道0接收数据地址 #define RX_ADDR_P1
// 频道1接收数据地址 #define RX_ADDR_P2
// 频道2接收数据地址 #define RX_ADDR_P3
// 频道3接收数据地址 #define RX_ADDR_P4
// 频道4接收数据地址 #define RX_ADDR_P5
// 频道5接收数据地址 #define TX_ADDR
// 发送地址寄存器 #define RX_PW_P0
// 接收频道0接收数据长度 #define RX_PW_P1
// 接收频道0接收数据长度 #define RX_PW_P2
// 接收频道0接收数据长度 #define RX_PW_P3
// 接收频道0接收数据长度 #define RX_PW_P4
// 接收频道0接收数据长度 #define RX_PW_P5
// 接收频道0接收数据长度 #define FIFO_STATUS
// FIFO栈入栈出状态寄存器设置 //************************************************************************************** void Delay(unsigned int x); void InerDelay_us(unsigned char n); void Init_NRF24L01(void); uint SPI_RW(uint uchar); uchar SPI_Read(uchar reg); void SetRX_Mode(void); uint SPI_RW_Reg(uchar reg, uchar value); uint SPI_Read_Buf(uchar reg, uchar *pBuf, uchar uchars); uint SPI_Write_Buf(uchar reg, uchar *pBuf, uchar uchars); unsigned char NRF24L01_RxPacket(unsigned char* rx_buf);
//******************************************************************************************
//状态标志 sbit RX_DR =sta^6; sbit TX_DS =sta^5; sbit MAX_RT =sta^4;uint const TX_ADDRESS[TX_ADR_WIDTH]= {0x10,0x10,0x10,0x10,0x10}; //发送出去的地址
/****************************************************************************************** /*延时函数 /******************************************************************************************/ void InerDelay_us(unsigned char n) {
for(;n&0;n--)
}}//*****************************************长延时***************************************** void Delay(unsigned int x) {
unsigned int i,j;
for(i=x; i&0; i--)
for(j=110; j&0; j--);
}}/**************************************************************************************** /*NRF24L01初始化 //***************************************************************************************/ void Init_NRF24L01(void) {
InerDelay_us(100);
SPI_Write_Buf(WRITE_REG + TX_ADDR, TX_ADDRESS, TX_ADR_WIDTH);
写发送端地址
SPI_Write_Buf(WRITE_REG + RX_ADDR_P0, TX_ADDRESS, RX_ADR_WIDTH); //
写自动应答频道0地址
SPI_RW_Reg(WRITE_REG + EN_AA, 0x00);
频道0自动 ACK应答禁止
SPI_RW_Reg(WRITE_REG + EN_RXADDR, 0x00);
频道0接收禁止
SPI_RW_Reg(WRITE_REG + SETUP_RETR, 0x00);
//禁止自动重发
调试时注意这三点
SPI_RW_Reg(WRITE_REG + RF_CH, 0);
设置信道工作为2.4GHZ,收发必须一致
SPI_RW_Reg(WRITE_REG + RX_PW_P0, RX_PLOAD_WIDTH); //设置接收数据长度,本次设置为32字节
SPI_RW_Reg(WRITE_REG + RF_SETUP, 0x07);
//设置发射速率为2MHZ,发射功率为最大值0dB
}/**************************************************************************************************** /*函数:uint SPI_RW(uint uchar) /*功能:NRF24L01的SPI写时序 /****************************************************************************************************/ uint SPI_RW(uint uuchar) {
for(bit_ctr=0;bit_ctr&8;bit_ctr++) // output 8-bit
MOSI = (uuchar & 0x80);
// output 'uchar', MSB to MOSI
uuchar = (uuchar && 1);
// shift next bit into MSB..
// Set SCK high..
uuchar |= MISO;
// capture current MISO bit
// ..then set SCK low again
return(uuchar);
// return read uchar }/**************************************************************************************************** /*函数:uchar SPI_Read(uchar reg) /*功能:NRF24L01的SPI时序 /****************************************************************************************************/ uchar SPI_Read(uchar reg) {
uchar reg_
// CSN low, initialize SPI communication...
SPI_RW(reg);
// Select register to read from..
reg_val = SPI_RW(0);
// ..then read registervalue
// CSN high, terminate SPI communication
return(reg_val);
// return register value } /****************************************************************************************************
/ /*功能:NRF24L01读写寄存器函数 /****************************************************************************************************/ uint SPI_RW_Reg(uchar reg, uchar value) {
// CSN low, init SPI transaction
status = SPI_RW(reg);
// select register
SPI_RW(value);
// ..and write value to it..
// CSN high again
return(status);
// return nRF24L01 status uchar } /********************************************************************************************************* /*函数:uint SPI_Write_Buf(uchar reg, uchar *pBuf, uchar uchars) /*功能: 用于写数据:为寄存器地址,pBuf:为待写入数据地址,uchars:写入数据的个数 /*********************************************************************************************************/ uint SPI_Write_Buf(uchar reg, uchar *pBuf, uchar uchars) {
uint status,uchar_
status = SPI_RW(reg);
for(uchar_ctr=0; uchar_ctr& uchar_ctr++) //
SPI_RW(*pBuf++);
return(status);
} /*********************************************************************************************************** /*函数:void nRF24L01_TxPacket(unsigned char * tx_buf) /*功能:发送 tx_buf中数据 /**********************************************************************************************************/ void nRF24L01_TxPacket(unsigned char * tx_buf) {
//StandBy I模式
SPI_Write_Buf(WR_TX_PLOAD, tx_buf, TX_PLOAD_WIDTH);
// 装载数据
SPI_RW_Reg(WRITE_REG + CONFIG, 0x0e);
// IRQ收发完成中断响应,16位CRC,主发送
//置高CE,激发数据发送
InerDelay_us(100); }//************************************主函数************************************************************ void main() {
unsigned char TxBuf[20]={0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08,0x09,0x10,
0x11,0x12,0x13,0x14,0x15,0x16,0x17,0x18,0x19,0x20};
Init_NRF24L01();
nRF24L01_TxPacket(TxBuf);
nRF24L01_TxPacket(TxBuf);
sta = SPI_Read(STATUS);
if(sta == 0x2e)
//查看是否发送成功
P1 = 0x00;
SPI_RW_Reg(WRITE_REG+STATUS,0XFF);
//清状态寄存器
Delay(1000); //延时
楼主已经解决了吗?我也遇到了同样的问题
登录百度帐号我的游戏推荐游戏
后查看最近玩过的游戏
为兴趣而生,贴吧更懂你。或NRF24L01参考程序(包含多个实例)_百度文库
两大类热门资源免费畅读
续费一年阅读会员,立省24元!
评价文档:
11页1下载券13页1下载券12页4下载券13页7下载券22页免费51页免费9页免费7页1下载券21页1下载券4页免费
喜欢此文档的还喜欢11页1下载券21页1下载券4页1下载券5页1下载券38页免费
NRF24L01参考程序(包含多个实例)|
把文档贴到Blog、BBS或个人站等:
普通尺寸(450*500pix)
较大尺寸(630*500pix)
你可能喜欢人人小组 - 请问有用过NRF24L01做无线通信的吗??求指教源代码~~
请问有用过NRF24L01做无线通信的吗??求指教源代码~~
请问有用过NRF24L01做无线通信的吗??求指教源代码~~(单片机ATmaga16)
回复吕增晓(楼主):#include &iom16v.h&#include &macros.h&#include "12864.h"
//------------------------------------------------------------------------------//spi标志#define DDR_SPI DDRB#define DD_MOSI 5#define DD_MISO 6#define DD_SCK 7#define DD_SS 4#define CE PB3#define IRQ PB2//--------------------------------NRF24L01接口定义--------------------------------//------------------------------------------------------------------------------//#define NRF24L01_MISO
//输入0 #define
Hign_24L01_MISO
PORTB|=(1 && PB6)#define
Low_24L01_MISO
PORTB &= ~(1 && PB6)#define
Read_24L01_MISO
PINB & (1 && PB6)
//#define NRF24L01_MOSI
//输出1#define
Hign_24L01_MOSI
PORTB |= (1 && PB5) #define
Low_24L01_MOSI
PORTB &= ~(1 && PB5)#define
Read_24L01_MOSI
PINB & (1 && PB5)
//#define NRF24L01_SCK
//输出1#define
Hign_24L01_SCK
PORTB |= (1 && PB7)
Low_24L01_SCK
PORTB &= ~(1 && PB7)
Read_24L01_SCK
PINB & (1 && PB7);
//#define NRF24L01_CSN
//输出1#define
Low_24L01_CSN
PORTB &= ~(1 && PB4)#define
Hign_24L01_CSN
PORTB |= (1 && PB4)
//#define NRF24L01_CE
//输出1#define
Hign_24L01_CE
PORTB |= (1 && PB3) #define
Low_24L01_CE
PORTB &= ~(1 && PB3)
Read_24L01_CE
PINB & (1 && PB3)
//*********************************************NRF24L01*************************************#define TX_ADR_WIDTH
// 发送地址长度,最大长度为5 5*8=40 bit#define RX_ADR_WIDTH
// 接收地址长度#define TX_PLOAD_WIDTH
// 发送字节长度,#define RX_PLOAD_WIDTH
// 接收字节长度 uchar TX_ADDRESS[TX_ADR_WIDTH]={0x34,0x43,0x10,0x10,0x01};
//发送地址 uchar RX_ADDRESS[RX_ADR_WIDTH]={0x34,0x43,0x10,0x10,0x01}; //接收地址//***************************************NRF24L01寄存器指令*******************************************************#define READ_REG
// 读寄存器指令#define WRITE_REG
// 写寄存器指令#define RD_RX_PLOAD
// 读取接收数据指令#define WR_TX_PLOAD
// 写待发数据指令#define FLUSH_TX
// 冲洗发送 FIFO指令#define FLUSH_RX
// 冲洗接收 FIFO指令#define REUSE_TX_PL
// 定义重复装载数据指令#define NOP
// 保留//*************************************SPI(nRF24L01)寄存器地址****************************************************#define CONFIG
// 配置收发状态,CRC校验模式以及收发状态响应方式#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
// 频道0接收数据地址#define RX_ADDR_P1
// 频道1接收数据地址#define RX_ADDR_P2
// 频道2接收数据地址#define RX_ADDR_P3
// 频道3接收数据地址#define RX_ADDR_P4
// 频道4接收数据地址#define RX_ADDR_P5
// 频道5接收数据地址#define TX_ADDR
// 发送地址寄存器#define RX_PW_P0
// 接收频道0接收数据长度#define RX_PW_P1
// 接收频道0接收数据长度#define RX_PW_P2
// 接收频道0接收数据长度#define RX_PW_P3
// 接收频道0接收数据长度#define RX_PW_P4
// 接收频道0接收数据长度#define RX_PW_P5
// 接收频道0接收数据长度#define FIFO_STATUS
// FIFO栈入栈出状态寄存器设置//*************************************************************
//*************************************************//*******
void spi_init()
初始化SPI//**************************************************void spi_init(){ Hign_24L01_CSN; DDR_SPI = (1&&DD_MOSI)|(1&&DD_SCK)|(1&&DD_SS)|(1 && CE);//设置MOSI,SCK,SS.CE 为OUTPUT,其它为INPUT DDR_SPI&=~((1&&DD_MISO)|(1&&IRQ)); SPCR=(1&&SPE)|(1&&MSTR)|(1&&SPR0);//使能SPI接口,主机模式,MSB低位在前,模式0,16分频,SPI时钟1MHZ SPSR=0;}
//**************************************************//*******
uchar SPI_RW(uchar date)
读写SPI//**************************************************uchar SPI_RW(uchar date){ SPDR=
while(!(SPSR&(1&&SPIF)));
return SPDR;}
//**************************************************//*******uchar SPI_Read(uchar reg)
读24L01寄存器//**************************************************uchar SPI_Read(uchar reg){ uchar reg_
Low_24L01_CSN;
SPI_RW(reg);
reg_val = SPI_RW(0);
Hign_24L01_CSN;
return(reg_val);
//**************************************************//*******
uchar SPI_RW_Reg(uchar reg, uchar value) //
写24L01寄存器//**************************************************
uchar SPI_RW_Reg(uchar reg, uchar value){
Low_24L01_CSN;
status = SPI_RW(reg);
SPI_RW(value);
Hign_24L01_CSN;
return(status);
//**************************************************//*******
uchar SPI_Read_Buf(uchar reg, uchar *pBuf, uchar bites) //
读24L01 寄存器BUFF//**************************************************uchar SPI_Read_Buf(uchar reg, uchar *pBuf, uchar bites){ uint status1,uchar_
Low_24L01_CSN;
status1 = SPI_RW(reg);
for(uchar_ctr=0;uchar_ctr&uchar_ctr++)
pBuf[uchar_ctr] = SPI_RW(0);
Hign_24L01_CSN;
return(status1);
//**************************************************//*******
uchar SPI_Write_Buf(uchar reg, uchar *pBuf, uchar bites)//
写24L01 寄存器BUFF//**************************************************uchar SPI_Write_Buf(uchar reg, uchar *pBuf, uchar bites){ uchar status1,uchar_
Low_24L01_CSN;
status1 = SPI_RW(reg);
for(uchar_ctr=0; uchar_ctr& uchar_ctr++) // SPI_RW(*pBuf++); Hign_24L01_CSN;
//关闭SPI return(status1);
//**************************************************//*******
void SetRX_Mode(void)//
接收模式设置//**************************************************void SetRX_Mode(void){ Low_24L01_CE;
SPI_Write_Buf(WRITE_REG + RX_ADDR_P0, RX_ADDRESS, RX_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 + RF_CH,0);
//射频通道 SPI_RW_Reg(WRITE_REG + RX_PW_P0, RX_PLOAD_WIDTH);//写通道0 接受数据长度 SPI_RW_Reg(WRITE_REG + RF_SETUP, 0x07); //0db 1M
SPI_RW_Reg(WRITE_REG + CONFIG, 0x0f); //接收模式 Hign_24L01_CE;
//开始接收 delayus(200);//注意不能太小}
//**************************************************//*******
uchar nRF24L01_RxPacket(uchar* rx_buf)//
接收数据包//**************************************************uchar nRF24L01_RxPacket(uchar* rx_buf){
uchar sta,flag=0;
sta=SPI_Read(STATUS);
// 读取状态寄存其来判断数据接收状况
if(sta&0x40)
// 判断是否接收到数据RX_DR==1?
Low_24L01_CE;
// StandBy I模式
SPI_Read_Buf(RD_RX_PLOAD,rx_buf,TX_PLOAD_WIDTH);// read receive payload from RX_FIFO buffer
//读取数据完成标志
SPI_RW_Reg(WRITE_REG+STATUS,sta);
//接收到数据后RX_DR,TX_DS,MAX_PT都置高为1,通过写1来清楚中断标志
return (flag);}
//**************************************************//*******
void nRF24L01_TxPacket(uchar * tx_buf)//
发送数据包//**************************************************void nRF24L01_TxPacket(
uchar * tx_buf){
uchar sta=0;
uchar flag=0;
Low_24L01_CE;
//StandBy I模式
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); // 装载接收端地址
SPI_Write_Buf(WR_TX_PLOAD, tx_buf, TX_PLOAD_WIDTH);
// 装载数据
SPI_RW_Reg(WRITE_REG + EN_AA, 0x01);
SPI_RW_Reg(WRITE_REG + EN_RXADDR, 0x01);
SPI_RW_Reg(WRITE_REG + SETUP_RETR, 0x1f); //500+86us
SPI_RW_Reg(WRITE_REG + RF_CH, 0);
SPI_RW_Reg(WRITE_REG + RF_SETUP, 0x07);
SPI_RW_Reg(WRITE_REG + CONFIG, 0x0e);
// IRQ收发完成中断响应,16位CRC,主发送
delayms(2);
Hign_24L01_CE;
//置高CE,激发数据发送
delayus(10);
Low_24L01_CE;}
void init_NRF24L01(void){
spi_init();
Low_24L01_CE;
// 空闲模式
Hign_24L01_CSN;
// SPI 关闭
Low_24L01_SCK;
// 关闭时钟}&
回复李涵(3楼):O(&_&)O谢谢~~~非常感谢~~~及时雨啊!!!
回复李涵(4楼):没调成~~~求指教,这个模块的应用要注意什么?包括软件编程和硬件的电路。
发#include "RF24L01.H"void main(void){
uchar TX_BUF[32]={'s','u','c','c','e','s','s','f','u','l','!'};
delayms(22);
init_NRF24L01();
{ nRF24L01_TxPacket(TX_BUF); delayms(50);
收#include"RF24L01.H"void main(){
uchar sta,i;
uchar RX_BUF[32];
init_NRF24L01();
SetRX_Mode();
if(nRF24L01_RxPacket(RX_BUF))
for(i=0;i&11;i++)
write_com(0x80+i);
write_data(RX_BUF[i]);
delayms(50);
回复李涵(8楼):你给我的好像没有主程序~~~~我们不会写~~~我们要个最简单的范本,能发个字码,收个字码就行~~谢啦O(&_&)O~
回复吕增晓(9楼):发#include "RF24L01.H"void main(void){uchar TX_BUF[32]={'s','u','c','c','e','s','s','f','u','l','!'};delayms(22);init_NRF24L01();while(1){nRF24L01_TxPacket(TX_BUF);delayms(50); }}
回复吕增晓(9楼):收#include"RF24L01.H"void main(){uchar sta,i;uchar RX_BUF[32];init_NRF24L01();LcdIni();while(1){SetRX_Mode();if(nRF24L01_RxPacket(RX_BUF)){for(i=0;i&11;i++) {write_com(0x80+i);write_data(RX_BUF[i]);}}delayms(50);}}
回复李涵(11楼):谢啦O(&_&)O哈哈~我再试试~~
回复吕增晓(12楼):建议你下载个技术手册仔细看看,不然不一定好使。
回复李涵(13楼):我们调了一周了,有技术手册,感觉没什么问题,不知道是硬件问题还是程序问题,现在正纠结在两者的调试之间~~~O(&_&)O哈哈~
注意电源要接3.3的
回复李康飞(15楼):恩,O(&_&)O哈哈~O(&_&)O谢谢注意到了~~~
这个模块使用时注意CE脚不可一直置高,因为24L01内部发送数据时锁相环开环控制容易造成载波震荡,最长可以置高4ms,然后必须置低才能保证传输可靠。你可以按照如下步骤调试:(1)先使用示波器测试SPI接口的驱动程序是否正常工作循环发送0X55观察即可,主要看波形是否与数据手册符合,LSB还是MSB模式。(2)查看其各寄存器的配置字节,保证配置正确,并将两个模块分别配置成TXD和RXD。(3)发送一个字节,观察对方是否接收到,如果收不到,依次检验发送端的SPI电平、SPI波形逻辑、SPI驱动、24L01的寄存器值、载波设置、CE等的电平逻辑、单字节的发送驱动;再检查接收端的SPI电平、SPI波形逻辑、SPI驱动、24L01的寄存器值、载波设置、单字节接收驱动。一般BUG都会无处可逃了。
回复马天全(17楼):非常感谢O(&_&)O~
我做的无线温度传输就是用的这个模块,光研究模块就耗尽了一周的时间
你的有效果了吗
回复李康飞(19楼):没有啊!~~~~你的呢??出结果了?同研究
回复李涵(13楼):大侠,还要问个问题,STUTAS寄存器中的TX_DS是不是数据发送了之后就会从0变成1,我是不是可以通过他来判断数据是否发送成功?是不是非得把应答禁用后才可以用这个方法来检测他是不是成功?
回复马天全(16楼):我现在遇到的问题是,发送数据数据完成可以产生的中断,但是接受端接收不到数据而且我用载波检测也检测不到。
为了保证您的体验,小组智能反垃圾系统自动清除了部分广告楼层,如有疑问请看
科技热点话题
全站热门话题
同类热门小组推荐
北京千橡网景科技发展有限公司:
文网文[号··京公网安备号·甲测资字·文化部监督电子邮箱:wlwh@·
文明办网文明上网举报电话: 举报邮箱:admin1@&&&&&&&&&&&&
密码必须由6-20个字符组成
请输入验证码温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!&&|&&
LOFTER精选
#include &intrins.h&typedef
typedef unsigned char & //****************************************IO端口定义***************************************//sbit CE
& &=P1^4;//3//sbit CSN
=P1^0;//4//sbit SCK
& &=P1^3;//5//sbit
MOSI =P1^1;//6//sbit
MISO =P3^3;//7//sbit IRQ
=P1^2;//8sbit CE
& &=P2^1;//3sbit CSN
=P2^2;//4sbit SCK
& &=P2^3;//5sbit
MOSI =P2^4;//6sbit
MISO =P2^5;//7sbit IRQ
=P2^6;//8//sbit CE
& &=P1^0;//3//sbit CSN
=P1^1;//4//sbit SCK
& &=P1^2;//5//sbit
MOSI =P1^3;//6//sbit
MISO =P1^4;//7//sbit IRQ
=P1^5;//8//***********************************数码管0-9编码*******************************************//uchar Disp_Tab[10]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90}; & & & & //0~~9共阳段码char TxBuf[]=&{0x01,0x02,0x03,0x4,0x05,0x06,0x07,0x08,0x09,0x10,0x11,0x12,0x13,0x14,0x15,0x16,0x17,0x18,0x19,0x20};//*********************************************NRF24L01*************************************#define TX_ADR_WIDTH & &5 &
// 5 uints TX address width#define RX_ADR_WIDTH & &5 &
// 5 uints RX address width#define TX_PLOAD_WIDTH &20 & // 20 uints TX payload#define RX_PLOAD_WIDTH &20 & // 20 uints TX payloaduint const TX_ADDRESS[TX_ADR_WIDTH]= {0x34,0x43,0x10,0x10,0x01}; //本地地址uint const RX_ADDRESS[RX_ADR_WIDTH]= {0x34,0x43,0x10,0x10,0x01}; //接收地址//***************************************NRF24L01寄存器指令*******************************************************#define READ_REG & & & &0x00 & // 读寄存器指令#define WRITE_REG & & & 0x20
// 写寄存器指令#define RD_RX_PLOAD & & 0x61 & // 读取接收数据指令#define WR_TX_PLOAD & & 0xA0 & // 写待发数据指令#define FLUSH_TX & & & &0xE1
// 冲洗发送 FIFO指令#define FLUSH_RX & & & &0xE2 & // 冲洗接收 FIFO指令#define REUSE_TX_PL & & 0xE3 & // 定义重复装载数据指令#define NOP & & & & & & 0xFF & // 保留//*************************************SPI(nRF24L01)寄存器地址****************************************************#define CONFIG & & & & &0x00 &// 配置收发状态,CRC校验模式以及收发状态响应方式
&Config' register address#define EN_AA & & & & & 0x01 &// 自动应答功能设置
&#define EN_RXADDR & & & 0x02 &// 可用信道设置#define SETUP_AW & & & &0x03 &// 收发地址宽度设置#define SETUP_RETR & & &0x04 &// 自动重发功能设置#define RF_CH & & & & & 0x05 &// 工作频率设置#define RF_SETUP & & & &0x06 &// 发射速率、功耗功能设置#define STATUS & & & & &0x07 &// 状态寄存器#define OBSERVE_TX & & &0x08 &// 发送监测功能#define CD & & & & & & &0x09 &// 地址检测 & & & & &&#define RX_ADDR_P0 & & &0x0A &// 频道0接收数据地址
&'RX address pipe0' register address#define RX_ADDR_P1 & & &0x0B &// 频道1接收数据地址#define RX_ADDR_P2 & & &0x0C &// 频道2接收数据地址#define RX_ADDR_P3 & & &0x0D &// 频道3接收数据地址#define RX_ADDR_P4 & & &0x0E &// 频道4接收数据地址#define RX_ADDR_P5 & & &0x0F &// 频道5接收数据地址#define TX_ADDR & & & & 0x10 &// 发送地址寄存器#define RX_PW_P0 & & & &0x11 &// 接收频道0接收数据长度
& 'RX payload width, pipe0' register address#define RX_PW_P1 & & & &0x12 &// 接收频道1接收数据长度
&'RX payload width, pipe1' register address#define RX_PW_P2 & & & &0x13 &// 接收频道2接收数据长度
& 'RX payload width, pipe2' register address#define RX_PW_P3 & & & &0x14 &// 接收频道3接收数据长度
& 'RX payload width, pipe3' register address#define RX_PW_P4 & & & &0x15 &// 接收频道4接收数据长度
& &'RX payload width, pipe4' register address#define RX_PW_P5 & & & &0x16 &// 接收频道5接收数据长度
& &'RX payload width, pipe5' register address#define FIFO_STATUS & & 0x17 &// FIFO栈入栈出状态寄存器设置
&'FIFO Status Register' register address//**************************************************************************************void Delay(unsigned int s);void inerDelay_us(unsigned char n);void init_NRF24L01(void);uint SPI_RW(uint byte);uchar SPI_Read(uchar reg);void SetRX_Mode(void);uint SPI_RW_Reg(uchar reg, uchar value);uint SPI_Read_Buf(uchar reg, uchar *pBuf, uchar uchars);uint SPI_Write_Buf(uchar reg, uchar *pBuf, uchar uchars);unsigned char nRF24L01_RxPacket(unsigned char* rx_buf);void nRF24L01_TxPacket(unsigned char * tx_buf);//*****************************************长延时*****************************************void Delay(unsigned int s){
for(i=0; i&s; i++); for(i=0; i&s; i++);}//******************************************************************************************uint
& //状态标志sbit RX_DR =sta^6;sbit TX_DS =sta^5;sbit MAX_RT =sta^4;/******************************************************************************************/*延时函数
&/******************************************************************************************/void inerDelay_us(unsigned char n){ for(;n&0;n--)
_nop_();}//****************************************************************************************/*NRF24L01初始化//***************************************************************************************/void init_NRF24L01(void){& & inerDelay_us(100);& CE=0; & &// chip enable& CSN=1; & // Spi disable&& SCK=0; & // Spi clock line init high SPI_Write_Buf(WRITE_REG + TX_ADDR, TX_ADDRESS, TX_ADR_WIDTH); & &// 写本地地址
SPI_Write_Buf(WRITE_REG + RX_ADDR_P0, RX_ADDRESS, RX_ADR_WIDTH); // 写接收端地址 SPI_RW_Reg(WRITE_REG + EN_AA, 0x01); & & &// &频道0自动 ACK应答允许
SPI_RW_Reg(WRITE_REG + EN_RXADDR, 0x01); &// &允许接收地址只有频道0,如果需要多频道可以参考Page21 & SPI_RW_Reg(WRITE_REG + RF_CH, 0); & & & &// & 设置信道工作为2.4GHZ,收发必须一致 SPI_RW_Reg(WRITE_REG + RX_PW_P0, RX_PLOAD_WIDTH); //设置接收数据长度,本次设置为32字节 SPI_RW_Reg(WRITE_REG + RF_SETUP, 0x07); &
//设置发射速率为2MHZ,发射功率为最大值0dB &TX_PWR:0dBm, Datarate:2Mbps, LNA:HCURR
SPI_RW_Reg(WRITE_REG + CONFIG, 0x0e); &
// IRQ收发完成中断响应,16位CRC,主发送}/****************************************************************************************************/*函数:uint SPI_RW(uint uchar)/*功能:NRF24L01的SPI写时序
&Writes one byte to nRF24L01, and return the byte read from nRF24L01&during write, according to SPI protocol最基本的函数,完成GPIO 模拟SPI的功能。将输出字节(MOSI)从MSB 循环输出,同时将输入字节(MISO )从LSB 循环移入。上升沿读入,下降沿输出。(从SCK 被初始化为低电平可以判断出)。&/****************************************************************************************************/uint SPI_RW(uint byte){ uint bit_& & for(bit_ctr=0;bit_ctr&8;bit_ctr++) // output 8-bit& & {
MOSI = (byte & 0x80); & & & &// output 'byte', MSB to MOSI
byte = (byte && 1); & & & & & // shift next bit into MSB..
SCK = 1; & & & & & & & & & & &// Set SCK high..
byte |= MISO; & & &
&// capture current MISO bit
SCK = 0; & & & & & &
&// ..then set SCK low again& & }& & return(byte); & & & & &
&// return read byte}/****************************************************************************************************/*函数:uchar SPI_Read(uchar reg)/*功能:NRF24L01的SPI时序。读取寄存器值的函数:基本思路就是通过READ_REG 命令(也就是0x00+寄存器地址),把寄存器中的值读出来。对于函数来说也就是把reg 寄存器的值读到reg_val 中去。&/****************************************************************************************************/uchar SPI_Read(uchar reg){ uchar reg_
CSN = 0; & & & & & & & &// CSN low, initialize SPI communication... SPI_RW(reg); & & & & & &// Select register to read from.. reg_val = SPI_RW(0); & &// ..then read registervalue CSN = 1; & & & & & & & &// CSN high, terminate SPI communication
return(reg_val); & & & &// return register value} &/****************************************************************************************************//*功能:NRF24L01读写寄存器函数&寄存器访问函数:用来设置24L01 的寄存器的值。基本思路就是通过WRITE_REG 命令(也就是0x20+寄存器地址)把要&设定的值写到相应的寄存器地址里面去,并读取返回值。对于函数来说也就是把value 值写到reg 寄存器中。&需要注意的是,访问NRF24L01 之前首先要enable 芯片(CSN=0;),访问完了以后再disable芯片(CSN=1;)。&/****************************************************************************************************/uint SPI_RW_Reg(uchar reg, uchar value){
CSN = 0; & & & & & & & & & // CSN low, init SPI transaction status = SPI_RW(reg); & & &// select register
//check_status(status);//SPI_Read_Buf(WRITE_REG+CONFIG,test,1));
SPI_RW(value); & & & & & & // ..and write value to it..
//******************test************************// { //
int i=0;//
//test0 = SPI_Read_Buf(WRITE_REG +FIFO_STATUS,test,1);//
i = status/16;//
if(i&10){LCD_write_char(0,1,i+'0');}//
else{LCD_write_char(0,1,i-10+'A');}//
i = status%16;//
if(i&10){LCD_write_char(1,1,i+'0');}//
else{LCD_write_char(1,1,i-10+'A');}//
while(1);// } //******************end************************ CSN = 1; & & & & & & & & & // CSN high again
return(status); & & & & & &// return nRF24L01 status byte}/****************************************************************************************************//*函数:uint SPI_Read_Buf(uchar reg, uchar *pBuf, uchar uchars)/*功能: 用于读数据,reg:为寄存器地址,pBuf:为待读出数据地址,uchars:读出数据的个数接收缓冲区访问函数:主要用来在接收时读取FIFO缓冲区中的值。基本思路就是通过READ_REG 命令把数据从接收 FIFO(RD_RX_PLOAD)中读出并存到数组里面去。&/****************************************************************************************************/uint SPI_Read_Buf(uchar reg, uchar *pBuf, uchar uchars){ uint status,uchar_
CSN = 0; & & & & & & & & & &
// Set CSN low, init SPI tranaction status = SPI_RW(reg); & & &
// Select register to write to and read status uchar
for(uchar_ctr=0;uchar_ctr&uchar_ctr++)
pBuf[uchar_ctr] = SPI_RW(0); &
// Perform SPI_RW to read byte from nRF24L01
CSN = 1; & & & & & & & & & & & & &
// Set CSN high again&
return(status); & & & & & & & & & &// return nRF24L01 status uchar}/*********************************************************************************************************/*函数:uint SPI_Write_Buf(uchar reg, uchar *pBuf, uchar uchars)/*功能: 用于写数据:为寄存器地址,pBuf:为待写入数据地址,uchars:写入数据的个数 发射缓冲区访问函数:主要用来把数组里的数放到发射 FIFO 缓冲区中。基本思路就是通过WRITE_REG 命令把数据存到发射 FIFO(WR_TX_PLOAD)中去。/*********************************************************************************************************/uint SPI_Write_Buf(uchar reg, uchar *pBuf, uchar uchars){ uint status,uchar_
CSN = 0; & & & & & &//SPI使能 & & & & // Set CSN low, init SPI tranaction
& & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & status = SPI_RW(reg); &
& // Select register to write to and read status byte& for(uchar_ctr=0; uchar_ctr& uchar_ctr++) //
// then write all byte in buffer(*pBuf)
SPI_RW(*pBuf++);
&Display(*pBuf);//显示程序
&Delay(400) ; &
& & &SPI_RW(*pBuf);
&Delay(2000) ;
&*/ & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & && CSN = 1; & & & & & // &// Set CSN high again ,关闭SPI return(status); & &//
// return nRF24L01 status byte&}/****************************************************************************************************//*函数:void SetRX_Mode(void)/*功能:数据接收配置&& This function initializes one nRF24L01 device to &RX Mode, set RX address, writes RX payload width,& select RF channel, datarate & LNA HCURR. After init, CE is toggled high, which means that & this&& device is now ready to receive a datapacket./****************************************************************************************************/void SetRX_Mode(void){ CE=0; SPI_RW_Reg(WRITE_REG + CONFIG, 0x0f); &
// IRQ收发完成中断响应,16位CRC ,主接收,???????接收没有 CE = 1;& inerDelay_us(130);}&/******************************************************************************************************//*函数:unsigned char nRF24L01_RxPacket(unsigned char* rx_buf)/*功能:数据读取后放如rx_buf接收缓冲区中/******************************************************************************************************/unsigned char nRF24L01_RxPacket(unsigned char* rx_buf) //接收函数,返回1表示有数据收到,否则没有数据接受到{& & unsigned char revale=0; sta=SPI_Read(STATUS); // 读取状态寄存其来判断数据接收状况
&// read register STATUS's value if(RX_DR)
// 判断是否接收到数据
// ifreceive data ready (RX_DR) interrupt {
& &CE = 0;
SPI_Read_Buf(RD_RX_PLOAD,rx_buf,TX_PLOAD_WIDTH);// read receive payload from RX_FIFO buffer
revale =1;
//读取数据完成标志 } SPI_RW_Reg(WRITE_REG+STATUS,sta); & //接收到数据后RX_DR,TX_DS,MAX_PT都置高为1,通过写1来清楚中断标志.
& & & & & & & & & & & & & & & & & & & & & & & & & & //clear RX_DR or TX_DS or MAX_RT interrupt flag } /***********************************************************************************************************/*函数:void nRF24L01_TxPacket(unsigned char * tx_buf)/*功能:发送 tx_buf中数据/**********************************************************************************************************/void nRF24L01_TxPacket(unsigned char * tx_buf){
//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); // 装载数据// Writes data to TX payload
SPI_RW_Reg(WRITE_REG + CONFIG, 0x0e); // IRQ收发完成中断响应,16位CRC,主接收???????????发送中被屏蔽,而接收中没有屏蔽!
& & & & & & & & & & & & & & & & & & & & & & & & // Set PWR_UP bit, enable CRC(2 bytes) & Prim:TX. MAX_RT & TX_DS enabled.. CE=1;
//置高CE,激发数据发送
inerDelay_us(10);// CE=0;}2、1602.c文件#include&reg52.h&sbit RS = P3^4; & //定义端口&sbit RW = P3^5;sbit EN = P3^6;#define RS_CLR RS=0&#define RS_SET RS=1#define RW_CLR RW=0&#define RW_SET RW=1&#define EN_CLR EN=0#define EN_SET EN=1/******************************************************************//* & & & & & & & & & &微秒延时函数 & & & & & & & & & & & & & & & &*//******************************************************************/void delay_us(unsigned int n) //延时 如果需要高精度延时 请嵌入汇编{&&if (n == 0)&& { && && }&& while (--n);&}/******************************************************************//* & & & & & & & & & &毫秒函数声明 & & & & & & & & & & & & & & & &*//******************************************************************/&void delay_ms(unsigned char i)&&{&&unsigned char a,&&for (a = 1; a & a++)&&{& &for (b = 1; b++)&& &{ & ; & }&& & }&}/******************************************************************//* & & & & & & & & & 写入命令函数 & & & & & & & & & & & & & & & & *//******************************************************************/&void LCD_write_com(unsigned char com)&&{ &&RS_CLR;&&RW_CLR;&&EN_SET;&&P0 =&&delay_us(5);&&EN_CLR;&}/******************************************************************//* & & & & & & & & & 写入数据函数 & & & & & & & & & & & & & & & & *//******************************************************************/&void LCD_write_Data(unsigned char Data)&&{&&RS_SET;&&RW_CLR;&&EN_SET;&&P0 = D&&delay_us(5);&&EN_CLR;&}/******************************************************************//* & & & & & & & & & 清屏函数 & & & & & & & & & & & & & & & & & & *//******************************************************************/&void LCD_clear(void)&&{&&LCD_write_com(0x01);&&delay_ms(5);}/******************************************************************//* & & & & & & & & & 写入字符串函数 & & & & & & & & & & & & & & & *//******************************************************************/&void LCD_write_str(unsigned char x,unsigned char y,unsigned char *s)&&{ & &&&if (y == 0)&&{ & &&&LCD_write_com(0x80 + x); & &&&}&else&&{ & &&&LCD_write_com(0xC0 + x); & &&&} & & & &&while (*s)&&{ & &&&LCD_write_Data( *s); & &&&s ++; & &&&}&}/******************************************************************//* & & & & & & & & & 写入字节函数 & & & & & & & & & & & & & & & & *//******************************************************************/&void LCD_write_char(unsigned char x,unsigned char y,unsigned char Data)&&{ & &&&if (y == 0)&&{ & &&&LCD_write_com(0x80 + x); & &&&} & &&else&&{ & &&&LCD_write_com(0xC0 + x); & &&&} & & & &&LCD_write_Data( Data); &&}/******************************************************************//* & & & & & & & & & 初始化函数 & & & & & & & & & & & & & & & & & *//******************************************************************/&void LCD_init(void)&&{& &LCD_write_com(0x38); & &/*显示模式设置*/&& &delay_ms(5);&& &LCD_write_com(0x38);&& &delay_ms(5);&& &LCD_write_com(0x38);&& &delay_ms(5);&& &LCD_write_com(0x38); && &LCD_write_com(0x08); & &/*显示关闭*/&& &LCD_write_com(0x01); & &/*显示清屏*/&& &LCD_write_com(0x06); & &/*显示光标移动设置*/&& &delay_ms(5);&& &LCD_write_com(0x0C); & &/*显示开及光标设置*/& &}3、test.h文件
char test[]={0x00,0x00}; //unsigned char test0=0 //*****************&test&************************ void check_status(unsigned char test0) {
//test0 = SPI_Read_Buf(WRITE_REG +FIFO_STATUS,test,1);
i = test0/16;
if(i&10){LCD_write_char(0,1,i+'0');}
else{LCD_write_char(0,1,i-10+'A');}
i = test0%16;
if(i&10){LCD_write_char(1,1,i+'0');}
else{LCD_write_char(1,1,i-10+'A');}
} //*****************&end test&********************4、send.c文件#include &reg52.h&&#include"1602.h"#include"test.h"#include"nrf24l01.h"//************************************主函数************************************************************void main(void){ LCD_init();& & init_NRF24L01() ;
nRF24L01_TxPacket(TxBuf); // Transmit Tx buffer data Delay(6000); LCD_write_str(0,0,"TX starting..."); while(1)& &{
nRF24L01_TxPacket(TxBuf); // Transmit Tx buffer data
//******************************************// while(1)// { //
SPI_Read_Buf(READ_REG+FIFO_STATUS,test,1);////
check_status(test[0]);// } //******************************************
Delay(6000);
SPI_RW_Reg(WRITE_REG+STATUS,0XFF);
LCD_write_char(0,1,TxBuf[0]+0x30);
LCD_write_char(1,1,TxBuf[1]+0x30);
LCD_write_char(2,1,TxBuf[2]+0x30);
LCD_write_char(3,1,TxBuf[3]+0x30);
LCD_write_char(4,1,TxBuf[4]+0x30);
TxBuf[4]=0x00; TxBuf[3]=0x01;TxBuf[2]=0x02;TxBuf[1]=0x03;TxBuf[0]=0x04;
nRF24L01_TxPacket(TxBuf); // Transmit Tx buffer data //*****************&test&*************************// while(1)// { //
SPI_Read_Buf(READ_REG+FIFO_STATUS,test,1);////
check_status(test[0]);// } //********************&end&**********************
Delay(6000);
SPI_RW_Reg(WRITE_REG+STATUS,0XFF);
LCD_write_char(0,1,TxBuf[0]+0x30);
LCD_write_char(1,1,TxBuf[1]+0x30);
LCD_write_char(2,1,TxBuf[2]+0x30);
LCD_write_char(3,1,TxBuf[3]+0x30);
LCD_write_char(4,1,TxBuf[4]+0x30);
TxBuf[4]=0x04; TxBuf[3]=0x03;TxBuf[2]=0x02;TxBuf[1]=0x01;TxBuf[0]=0x00;& & } }
阅读(1007)|
用微信&&“扫一扫”
将文章分享到朋友圈。
用易信&&“扫一扫”
将文章分享到朋友圈。
历史上的今天
loftPermalink:'',
id:'fks_',
blogTitle:'nRF24L01发送程序和显示程序',
blogAbstract:'1.nRF24L01.h文件#include &intrins.h&typedef\t\ttypedef unsigned char &\t//****************************************IO端口定义***************************************//sbit\tCE\t & &=P1^4;//3//sbit\tCSN',
blogTag:'',
blogUrl:'blog/static/',
isPublished:1,
istop:false,
modifyTime:1,
publishTime:4,
permalink:'blog/static/',
commentCount:0,
mainCommentCount:0,
recommendCount:0,
bsrk:-100,
publisherId:0,
recomBlogHome:false,
currentRecomBlog:false,
attachmentsFileIds:[],
groupInfo:{},
friendstatus:'none',
followstatus:'unFollow',
pubSucc:'',
visitorProvince:'',
visitorCity:'',
visitorNewUser:false,
postAddInfo:{},
mset:'000',
remindgoodnightblog:false,
isBlackVisitor:false,
isShowYodaoAd:false,
hostIntro:'',
hmcon:'1',
selfRecomBlogCount:'0',
lofter_single:''
{list a as x}
{if x.moveFrom=='wap'}
{elseif x.moveFrom=='iphone'}
{elseif x.moveFrom=='android'}
{elseif x.moveFrom=='mobile'}
${a.selfIntro|escape}{if great260}${suplement}{/if}
{list a as x}
推荐过这篇日志的人:
{list a as x}
{if !!b&&b.length>0}
他们还推荐了:
{list b as y}
转载记录:
{list d as x}
{list a as x}
{list a as x}
{list a as x}
{list a as x}
{if x_index>4}{break}{/if}
${fn2(x.publishTime,'yyyy-MM-dd HH:mm:ss')}
{list a as x}
{if !!(blogDetail.preBlogPermalink)}
{if !!(blogDetail.nextBlogPermalink)}
{list a as x}
{if defined('newslist')&&newslist.length>0}
{list newslist as x}
{if x_index>7}{break}{/if}
{list a as x}
{var first_option =}
{list x.voteDetailList as voteToOption}
{if voteToOption==1}
{if first_option==false},{/if}&&“${b[voteToOption_index]}”&&
{if (x.role!="-1") },“我是${c[x.role]}”&&{/if}
&&&&&&&&${fn1(x.voteTime)}
{if x.userName==''}{/if}
网易公司版权所有&&
{list x.l as y}
{if defined('wl')}
{list wl as x}{/list}

我要回帖

更多关于 nrf24l01 arduino 的文章

 

随机推荐