微波EDA网,见证研发工程师的成长!
首页 > 研发问答 > 嵌入式设计讨论 > MCU和单片机设计讨论 > 关于NRF24L01遇到的问题,各位朋友帮忙

关于NRF24L01遇到的问题,各位朋友帮忙

时间:10-02 整理:3721RD 点击:
学习NRF24L01遇到好多问题,最不懂的就是SPI写时序函数,这是我在网上看到的代码,他们都这样写
/***************************************************************************
函数名称:SPI写时序函数
函数功能:NRF24L01的SPI写时序
***************************************************************************/
sbit MOSI=P1^0;
sbit MISO=P1^1;
.
.
.省略其它程序,看重点的     
uchar SPI_RW(uchar dat)
{
        uchar i;
           for(i=0;i<8;i++)
           {
                MOSI = (dat & 0x80);         
                dat = (dat << 1);           
                SCK = 1;                     
                dat |= MISO;               //看不懂为什么这样写
                SCK = 0;                              
           }
    return(dat);                   //***********不知道返回什么************//          
}
问题1:在网上看到,NRF24L01模块是全双工传输,在MOSI装好数据的同时,模块也将自己的状态信息放在MISO上,当时钟线置1,模块接收与发送数据。可是MISO发来的数据是什么?是STATUS状态寄存器的值吗?
问题2:dat |= MISO; dat为什么要这样写?这又跟第一个问题有关了,究竟MISO是什么信息。还有返回值dat是什么?有什么用?
麻烦路过的朋友发表一些见解,有时候看评论会激发很多灵感的。在下感激不尽!

dat |= MISO理解为:dat = dat初值 | MISO的值

MISO究竟是什么,24L01是全双工的,指令一个字节,是一位一位地发的,指令还没发完,就有数据传回来,觉得好奇怪,那这个数据究竟是什么呢?

芯片资料上有~......

芯片手册上有时序图,照着时序图看就能看明白了。
http://www.9mcu.com/9mcubbs/foru ... p;extra=#pid1013951
这个是我以前做的无线例程,里面也是模拟的SPI接口,希望能帮到你

很好的东西。

这两天我也在看NRF24L01的无线模块
uchar SPI_RW(uchar byte)
{
        uchar i;
           for(i=0; i<8; i++)          // 循环8次
           {
                   MOSI = (byte & 0x80);   // byte最高位输出到MOSI
                   byte <<= 1;             // 低一位移位到最高位
                   SCK = 1;                // 拉高SCK,nRF24L01从MOSI读入1位数据,同时从MISO输出1位数据
                   byte |= MISO;               // 读MISO到byte最低位
                   SCK = 0;                    // SCK置低
           }
    return(byte);                   // 返回读出的一字节
}
因为SPI是全双工的可以放一个取一个,但他发的是什么我还没理解,希望能帮助你。

找TX_BUF,或者是RX_BUF

它读回来的是不是STATUS状态寄存器的值?

怎么看不到别人回复?我最近也在学这个,觉得那个MISO的输入是由下位机输入的,而data返回的正是下位机输入的一个字节的数据

是状态寄存器的值

是状态寄存器的值

看第二行,Sn-状态寄存器的值


现在已经把基本功能调好了

将左边时钟芯片读到的数据通过无线模块传到右边的1602显示出来


接收到的数据


                                                 

最近再弄这个无线模块的温度采集,发射端没问题了,可是接收端1602没有显示任何东西,想请教小编,如何调试

接收端初始化时要设置为接收模式,即SPI_RW_Reg(WRITE_REG + CONFIG, 0x0f); //此后就不要更改它,
CE = 1;                                                          //确保它一直处于接收模式
然后再while循环里面判断IRQ是不是等于0,
while(1)
{
    if(IRQ==0)
   {
    这里写接收数据后数据的处理,就是将它存放在你自定义的数组里
    记得将IRQ清0;
   }
}
为什么这样写,你得去查看模块说明书,在CONFIG寄存器第六位那里说,RX_DR产生中断会置IRQ为低电平,
这就说明接收到数据会置IRQ为低电平,而你在while循环前又是设置为接收模式,就是一直处于接收,一有数
据到来就置IRQ为低电平。
不知能不能解答你的问题。

谢谢小编了 ,我试试看先

小编   我们将IRQ中断屏蔽后  可以正确的接收数据 想知道 屏蔽IRQ中断后会有什么影响么

先搞明白spi如何通信

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top