你好:
状态字是当前NRF发送中断、接收中断、重发最大次数中断等的标志。
一个调试好的NRF,状态字个人感觉用处不大,但是在调试期间作用相当大,以此判断是发送的问题还是接收的问题。
是的,当然是先选择寄存器,再写值。
希望我的回答能帮助到你。
你问的问题不够具体哦,容易产生歧义。比如用于制作无线鼠标,是否可以理解为可以和电脑建立通信关系呢?你先看看他的主要性能指标吧:
nRF24L01是一款新型单片射频收发器件,工作于24 GHz~25 GHz ISM频段。内置频率合成器、功率放大器、晶体振荡器、调制器等功能模块,并融合了增强型ShockBurst技术,其中输出功率和通信频道可通过程序进行配置。nRF24L01功耗低,在以-6 dBm的功率发射时,工作电流也只有9 mA;接收时,工作电流只有123 mA,多种低功率工作模式(掉电模式和空闲模式)使节能设计更方便。
GFSK调制:
硬件集成OSI链路层;
具有自动应答和自动再发射功能;
片内自动生成报头和CRC校验码;
数据传输率为l Mb/s或2Mb/s;
SPI速率为0 Mb/s~10 Mb/s;
125个频道:与其他nRF24系列射频器件相兼容;
QFN20引脚4 mm×4 mm封装;
供电电压为19 V~36 V。
呵呵呵~~~~不知道你用89C52刷过彩屏没有?用52单片机刷一幅要等好久他才刷完。而且你还得外界存储卡,因为52单片机内部存储空间实在是太小了。假如你要用52又去控制OV7670又去处理数据,还要将它发送出去,我觉得不是不能够完成,而是速度太慢了,任务太多了,容易造成很多问题。个人觉得,你要是学习过52单片机的话,你不如花一个星期的时间学习一下M3的处理器(如STM32),这款处理器,内部存储空间要比52大N倍。速度是52的6倍,功能比52不知要强大多少倍。52,51单片机都是用来入门学习的,只是为了让你了解一下世界上有单片机这个东西,它长什么样子,能干些什么。真正要做大东西的话,根本不行。
1一般要先检查硬件是不是有问题哈,一定要仔细,特别是芯片的供电,单片机供电,然后是之间的连接
2确认硬件无故障之后,你可以整个最最简单的程序,发送1bit数据,然后用8个led把发送的data显示出来,接收端也同样处理。看看是否运行顺利。
3如果在不行,还是用最简单的程序,然后用示波器依次检查nRF的引脚信号是否正确,特别是把CE、SCK、CSN以及MOSI、MISO对照着看,是否和nRF说明书上的时序一致,这样虽然麻烦 但肯定能找到问题。
注:很多中午PDF资料上内容不全,连接收、发送的时序也没。建议看英文厂商原版的资料;我附了ShockBurst模式下的发送、接收时序图,你可以直接参考下~
希望我的回答对你有所帮助哈~
我有一完整的程序,由于担心单片机实验板上的5V电压会损坏24L01,加上需两块单片机协调工作,因此也没敢试,如果你有条件,帮我试一下,我不要积分,只告诉我实验结果就行
#include "reg52h"
#include "intrinsh" //_nop_();延时函数用
#define uchar unsigned char
#define uint unsigned int
sbit DATA=P1^1; //发送方管脚配置
sbit CLK1=P1^2;
sbit CS=P1^3;
sbit CE=P1^4;
sbit DR1=P1^5;
sbit PWR_UP=P1^6;
sbit led1=P1^0;
sbit diol=P2^5;
/sbit DATA=P2^1; //接收方管脚配置
sbit CLK1=P2^2;
sbit CS=P2^3;
sbit CE=P2^4;
sbit DR1=P2^5;
sbit PWR_UP=P1^6;
sbit led1=P3^7;
sbit diol=P2^0;//没用/
sbit BIT0=ACC^0;
sbit BIT7=ACC^7;//
uchar TXData[14];
uchar RXData[10];
uchar Data1=0xff;
uchar code table1[]={0x88,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00};
uchar code table2[]={0x99,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00};
delay1ms(int t)
{
uint i;
uint j;
for(i=0;i<t;i++)
for(j=0;j<116;j++);
}
void delay10us(void)
{
uchar y;
for(y=0;y<10;y++)
_nop_();
}
void delay100us(void)
{
uchar y;
for(y=0;y<100;y++)
_nop_();
}
/
/函数:write( uchar byte)
/功能:通过IO口写入一个字节到NRF24L01
//
void write(uchar byte)
{
uchar i;
ACC=byte;
i=8;
while(i)
{
DATA=BIT7;
CLK1=1; // output 'uchar', MSB to MOSI
_nop_();
_nop_(); // shift next bit into MSB
ACC<<=1;
CLK1=0; // Set SCK high
i--; // then set SCK low again
}
}
/
/函数:Read(uchar reg)
/功能:NRF24L01的读时序
//
uchar Read(void)
{
uchar i;
i=8;
while(i)
{
CLK1=1; // output 'uchar', MSB to MOSI
_nop_();
_nop_(); // shift next bit into MSB
ACC<<=1;
BIT0=DATA ;
CLK1=0; // Set SCK high
i--; // then set SCK low again
}
return ACC; // return register value
}
//
/功能:NRF24L01初始化控制结构体
//
struct RFConfig
{
uchar n;
uchar buf[15];
};
typedef struct RFConfig RFConfig;
#define ADDR_INDEX 8 //地址起始号为 8
#define ADDR_COUNT 4 //地址占4字节
code RFConfig tconf= //发射时配置字
{
15,//配置字长度15
0x50,//接收通道2数据长度80bit(10byte)
0x50,//接收通道1数据长度80bit(10byte)
0x00,0x00,0x00,0x00,0x00,//接收通道2地址最多40bit(5byte)
0x00,0xaa,0xbb,0x12,0x34,//接收通道1地址最多40bit(5byte)
0x83,//32bit地址长度,16bit crc校验
0x6f,//单通道接收
0x04//02频道发射
};
code RFConfig rconf=//接收时配置字
{
15,
0x50,
0x50,
0x00,0x00,0x00,0x00,0x00,
0x00,0xaa,0xbb,0x12,0x34,
0x83,
0x6f,
0x05//2频道接收
};
void nrf2401_on()
{
CE=0;
CS=0;
PWR_UP=1;
delay1ms(3);
}
void nrf2401init_receiver(void)//接收初始化
{
uchar b;
CE=0;
CS=1;
delay10us();
for(b=0;b<rconfn;b++)//rconfn=15
{
write(rconfbuf[b]);
}
CE=1;
CS=0;
}
void nrf2401init_transmitter(void)//发射初始化
{
uchar b;
CE=0;
CS=1;
delay10us();
for(b=0;b<rconfn;b++)//rconfn和tconfn相等
{
write(tconfbuf[b]);
}
CS=0;
}
void nrf2401set_rxmode(void)//接收初始化后快速进入接收状态
{
CE=0;
CS=1;
delay10us();
write(rconfbuf[14]);//写入命令0x05
CE=1;
CS=0;
}
void nrf2401set_txmode(void)//发射初始化后快速进入发射状态
{
CE=0;
CS=1;
delay10us();
write(tconfbuf[14]);//写入命令0x04
CE=1;
CS=0;
}
void tx_packet(uchar m)//m=1发射数据包选table1,m=2选table2
{
uchar i ;
TXData[0]=0xaa;//要不要补1个地址码0x00不用,前面已设32bit地址长度,
TXData[1]=0xbb;
TXData[2]=0x12;
TXData[3]=0x34;
if (m==1)
{
for(i=4;i<14;i++)
{TXData[i]=table1[i-4];}
}
else
{
for(i=4;i<14;i++)
{TXData[i]=table2[i-4];}
}
CS=0;CE=1;
delay10us();
for(i=0;i<14;i++)
{
write(TXData[i]);
}
CE=0;
}
/void tx_packet(void)//发射数据包
{
uchar i ;
TXData[0]=0xaa;//要不要补1个地址码0x00不用,前面已设32bit地址长度,
TXData[1]=0xbb;
TXData[2]=0x12;
TXData[3]=0x34;
for(i=4;i<14;i++)
{TXData[i]=table2[i-4];}
CS=0;CE=1;
delay10us();
for(i=0;i<14;i++)
{
write(TXData[i]);
}
CE=0;
}/
void recevice_packet(void)//接收数据包
{
uchar i ;
for(i=0;i<10;i++)
{
RXData[i]=Read();
}
}
//发射方先发一个数据包,其中第5个数据(TXData[4])为0x88,然后进入接收状态,若收到的数据包第5个数是0x99,则点亮发光二极管
//接收方先进入接收状态,若收到的数据包第5个数是0x88,则点亮LED并发送一个数据包,其中第5个是0x99
void main(void)//发射方主程序
{
nrf2401_on();
nrf2401init_transmitter();
nrf2401set_txmode;//进入发射状态
tx_packet(1);//发射数据包1第4个数据为0x88
nrf2401init_receiver();
nrf2401set_rxmode();//进入接收状态
while(DR1!=1);
recevice_packet();//接收数据包
diol=1;//开通锁存器
if(RXData[4]==0x99)//如果收到正确遥数据0x99,则灯亮说明通信成功
{
led1=0;
}
while(1);
}
/void main(void)//接收方主程序
{
nrf2401_on();
nrf2401init_receiver();
nrf2401set_rxmode();//进入接收状态
while(DR1!=1);
recevice_packet();//接收数据包
diol=1;//开通锁存器
if(RXData[4]==0x88)//如果收到正确遥数据0x88,则灯亮说明通信成功
{
led1=0;
}
nrf2401init_transmitter();
nrf2401set_txmode;//进入发射状态
delay1ms(10);//延时,让发送方准备好
tx_packet(2);//发射数据包2,第4个数据为0x99
while(1);
}/
以上就是关于关于无线nrf24l01的一句程序语句 status = SPI_RW(reg); // 选择寄存器,同时返回状态字全部的内容,包括:关于无线nrf24l01的一句程序语句 status = SPI_RW(reg); // 选择寄存器,同时返回状态字、NRF24L01接收端能直接连到电脑上吗、想通过89c52单片机和ov7670带FIFO的摄像头和nrf905无线收发做图片传输~等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)