打印

nrf24l01就是弄不出来啊 求指点

[复制链接]
9629|82
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
胡斯哲|  楼主 | 2013-4-3 15:05 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 胡斯哲 于 2013-4-4 19:43 编辑

我发送者个uchar TxBuf[32]=
{
0x01,0x02,0x03,0x4,0x05,0x06,0x07,0x08,
0x09,0x10,0x11,0x12,0x13,0x14,0x15,0x16,
0x17,0x18,0x19,0x20,0x21,0x22,0x23,0x24,
0x25,0x26,0x27,0x28,0x29,0x30,0x31,0x32,
};但接收的是这个 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
这条街

相关帖子

沙发
jakfens| | 2013-4-3 17:32 | 只看该作者
。。。。。。。。只能帮顶了

使用特权

评论回复
板凳
胡斯哲|  楼主 | 2013-4-3 20:03 | 只看该作者
jakfens 发表于 2013-4-3 17:32
。。。。。。。。只能帮顶了

duO谢

使用特权

评论回复
地板
GoldSunMonkey| | 2013-4-3 23:36 | 只看该作者
这个不会啊

使用特权

评论回复
5
GoldSunMonkey| | 2013-4-3 23:36 | 只看该作者
头像喜欢啊

使用特权

评论回复
6
梅花望青竹| | 2013-4-4 00:14 | 只看该作者
你使用中断接收的吗?

使用特权

评论回复
7
胡斯哲|  楼主 | 2013-4-4 10:06 | 只看该作者
GoldSunMonkey 发表于 2013-4-3 23:36
头像喜欢啊

ehhe   我也喜欢  喜欢低头的瞬间

使用特权

评论回复
8
胡斯哲|  楼主 | 2013-4-4 10:20 | 只看该作者
梅花望青竹 发表于 2013-4-4 00:14
你使用中断接收的吗?

这个程序时抄的 网上最多的一个程序  接收是用了51单片机中断给串口发数据  没用别的中断
发送是发送32个不为00的数据 接收的时候接收到了32个00   ;当拔掉一个接收上的24l01时时  接收的全是ff
不知道问题出现在那?

使用特权

评论回复
9
梅花望青竹| | 2013-4-4 19:07 | 只看该作者
你使用NRF24L01_RxPacket 这个函数接收一个组数,别使用中断试试。

使用特权

评论回复
10
胡斯哲|  楼主 | 2013-4-4 19:25 | 只看该作者
梅花望青竹 发表于 2013-4-4 19:07
你使用NRF24L01_RxPacket 这个函数接收一个组数,别使用中断试试。

您的意思是:void main(void)
{
        uchar i,temp;
        uchar RxBuf[1];       
    init_NRF24L01() ;
        StartUART();
        Delay(6000);
        while(1)
        {

                SetRX_Mode();
                   if(nRF24L01_RxPacket(RxBuf))
                {
                LED=0;
                        temp++;
                        for(i=0;i<1;i++)
                        {
                                R_S_Byte(RxBuf);
                                Delay(6000);
                        }       
                }
                LED=1;
                Delay(6000);
        }
       
}

使用特权

评论回复
11
yanzhuangsongqi| | 2013-4-4 22:13 | 只看该作者
检查下寄存器的设置,波特率是否一致?

使用特权

评论回复
12
ichenqiang| | 2013-4-4 22:22 | 只看该作者
先调发送,确认发送没问题了,再调接收

使用特权

