打印

请教一下关于STM32的SPI操作NRF2401奇怪现象

[复制链接]
4636|9
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
wkong501|  楼主 | 2012-11-29 12:15 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 wkong501 于 2012-11-29 12:17 编辑

(程序在下方)
我利用STM32的SPI控制NRF2401,在读寄存器时总是只能读到NRF的状态寄存器值0x0E, 而读不到指定寄存器(0x00配置寄存器)的值. 在调试时我发现, 用JLINK 执行到断点1(下方标出)再执行到断2, 可以成功读到数据. 全部执行则读取不到第二个数据. 按之前的经验一般调试模式成功,实际操作失败大多是时序问题,我试着在很多地方加入延时函数, 还是无法解决.

请大家帮忙看一下.

u8 NRF2401_RdReg(u8 addr)

{

       u8 rxfifo;                            //此前已将CE=0 CS=1 NRF开机等待100us.

       NRF2401_ResetCS();


      while(SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_TXE) == RESET);//等待缓冲空


      SPI_I2S_SendData(SPI1, addr);


      while(SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_TXE) == RESET);

断1SPI_I2S_SendData(SPI1, 0x00);                 //随机发送一个数,以接收寄存器内容
      while(SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_RXNE) == RESET);//RXNE=1;接收为空,即未接收到                             数据;  
断2 rxfifo = SPI1->DR;

NRF2401_SetCS();



return rxfifo;

}
沙发
wkong501|  楼主 | 2012-11-29 16:49 | 只看该作者
求助, 来人啊, 分钱啦..

使用特权

评论回复
板凳
liang5319| | 2012-11-29 21:54 | 只看该作者
//通过SPI写寄存器
u8 NRF24L01_Write_Reg(u8 regaddr,u8 data)
{
        u8 status;       
    Clr_NRF24L01_CSN;                    //使能SPI传输
          status =SPI1_ReadWriteByte(regaddr); //发送寄存器号
          SPI1_ReadWriteByte(data);            //写入寄存器的值
          Set_NRF24L01_CSN;                    //禁止SPI传输          
          return(status);                                //返回状态值
}
//读取SPI寄存器值 ,regaddr:要读的寄存器
u8 NRF24L01_Read_Reg(u8 regaddr)
{
        u8 reg_val;            
        Clr_NRF24L01_CSN;                //使能SPI传输               
          SPI1_ReadWriteByte(regaddr);     //发送寄存器号
          reg_val=SPI1_ReadWriteByte(0XFF);//读取寄存器内容
          Set_NRF24L01_CSN;                //禁止SPI传输                    
          return(reg_val);                 //返回状态值
}

使用特权

评论回复
地板
liang5319| | 2012-11-29 21:54 | 只看该作者
这个可是能用的哦~~~~我现在一直在用的程序

使用特权

评论回复
5
syj111| | 2014-4-26 19:08 | 只看该作者
我的也是读寄存器为 0X0E,一直没弄好,你的弄好了吗

使用特权

评论回复
6
airwill| | 2014-4-26 22:49 | 只看该作者
我也认为应该是时序问题, 两次读之间的时间间隔调整.

使用特权

评论回复
7
449305207| | 2014-8-13 15:48 | 只看该作者
楼主已经解决了吗?我也遇到了同样的问题,我读回来的数据全是0x0e

使用特权

评论回复
8
449305207| | 2014-8-13 15:54 | 只看该作者
airwill 发表于 2014-4-26 22:49
我也认为应该是时序问题, 两次读之间的时间间隔调整.

大神您好,我最近在调NRF时也遇到了问题,status读回来的数据全是0x0e,求大神指教

使用特权

评论回复
9
449305207| | 2014-8-14 08:46 | 只看该作者
还有人在吗???

使用特权

评论回复
10
tgwfcc| | 2014-10-25 14:23 | 只看该作者
liang5319 发表于 2012-11-29 21:54
//通过SPI写寄存器
u8 NRF24L01_Write_Reg(u8 regaddr,u8 data)
{

你好,看了你的
//通过SPI写寄存器
u8 NRF24L01_Write_Reg(u8 regaddr,u8 data)
{
        u8 status;        
    Clr_NRF24L01_CSN;                    //使能SPI传输
          status =SPI1_ReadWriteByte(regaddr); //发送寄存器号
          SPI1_ReadWriteByte(data);            //写入寄存器的值
          Set_NRF24L01_CSN;                    //禁止SPI传输           
          return(status);                                //返回状态值
}
//读取SPI寄存器值 ,regaddr:要读的寄存器
u8 NRF24L01_Read_Reg(u8 regaddr)
{
        u8 reg_val;            
        Clr_NRF24L01_CSN;                //使能SPI传输               
          SPI1_ReadWriteByte(regaddr);     //发送寄存器号
          reg_val=SPI1_ReadWriteByte(0XFF);//读取寄存器内容
          Set_NRF24L01_CSN;                //禁止SPI传输                    
          return(reg_val);                 //返回状态值
}
这个读写时序的要写到一起,怎么写呢?

使用特权

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

本版积分规则

1

主题

9

帖子

1

粉丝