野火电子论坛

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 15194|回复: 12

STM32测试NRF24L01

[复制链接]
发表于 2014-5-11 14:53:51 | 显示全部楼层 |阅读模式
接收端用的野火的老版stm32开发板,用的lLED提示接收情况,检验NRF24L01与STM32是否正常连接,确定可以正常连接,这个可以说明NRF24L01无线模块没有烧坏吗?发送端用的STM8发送的的,但是接收端接收不到数据,接收端如果接收到数据是用一个LED点亮来提示,完了之后,用STM32发送数据,发送端也正常可以发送出去数据,读状态寄存器里的值确定应该发送出数据了,接收端用STM8接收也是接收不到数据,这种情况软件的问题概率大一些,还是硬件问题的概率大一些?求助。
回复

使用道具 举报

发表于 2014-5-11 15:15:35 | 显示全部楼层
NRF模块基本上你把引脚接好了就没什么硬件问题了,基本都是软件问题,可能是你STM8方面的程序没有与调好,应该跟STM32也是差不多的吧,修改一下就好了
回复 支持 反对

使用道具 举报

 楼主| 发表于 2014-5-11 15:42:31 | 显示全部楼层
我意思NRF24L01有没有可能烧了?
回复 支持 反对

使用道具 举报

发表于 2014-5-11 16:40:14 | 显示全部楼层
誰其我舍 发表于 2014-5-11 15:42
我意思NRF24L01有没有可能烧了?

能够测试连接成功就没有烧坏
回复 支持 反对

使用道具 举报

发表于 2014-5-11 19:03:33 | 显示全部楼层
代码概率大,可能是两者模块的参数配置不相同,导致不能正常接收。
例如地址不同,频道不同。
回复 支持 反对

使用道具 举报

发表于 2014-5-11 21:16:58 | 显示全部楼层
硬件一般不会出问题,只会代码发送接受地方出问题
回复 支持 反对

使用道具 举报

 楼主| 发表于 2014-5-16 17:54:16 | 显示全部楼层
神奇的海螺 发表于 2014-5-11 21:16
硬件一般不会出问题,只会代码发送接受地方出问题

如果用万用表检测IRO引脚可以判断是否发送和接收成功吧?发送端用的野火老板的stm32板,主机程序,把接收模式的程序删了,让它只发送,检测IRQ引脚电平,一直是高电平。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2014-5-16 18:42:57 | 显示全部楼层
void NRF_TX_Mode(void)
{  
                NRF_CE_LOW();               

                SPI_NRF_WriteBuf(NRF_WRITE_REG+TX_ADDR,TX_ADDRESS,TX_ADR_WIDTH);    //写TX节点地址

                SPI_NRF_WriteBuf(NRF_WRITE_REG+RX_ADDR_P0,RX_ADDRESS,RX_ADR_WIDTH); //设置TX节点地址,主要为了使能ACK   

                SPI_NRF_WriteReg(NRF_WRITE_REG+EN_AA,0x00);     //使能通道0的自动应答   

                SPI_NRF_WriteReg(NRF_WRITE_REG+EN_RXADDR,0x00); //使能通道0的接收地址  

                SPI_NRF_WriteReg(NRF_WRITE_REG+SETUP_RETR,0x00);//设置自动重发间隔时间:500us + 86us;最大自动重发次数:10次

                SPI_NRF_WriteReg(NRF_WRITE_REG+RF_CH,CHANAL);       //设置RF通道为CHANAL

                SPI_NRF_WriteReg(NRF_WRITE_REG+RF_SETUP,0x0f);  //设置TX发射参数,0db增益,2Mbps,低噪声增益开启   

                SPI_NRF_WriteReg(NRF_WRITE_REG+CONFIG,0x0e);    //配置基本工作模式的参数WR_UP,EN_CRC,16BIT_CRC,发射模式,开启所有中断

                /*CE拉高,进入发送模式*/       
                NRF_CE_HIGH();
                Delay(0xffff); //CE要拉高一段时间才进入发送模式
}

先失能通道0自动应答、失能接收通道0、失能自动重发,调的发送端。
        /*检测NRF模块与MCU的连接*/
                status = NRF_Check();

                /*判断连接状态*/  
                if(status == SUCCESS)          
                LED1( ON );
                else          
                printf("\r\n  NRF与MCU连接失败,请重新检查接线。\r\n");
