[51单片机] NRF24L01发现新问题

[复制链接]
4198|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时序去读
 楼主| 慢慢学 发表于 2014-10-24 11:54 | 显示全部楼层
icecut 发表于 2014-10-24 11:36
示波器采样时钟和miso。然后根据spi时序去读

关键是,初始化完成后就有这个0x08,,,没有发送数据的情况下就有了,
 楼主| 慢慢学 发表于 2014-10-24 11:55 | 显示全部楼层
慢慢学 发表于 2014-10-24 11:54
关键是,初始化完成后就有这个0x08,,,没有发送数据的情况下就有了,

不发送数据的时候是没有MISO信号的!!!
ningling_21 发表于 2014-10-24 12:36 | 显示全部楼层
慢慢学 发表于 2014-10-24 11:55
不发送数据的时候是没有MISO信号的!!!

你的这个读写的程序可能就不对,既没写进去也读不出来
 楼主| 慢慢学 发表于 2014-10-24 12:41 | 显示全部楼层
ningling_21 发表于 2014-10-24 12:36
你的这个读写的程序可能就不对,既没写进去也读不出来

你是说,读写NRF24L01的程序????
ningling_21 发表于 2014-10-24 13:35 | 显示全部楼层
慢慢学 发表于 2014-10-24 12:41
你是说,读写NRF24L01的程序????

就是读写它的寄存器的程序
 楼主| 慢慢学 发表于 2014-10-24 15:23 | 显示全部楼层
