打印
[51单片机]

NRF24L01发现新问题

[复制链接]
3851|13
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
慢慢学|  楼主 | 2014-10-24 10:17 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
初始化NRF24L01后,在没有发送数据的前提下,读取STATUS和FIFO_STATUS都显示0x08(好像都是显示0x08),MISO接口也没有波形输出。然后发送一个数据后,MISO引脚有波形输出,但是寄存器还是读取的0x08,,,,,不知道这是什么原因造成的??难道是初始化的时候没有成功?

相关帖子

沙发
icecut| | 2014-10-24 11:01 | 只看该作者
你直接看示波器波形是08吗
是不是你读取啥,软件都是08

使用特权

评论回复
板凳
慢慢学|  楼主 | 2014-10-24 11:04 | 只看该作者
icecut 发表于 2014-10-24 11:01
你直接看示波器波形是08吗
是不是你读取啥,软件都是08

是啊,不管读什么都是08,,,
这个是读的寄存器的值,用示波器怎么看,我是直接读取后用液晶显示出来的

使用特权

评论回复
地板
icecut| | 2014-10-24 11:36 | 只看该作者
慢慢学 发表于 2014-10-24 11:04
是啊,不管读什么都是08,,,
这个是读的寄存器的值,用示波器怎么看,我是直接读取后用液晶显示出来的 ...

示波器采样时钟和miso。然后根据spi时序去读

使用特权

评论回复
5
慢慢学|  楼主 | 2014-10-24 11:54 | 只看该作者
icecut 发表于 2014-10-24 11:36
示波器采样时钟和miso。然后根据spi时序去读

关键是,初始化完成后就有这个0x08,,,没有发送数据的情况下就有了,

使用特权

评论回复
6
慢慢学|  楼主 | 2014-10-24 11:55 | 只看该作者
慢慢学 发表于 2014-10-24 11:54
关键是,初始化完成后就有这个0x08,,,没有发送数据的情况下就有了,

不发送数据的时候是没有MISO信号的!!!

使用特权

评论回复
7
ningling_21| | 2014-10-24 12:36 | 只看该作者
慢慢学 发表于 2014-10-24 11:55
不发送数据的时候是没有MISO信号的!!!

你的这个读写的程序可能就不对,既没写进去也读不出来

使用特权

评论回复
8
慢慢学|  楼主 | 2014-10-24 12:41 | 只看该作者
ningling_21 发表于 2014-10-24 12:36
你的这个读写的程序可能就不对,既没写进去也读不出来

你是说,读写NRF24L01的程序????

使用特权

评论回复
9
ningling_21| | 2014-10-24 13:35 | 只看该作者
慢慢学 发表于 2014-10-24 12:41
你是说,读写NRF24L01的程序????

就是读写它的寄存器的程序

使用特权

评论回复
10
慢慢学|  楼主 | 2014-10-24 15:23 | 只看该作者
ningling_21 发表于 2014-10-24 13:35
就是读写它的寄存器的程序

我又仔细的检查了一遍程序,感觉挺完整的!!!不知道哪里出了问题:

我附上我的程序,希望你能看看!!!万分感谢!!!