LED1被点亮,说明连接正常吧。
死循环里的程序
while(1)
{
                        NRF_TX_Mode();
                        /*开始发送数据*/       
                        status = NRF_Tx_Dat(txbuf);          
                        /*判断发送状态*/
               
                        switch(status)
                        {
                                                        case MAX_RT:
                                                        printf("\r\n 主机端 没接收到应答信号,发送次数超过限定值,发送失败。 \r\n");
                                                        break;

                                                        case ERROR:
                                                        printf("\r\n 未知原因导致发送失败。 \r\n");
                                                        break;

                                                        case TX_DS:
                                                        LED2(ON);
                                                        break;                                                                 
                        }               
                                                                               

}        
               
发送这个u8 txbuf[4]={0,1,2,3};         //发送缓冲
LED2被点亮。
u8 NRF_Tx_Dat(u8 *txbuf)
{
        u8 state;  
        /*ce为低,进入待机模式1*/
        NRF_CE_LOW();

        /*写数据到TX BUF 最大 32个字节*/                                               
        SPI_NRF_WriteBuf(WR_TX_PLOAD,txbuf,TX_PLOAD_WIDTH);
        /*CE为高,txbuf非空,发送数据包 */   
        NRF_CE_HIGH();
        /*等待发送完成中断 */                           
        while(NRF_Read_IRQ()!=0);
        /*读取状态寄存器的值 */                              
        state = SPI_NRF_ReadReg(STATUS);
        if(state == 0x2e)LED3(ON);
        //LED3(ON);
        /*清除TX_DS或MAX_RT中断标志*/                  
        SPI_NRF_WriteReg(NRF_WRITE_REG+STATUS,0xff);        

        SPI_NRF_WriteReg(FLUSH_TX,NOP);    //清除TX FIFO寄存器

        /*判断中断类型*/   
        if(state&MAX_RT)                     //达到最大重发次数
        {
                                        return MAX_RT;
        }

        else if(state&TX_DS)                  //发送完成
        {
                                        return TX_DS;
        }
        else                                                  
                                        return ERROR;                 //其他原因发送失败
}
这里还检测了状态寄存器里的值,是0x2e,点亮LED3.
最后是三个LED都被点亮了,可以说明发送成功吧?
回复 支持 反对

使用道具 举报

 楼主| 发表于 2014-5-17 08:29:15 | 显示全部楼层
红思雨 发表于 2014-5-11 19:03
代码概率大,可能是两者模块的参数配置不相同,导致不能正常接收。
例如地址不同,频道不同。

现在的情况就是接收的很慢,要好几分钟才接收到,这是什么情况?
回复 支持 反对

使用道具 举报

发表于 2014-5-17 08:34:55 | 显示全部楼层
誰其我舍 发表于 2014-5-17 08:29
现在的情况就是接收的很慢,要好几分钟才接收到,这是什么情况?

这么久。。你是不是作了很长的延时
回复 支持 反对

使用道具 举报

 楼主| 发表于 2014-5-17 09:09:43 | 显示全部楼层
随风 发表于 2014-5-11 15:15
NRF模块基本上你把引脚接好了就没什么硬件问题了,基本都是软件问题,可能是你STM8方面的程序没有与调好,应 ...

接收两分钟左右才会收到,是哪里设置的问题吗?
回复 支持 反对

使用道具 举报

 楼主| 发表于 2014-5-17 09:11:20 | 显示全部楼层
吕一瑾 发表于 2014-5-17 08:34
这么久。。你是不是作了很长的延时

发送端是在死循环里设置发送模式,之后发送数据。
接收端是在死循环里设置接收模式,之后接收数据,都没有延时啊。
回复 支持 反对

使用道具 举报

发表于 2016-5-7 15:31:40 | 显示全部楼层
NRF24L01无线数传软件解析http://v.youku.com/v_show/id_XMTU0NzM3ODIxNg==.html
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

联系站长|手机版|野火电子官网|野火淘宝店铺|野火电子论坛 ( 粤ICP备14069197号 ) 大学生ARM嵌入式2群

GMT+8, 2025-1-12 06:08 , Processed in 0.037470 second(s), 23 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表