ningling_21 发表于 2014-10-24 13:35
就是读写它的寄存器的程序

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

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





  1. uint8 x=0;
  2. void main()                                //主程序
  3. {                                 
  4.         nrf2401_init();
  5.         delay(10000);       
  6.         while(1)
  7.         {         
  8.                 if(KEY_1==0)
  9.                 {       
  10.                         x=1;
  11.                 }while(!KEY_1);
  12.                 if(x)
  13.                 {
  14.                         NRF_Write(buffer1,5);
  15.                         while(NRF_CheckACK()); //判断是否有发送完成中断或发送超出最大重发中断
  16.                          P36=~P36;         //用于直观显示是否检测到中断
  17.                 }
  18.                 P1=NRFReadReg(R_REGISTER+STATUS);        //显示状态寄存器是否为0x2e
  19.                 P2=NRFReadReg(R_REGISTER+FIFO_STATUS);               
  20.         }
  21. void nrf2401_init()
  22. {
  23.         delay(30);//让系统什么都不干                  //由系统Debuge session调试得到(delay(30)延时时间大约为1.45ms)
  24.         CE_NRF2401=0;//确保nrf2401在待机模式1,
  25.         CSN=1;           //SPI  disable
  26.         SCK=0;
  27.         IRQ_NRF2401=1;//中断引脚拉高
  28.         NRFWriteReg(W_REGISTER+EN_AA,0X00);                                                        //关闭自动应答
  29.         NRFWriteReg(W_REGISTER+EN_RXADDR,0X00);                                                //关闭接受通道
  30.         NRFWriteReg(W_REGISTER+RF_CH,0X50);                                                        //设置射频通道的运行频率 收发频率必须一致
  31.         NRFWriteReg(W_REGISTER+SETUP_RETR,0X00);                                        // 不自动重发
  32.         NRFWriteReg(W_REGISTER+RF_SETUP,0X0d);                                                //2Mbps,发射功率0dB,低噪声放大器
  33.         NRFWriteTxData(W_REGISTER+RX_ADDR_P1,RxAddr,RX_ADDR_WITDH);        //写接收端地址,采用通道1作为模块的接受通道(接受设备通道地址1,使用和发送设备相同的地址--定义在另一个工程的收发地址恰好和本工程相反)
  34.         NRFWriteReg(W_REGISTER+RX_PW_P1,RX_ADDR_WITDH);                                //接收通道1 数据宽度设置
  35.         CE_NRF2401=1;
  36.         delay(30);//保持10us秒以上
  37. }
  38. uint8 NRFWriteReg(uint8 RegAddr,uint8 Data)          //SPI写指令到NRF24L01
  39. {
  40.         uint8 BackData;
  41.         CSN=0;                                                //启动时序
  42.         BackData=NRFSPI(RegAddr);        //写指令
  43.         NRFSPI(Data);                                //写数据,从NRF24L01的时序图中可以看出,在SPI写时序的时候,只有些指令的时候有数据返回,同理,读SPI时序也是一样
  44.         CSN=1;                                           //写寄存器结束后,遵循该nrf24l01模块采用的SPI时序CPOL=0,CPHA=0;将信号复位,以免发生错误
  45.     return(BackData);
  46. }
  47. uint8 NRFReadReg(uint8 RegAddr)           //SPI从NRF24L01读数据
  48. {
  49.         uint8 BackData;
  50.         CSN=0;                                                //启动时序
  51.         NRFSPI(RegAddr);                        //写指令
  52.         BackData=NRFSPI(0x00);                //写数据,从NRF24L01的时序图中可以看出,在SPI写时序的时候,只有些指令的时候有数据返回,同理,读SPI时序也是一样
  53.         CSN=1;                                           //写寄存器结束后,遵循该nrf24l01模块采用的SPI时序CPOL=0,CPHA=0;将信号复位,以免发生错误
  54.     return(BackData);
  55. }
  56. uint8 NRFSPI(uint8 Data)           //SPI读写时序
  57. {
  58.         uint8 i;
  59.         for(i=0;i<8;i++)
  60.         {
  61.                 if(Data&0x80)          //SPI协议规定数据先读、写高位
  62.                         MOSI=1;
  63.                 else
  64.                         MOSI=0;
  65.                 Data<<=1;
  66.                 SCK=1;                                //因为在SPI初始化时已经将SCK拉低,此处可不必再模拟一次时钟上升沿,
  67.                 if(MISO)
  68.                         Data|=0x01;
  69.                 SCK=0;                                //该nrf24l01模块采用的SPI时序为CPOL=0,CPHA=0;
  70.         }
  71.         return(Data);
  72. }
  73. void NRF_Write(uint8* buffer,uint8 length)          //NRF24L01写数据到寄存器并发送
  74. {
  75.         //int8 i=0;
  76.         if(length>TX_DATA_WITDH)
  77.                 length=TX_DATA_WITDH;
  78.         CE_NRF2401=0;
  79.         NRFWriteTxData(W_REGISTER+TX_ADDR,TxAddr,TX_ADDR_WITDH);//写寄存器指令+发送地址使能指令+发送地址+地址宽度
  80.         NRFWriteTxData(W_REGISTER+RX_ADDR_P0,TxAddr,TX_ADDR_WITDH);//为了应答接收设备,接收通道0地址和发送地址相同
  81.         NRFWriteTxData(W_TX_PAYLOAD,buffer,length);//写入数据
  82.         NRFWriteReg(W_REGISTER+CONFIG,0x0e);      // CRC使能,16位CRC校验,上电   //发送模式
  83.         CE_NRF2401=1;
  84.         delay(30);//保持10us秒以上
  85. }
  86. uint8 NRFWriteTxData(uint8 RegAddr,uint8 *TxData,uint8 DataLen)        //写要发送的数据到NRF24L01
  87. {
  88.         uint8 i,BackData;
  89.         CSN=0;
  90.         BackData=NRFSPI(RegAddr);//写入要写入寄存器的地址
  91.         for(i=0;i<DataLen;i++)       
  92.         {
  93.                 NRFSPI(*TxData++);       
  94.         }
  95.         CSN=1;
  96.         return(BackData);
  97. }
  98. uint8 NRF_CheckACK()                                   //NRF检测是否有中断信号产生
  99. {       
  100.         sta=NRFReadReg(R_REGISTER+STATUS);          //读取状态寄存器的值
  101.         if(TX_DS||MAX_RT)                                           //发送完成中断或者发送次数过多失败中断
  102.         {           
  103.                 NRFWriteReg(W_REGISTER+STATUS,NRFReadReg(W_REGISTER+STATUS)|0x30); // 清除TX_DS或MAX_RT中断标志
  104.                 CSN=0;
  105.             NRFSPI(FLUSH_TX);//用于清空FIFO   
  106.         CSN=1;        
  107.             return(0);
  108.         }
  109.         else
  110.         {
  111.                 return(1);
  112.         }
  113. }







ningling_21 发表于 2014-10-24 15:42 | 显示全部楼层
慢慢学 发表于 2014-10-24 15:23
我又仔细的检查了一遍程序,感觉挺完整的!!!不知道哪里出了问题:

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

在确认程序前,需先确认硬件没有问题
SILICON代理 发表于 2014-10-24 17:37 | 显示全部楼层
SI4432 SI4463 SI4455 SI4438

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

一七四九五七二二六二

   

从此消失 发表于 2014-10-24 23:30 | 显示全部楼层
代码都那样,估计楼主也是移植的,建议楼主写个nrf和单片机是否连接好的代码,可以写入nrf的发送地址寄存器地址,然后读出来地址,和写入的值对比下,这样可以看出来是不是硬件没连接好的问题
 楼主| 慢慢学 发表于 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

粉丝
快速回复 在线客服 返回列表 返回顶部