uint8 x=0;
void main()                                //主程序
{                                 
        nrf2401_init();
        delay(10000);       
        while(1)
        {         
                if(KEY_1==0)
                {       
                        x=1;
                }while(!KEY_1);
                if(x)
                {
                        NRF_Write(buffer1,5);
                        while(NRF_CheckACK()); //判断是否有发送完成中断或发送超出最大重发中断
                         P36=~P36;         //用于直观显示是否检测到中断
                }
                P1=NRFReadReg(R_REGISTER+STATUS);        //显示状态寄存器是否为0x2e
                P2=NRFReadReg(R_REGISTER+FIFO_STATUS);               
        }
void nrf2401_init()
{
        delay(30);//让系统什么都不干                  //由系统Debuge session调试得到(delay(30)延时时间大约为1.45ms)
        CE_NRF2401=0;//确保nrf2401在待机模式1,
        CSN=1;           //SPI  disable
        SCK=0;
        IRQ_NRF2401=1;//中断引脚拉高
        NRFWriteReg(W_REGISTER+EN_AA,0X00);                                                        //关闭自动应答
        NRFWriteReg(W_REGISTER+EN_RXADDR,0X00);                                                //关闭接受通道
        NRFWriteReg(W_REGISTER+RF_CH,0X50);                                                        //设置射频通道的运行频率 收发频率必须一致
        NRFWriteReg(W_REGISTER+SETUP_RETR,0X00);                                        // 不自动重发
        NRFWriteReg(W_REGISTER+RF_SETUP,0X0d);                                                //2Mbps,发射功率0dB,低噪声放大器
        NRFWriteTxData(W_REGISTER+RX_ADDR_P1,RxAddr,RX_ADDR_WITDH);        //写接收端地址,采用通道1作为模块的接受通道(接受设备通道地址1,使用和发送设备相同的地址--定义在另一个工程的收发地址恰好和本工程相反)
        NRFWriteReg(W_REGISTER+RX_PW_P1,RX_ADDR_WITDH);                                //接收通道1 数据宽度设置
        CE_NRF2401=1;
        delay(30);//保持10us秒以上
}
uint8 NRFWriteReg(uint8 RegAddr,uint8 Data)          //SPI写指令到NRF24L01
{
        uint8 BackData;
        CSN=0;                                                //启动时序
        BackData=NRFSPI(RegAddr);        //写指令
        NRFSPI(Data);                                //写数据,从NRF24L01的时序图中可以看出,在SPI写时序的时候,只有些指令的时候有数据返回,同理,读SPI时序也是一样
        CSN=1;                                           //写寄存器结束后,遵循该nrf24l01模块采用的SPI时序CPOL=0,CPHA=0;将信号复位,以免发生错误
    return(BackData);
}
uint8 NRFReadReg(uint8 RegAddr)           //SPI从NRF24L01读数据
{
        uint8 BackData;
        CSN=0;                                                //启动时序
        NRFSPI(RegAddr);                        //写指令
        BackData=NRFSPI(0x00);                //写数据,从NRF24L01的时序图中可以看出,在SPI写时序的时候,只有些指令的时候有数据返回,同理,读SPI时序也是一样
        CSN=1;                                           //写寄存器结束后,遵循该nrf24l01模块采用的SPI时序CPOL=0,CPHA=0;将信号复位,以免发生错误
    return(BackData);
}
uint8 NRFSPI(uint8 Data)           //SPI读写时序
{
        uint8 i;
        for(i=0;i<8;i++)
        {
                if(Data&0x80)          //SPI协议规定数据先读、写高位
                        MOSI=1;
                else
                        MOSI=0;
                Data<<=1;
                SCK=1;                                //因为在SPI初始化时已经将SCK拉低,此处可不必再模拟一次时钟上升沿,
                if(MISO)
                        Data|=0x01;
                SCK=0;                                //该nrf24l01模块采用的SPI时序为CPOL=0,CPHA=0;
        }
        return(Data);
}
void NRF_Write(uint8* buffer,uint8 length)          //NRF24L01写数据到寄存器并发送
{
        //int8 i=0;
        if(length>TX_DATA_WITDH)
                length=TX_DATA_WITDH;
        CE_NRF2401=0;
        NRFWriteTxData(W_REGISTER+TX_ADDR,TxAddr,TX_ADDR_WITDH);//写寄存器指令+发送地址使能指令+发送地址+地址宽度
        NRFWriteTxData(W_REGISTER+RX_ADDR_P0,TxAddr,TX_ADDR_WITDH);//为了应答接收设备,接收通道0地址和发送地址相同
        NRFWriteTxData(W_TX_PAYLOAD,buffer,length);//写入数据
        NRFWriteReg(W_REGISTER+CONFIG,0x0e);      // CRC使能,16位CRC校验,上电   //发送模式
        CE_NRF2401=1;
        delay(30);//保持10us秒以上
}
uint8 NRFWriteTxData(uint8 RegAddr,uint8 *TxData,uint8 DataLen)        //写要发送的数据到NRF24L01
{
        uint8 i,BackData;
        CSN=0;
        BackData=NRFSPI(RegAddr);//写入要写入寄存器的地址
        for(i=0;i<DataLen;i++)       
        {
                NRFSPI(*TxData++);       
        }
        CSN=1;
        return(BackData);
}
uint8 NRF_CheckACK()                                   //NRF检测是否有中断信号产生
{       
        sta=NRFReadReg(R_REGISTER+STATUS);          //读取状态寄存器的值
        if(TX_DS||MAX_RT)                                           //发送完成中断或者发送次数过多失败中断
        {           
                NRFWriteReg(W_REGISTER+STATUS,NRFReadReg(W_REGISTER+STATUS)|0x30); // 清除TX_DS或MAX_RT中断标志
                CSN=0;
            NRFSPI(FLUSH_TX);//用于清空FIFO   
        CSN=1;        
            return(0);
        }
        else
        {
                return(1);
        }
}







使用特权

评论回复
11
ningling_21| | 2014-10-24 15:42 | 只看该作者
慢慢学 发表于 2014-10-24 15:23
我又仔细的检查了一遍程序,感觉挺完整的!!!不知道哪里出了问题:

我附上我的程序,希望你能看看!! ...

在确认程序前,需先确认硬件没有问题

使用特权

评论回复
12
SILICON代理| | 2014-10-24 17:37 | 只看该作者
SI4432 SI4463 SI4455 SI4438

无线收发芯片,无线模块,无线抄表

一七四九五七二二六二

   

使用特权

评论回复
13
从此消失| | 2014-10-24 23:30 | 只看该作者
代码都那样,估计楼主也是移植的,建议楼主写个nrf和单片机是否连接好的代码,可以写入nrf的发送地址寄存器地址,然后读出来地址,和写入的值对比下,这样可以看出来是不是硬件没连接好的问题

使用特权

评论回复
14
慢慢学|  楼主 | 2014-10-25 13:41 | 只看该作者
从此消失 发表于 2014-10-24 23:30
代码都那样,估计楼主也是移植的,建议楼主写个nrf和单片机是否连接好的代码,可以写入nrf的发送地址寄存器 ...

代码当然是移植的了,,,然后看下逻辑就好了,你这个这个方法我也试了,发现读不出数据,,,只要我谢了初始化函数以后,不管读寄存器什么内容,然后都是0x08

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

个人签名:没事就给程序谢谢注释 <img src="static/image/smiley/comcom/28.gif" class="vm ...

18

主题

140

帖子

2

粉丝