关于无线nrf24l01的一句程序语句 status = SPI_RW(reg);选择寄存器,同时返回状态字

关于无线nrf24l01的一句程序语句 status = SPI_RW(reg);选择寄存器,同时返回状态字,第1张

你好:

状态字是当前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无线收发做图片传输~等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zz/10104473.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-05
下一篇 2023-05-05

发表评论

登录后才能评论

评论列表(0条)

保存