评论回复
13
梅花望青竹| | 2013-4-4 23:05 | 只看该作者
胡斯哲 发表于 2013-4-4 19:25
您的意思是:void main(void)
{
        uchar i,temp;

是的,你的串口波特率正确吗?可以使用液晶屏显示一下数据的。

使用特权

评论回复
14
胡斯哲|  楼主 | 2013-4-5 09:35 | 只看该作者
yanzhuangsongqi 发表于 2013-4-4 22:13
检查下寄存器的设置,波特率是否一致?

一至啊   我 if(nRF24L01_RxPacket(0x04))
显示是正确的 我贴我发的程序

使用特权

评论回复
15
胡斯哲|  楼主 | 2013-4-5 09:37 | 只看该作者
ichenqiang 发表于 2013-4-4 22:22
先调发送,确认发送没问题了,再调接收

如何判断发送是否成功呢?

使用特权

评论回复
16
胡斯哲|  楼主 | 2013-4-5 09:38 | 只看该作者
#include <reg52.h>
#include <intrins.h>

typedef unsigned char uchar;
typedef unsigned char uint;
//****************************************NRF24L01端口定义***************************************
sbit         MISO        =P1^5;
sbit         MOSI        =P1^1;
sbit        SCK            =P1^6;
sbit        CE            =P1^7;
sbit        CSN                =P1^2;
sbit        IRQ                =P1^0;
//************************************按键***************************************************
sbit        KEY1=P3^4;
//************************************蜂明器***************************************************
sbit         LED=P3^5;
//***********************************发送缓冲区*********************************************
uchar TxBuf[1]=
{ 0xaa
/*0x01,0x02,0x03,0x4,0x05,0x06,0x07,0x08,
0x09,0x10,0x11,0x12,0x13,0x14,0x15,0x16,
0x17,0x18,0x19,0x20,0x21,0x22,0x23,0x24,
0x25,0x26,0x27,0x28,0x29,0x30,0x31,0x32,*/
};         //
//*********************************************NRF24L01*************************************
#define TX_ADR_WIDTH    5           // 5 uints TX address width
#define RX_ADR_WIDTH    5           // 5 uints RX address width
#define TX_PLOAD_WIDTH  1          // 20 uints TX payload
#define RX_PLOAD_WIDTH  1          // 20 uints TX payload
uint const TX_ADDRESS[TX_ADR_WIDTH]= {0x34,0x43,0x10,0x10,0x01};        //本地地址
uint const RX_ADDRESS[RX_ADR_WIDTH]= {0x34,0x43,0x10,0x10,0x01};        //接收地址
//***************************************NRF24L01寄存器指令*******************************************************
#define READ_REG        0x00          // 读寄存器指令
#define WRITE_REG       0x20         // 写寄存器指令
#define RD_RX_PLOAD     0x61          // 读取接收数据指令
#define WR_TX_PLOAD     0xA0          // 写待发数据指令
#define FLUSH_TX        0xE1         // 冲洗发送 FIFO指令
#define FLUSH_RX        0xE2          // 冲洗接收 FIFO指令
#define REUSE_TX_PL     0xE3          // 定义重复装载数据指令
#define NOP             0xFF          // 保留
//*************************************SPI(nRF24L01)寄存器地址****************************************************
#define CONFIG          0x00  // 配置收发状态,CRC校验模式以及收发状态响应方式
#define EN_AA           0x01  // 自动应答功能设置
#define EN_RXADDR       0x02  // 可用信道设置
#define SETUP_AW        0x03  // 收发地址宽度设置
#define SETUP_RETR      0x04  // 自动重发功能设置
#define RF_CH           0x05  // 工作频率设置
#define RF_SETUP        0x06  // 发射速率、功耗功能设置
#define STATUS          0x07  // 状态寄存器
#define OBSERVE_TX      0x08  // 发送监测功能
#define CD              0x09  // 地址检测           
#define RX_ADDR_P0      0x0A  // 频道0接收数据地址
#define RX_ADDR_P1      0x0B  // 频道1接收数据地址
#define RX_ADDR_P2      0x0C  // 频道2接收数据地址
#define RX_ADDR_P3      0x0D  // 频道3接收数据地址
#define RX_ADDR_P4      0x0E  // 频道4接收数据地址
#define RX_ADDR_P5      0x0F  // 频道5接收数据地址
#define TX_ADDR         0x10  // 发送地址寄存器
#define RX_PW_P0        0x11  // 接收频道0接收数据长度
#define RX_PW_P1        0x12  // 接收频道0接收数据长度
#define RX_PW_P2        0x13  // 接收频道0接收数据长度
#define RX_PW_P3        0x14  // 接收频道0接收数据长度
#define RX_PW_P4        0x15  // 接收频道0接收数据长度
#define RX_PW_P5        0x16  // 接收频道0接收数据长度
#define FIFO_STATUS     0x17  // FIFO栈入栈出状态寄存器设置
//**************************************************************************************
void Delay(unsigned int s);
void inerDelay_us(unsigned char n);
void init_NRF24L01(void);
uint SPI_RW(uint by);
uchar SPI_Read(uchar reg);
void SetRX_Mode(void);
uint SPI_RW_Reg(uchar reg, uchar value);
uint SPI_Read_Buf(uchar reg, uchar *pBuf, uchar uchars);
uint SPI_Write_Buf(uchar reg, uchar *pBuf, uchar uchars);
unsigned char nRF24L01_RxPacket(unsigned char* rx_buf);
void nRF24L01_TxPacket(unsigned char * tx_buf);
//*****************************************长延时*****************************************
void Delay(unsigned int s)
{
        unsigned int i;
        for(i=0; i<s; i++);
        for(i=0; i<s; i++);
}
//*****************************************************************************************


uint         bdata sta;   //状态标志
sbit        RX_DR        =sta^6;
sbit        TX_DS        =sta^5;
sbit        MAX_RT        =sta^4;
/******************************************************************************************
/*延时函数
/******************************************************************************************/


void inerDelay_us(unsigned char n)
{
        for(;n>0;n--)
                _nop_();
}
//****************************************************************************************/
/*NRF24L01初始化
//***************************************************************************************/
void init_NRF24L01(void)
{
    inerDelay_us(100);
        CE=0;    // chip enable
        CSN=1;   // Spi disable
        SCK=0;   // Spi clock line init high
        SPI_Write_Buf(WRITE_REG + TX_ADDR, TX_ADDRESS, TX_ADR_WIDTH);    // 写本地地址       
        SPI_Write_Buf(WRITE_REG + RX_ADDR_P0, RX_ADDRESS, RX_ADR_WIDTH); // 写接收端地址
        SPI_RW_Reg(WRITE_REG + EN_AA, 0x01);      //  频道0自动        ACK应答允许       
        SPI_RW_Reg(WRITE_REG + EN_RXADDR, 0x01);  //  允许接收地址只有频道0,如果需要多频道可以参考Page21  
        SPI_RW_Reg(WRITE_REG + RF_CH, 0);        //   设置信道工作为2.4GHZ,收发必须一致
        SPI_RW_Reg(WRITE_REG + RX_PW_P0, RX_PLOAD_WIDTH); //设置接收数据长度,本次设置为32字节
        SPI_RW_Reg(WRITE_REG + RF_SETUP, 0x07);                   //设置发射速率为1MHZ,发射功率为最大值0dB       
        SPI_RW_Reg(WRITE_REG + CONFIG, 0x0e);                    // IRQ收发完成中断响应,16位CRC,主发送

}
/******************************************************************************************

**********
/*函数:uint SPI_RW(uint uchar)
/*功能:NRF24L01的SPI写时序
/******************************************************************************************

**********/
uint SPI_RW(uint by)
{
        uint bit_ctr;
           for(bit_ctr=0;bit_ctr<8;bit_ctr++) // output 8-bit
           {
                MOSI = (by & 0x80);         // output 'uchar', MSB to MOSI
                by = (by << 1);           // shift next bit into MSB..
                SCK = 1;                      // Set SCK high..
                by |= MISO;                         // capture current MISO bit
                SCK = 0;                              // ..then set SCK low again
           }
    return(by);                             // return read uchar
}
/******************************************************************************************

**********
/*函数:uchar SPI_Read(uchar reg)
/*功能:NRF24L01的SPI时序
/******************************************************************************************

**********/
/*uchar SPI_Read(uchar reg)
{
        uchar reg_val;
       
        CSN = 0;                // CSN low, initialize SPI communication...
        SPI_RW(reg);            // Select register to read from..
        reg_val = SPI_RW(0);    // ..then read registervalue
        CSN = 1;                // CSN high, terminate SPI communication
       
        return(reg_val);        // return register value
}
/******************************************************************************************

**********/
/*功能:NRF24L01读写寄存器函数
/******************************************************************************************

**********/
uint SPI_RW_Reg(uchar reg, uchar value)
{
        uint status;
       
        CSN = 0;                   // CSN low, init SPI transaction
        status = SPI_RW(reg);      // select register
        SPI_RW(value);             // ..and write value to it..
        CSN = 1;                   // CSN high again
       
        return(status);            // return nRF24L01 status uchar
}
/******************************************************************************************

**********/
/*函数:uint SPI_Read_Buf(uchar reg, uchar *pBuf, uchar uchars)
/*功能: 用于读数据,reg:为寄存器地址,pBuf:为待读出数据地址,uchars:读出数据的个数
/******************************************************************************************

**********/
/*uint SPI_Read_Buf(uchar reg, uchar *pBuf, uchar uchars)
{
        uint status,uchar_ctr;
       
        CSN = 0;                                    // Set CSN low, init SPI tranaction
        status = SPI_RW(reg);                       // Select register to write to and read status uchar
       
        for(uchar_ctr=0;uchar_ctr<uchars;uchar_ctr++)
                pBuf[uchar_ctr] = SPI_RW(0);    //
       
        CSN = 1;                           
       
        return(status);                    // return nRF24L01 status uchar
}
/******************************************************************************************

***************
/*函数:uint SPI_Write_Buf(uchar reg, uchar *pBuf, uchar uchars)
/*功能: 用于写数据:为寄存器地址,pBuf:为待写入数据地址,uchars:写入数据的个数
/******************************************************************************************

***************/
uint SPI_Write_Buf(uchar reg, uchar *pBuf, uchar uchars)
{
        uint status,uchar_ctr;
       
        CSN = 0;            //SPI使能      
        status = SPI_RW(reg);   
        for(uchar_ctr=0; uchar_ctr<uchars; uchar_ctr++) //
                SPI_RW(*pBuf++);
        CSN = 1;           //关闭SPI
        return(status);    //
}
/******************************************************************************************

**********/
/*函数:void SetRX_Mode(void)
/*功能:数据接收配置
/******************************************************************************************

**********/
/*void SetRX_Mode(void)
{
        CE=0;
        SPI_RW_Reg(WRITE_REG + CONFIG, 0x0f);                   // IRQ收发完成中断响应,16位CRC        ,主接收
        CE = 1;
        inerDelay_us(130);    //延时不能太短
}
/******************************************************************************************

************/
/*函数:unsigned char nRF24L01_RxPacket(unsigned char* rx_buf)
/*功能:数据读取后放如rx_buf接收缓冲区中
/******************************************************************************************

************/
/*unsigned char nRF24L01_RxPacket(unsigned char* rx_buf)
{
    unsigned char revale=0;
        sta=SPI_Read(STATUS);        // 读取状态寄存其来判断数据接收状况
        if(RX_DR)                                // 判断是否接收到数据
        {
            CE = 0;                         //SPI使能
                SPI_Read_Buf(RD_RX_PLOAD,rx_buf,TX_PLOAD_WIDTH);// read receive payload from RX_FIFO buffer
                revale =1;                        //读取数据完成标志
        }
        SPI_RW_Reg(WRITE_REG+STATUS,sta);   //接收到数据后RX_DR,TX_DS,MAX_PT都置高为1,通过写1来清楚中断标志
        return revale;
}
/******************************************************************************************

*****************
/*函数:void nRF24L01_TxPacket(unsigned char * tx_buf)
/*功能:发送 tx_buf中数据
/******************************************************************************************

****************/
void nRF24L01_TxPacket(unsigned char * tx_buf)
{
        CE=0;                        //StandBy I模式       
        SPI_Write_Buf(WRITE_REG + RX_ADDR_P0, TX_ADDRESS, TX_ADR_WIDTH); // 装载接收端地址
        SPI_Write_Buf(WR_TX_PLOAD, tx_buf, TX_PLOAD_WIDTH);                          // 装载数据       
//        SPI_RW_Reg(WRITE_REG + CONFIG, 0x0e);                    // IRQ收发完成中断响应,16位CRC,主发送
        CE=1;                 //置高CE,激发数据发送
        inerDelay_us(10);
}
//************************************主函数************************************************************
void main(void)
{
        //uchar temp =0;       
    init_NRF24L01() ;
        nRF24L01_TxPacket(TxBuf);        // Transmit Tx buffer data
        Delay(6000);
        P0=0xBF;
        while(1)
        {       
                nRF24L01_TxPacket(TxBuf);        // Transmit Tx buffer data
                LED=0;
                Delay(20000);      //可变
                SPI_RW_Reg(WRITE_REG+STATUS,0XFF);  
                LED=1;
                Delay(4000);
                }
       
}

使用特权

评论回复
17
ichenqiang| | 2013-4-5 12:13 | 只看该作者
具体操作你可以百度一下。我记不清了,我手里有调成功的msp430程序,需要的话可以给你参考

使用特权

评论回复
18
胡斯哲|  楼主 | 2013-4-5 17:02 | 只看该作者
ichenqiang 发表于 2013-4-5 12:13
具体操作你可以百度一下。我记不清了,我手里有调成功的msp430程序,需要的话可以给你参考 ...

可以给我  我又一块430  谢谢啦啦

使用特权

评论回复
19
胡斯哲|  楼主 | 2013-4-5 20:22 | 只看该作者
梅花望青竹 发表于 2013-4-4 23:05
是的,你的串口波特率正确吗?可以使用液晶屏显示一下数据的。

还是00

使用特权

评论回复
20
GoldSunMonkey| | 2013-4-5 21:55 | 只看该作者
胡斯哲 发表于 2013-4-4 10:06
ehhe   我也喜欢  喜欢低头的瞬间

;P介绍认识啊

使用特权

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

本版积分规则

个人签名:读书喝茶,不争朝夕

141

主题

1431

帖子

6

粉丝