找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 8760|回复: 16
收起左侧

求助NRF24L01一个月了,实在不知道怎么办了。电源保证3.3V

  [复制链接]
ID:78352 发表于 2015-4-28 18:22 | 显示全部楼层 |阅读模式
NRF24L01一个月了,实在不知道怎么办了。电源保证3.3V。
代码如下实在不知道哪错了,求助求助。
发送:
#include <reg51.h>
#include <intrins.h>
typedef unsigned char uchar;
typedef unsigned int uint;
//引脚定义
//====================================
sbit IRQ  =P1^0;
sbit  MISO =P1^1;
sbit  MOSI =P1^2;
sbit SCK     =P1^3;
sbit CE     =P1^5;
sbit CSN  =P1^4;
sbit LED=P1^6;
//============ 状态标志 =============
uint  bdata sta;   //状态标志
sbit RX_DR =sta^6;
sbit TX_DS =sta^5;
sbit MAX_RT =sta^4;
//================== NRF24L01的接收和发送地址 ===================
#define TX_ADR_WIDTH    5   // 5个字节的TX地址长度
#define RX_ADR_WIDTH    5   // 5个字节的RX地址长度
#define TX_PLOAD_WIDTH  32  // ?个字节的TX数据长度
#define RX_PLOAD_WIDTH  32  // ?个字节的RX数据长度
//================== 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 NRF_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栈入栈出状态寄存器设置
//==============================
//收发缓存数组
//=====================
//函数声明
//=====================
/*
#define uchar unsigned char
#define uint unsigned int
*/

#endif
//===============
//延时函数
//===============

uchar idata nrf_sta;
uchar idata RxBuf[32] =  "0"; //接收缓存 存入idata区
uchar idata TxBuf[32] =  "0"; //发送缓存

uchar const TX_ADDRESS[TX_ADR_WIDTH]= {0x34,0x43,0x10,0x10,0x01}; //本地地址
uchar const RX_ADDRESS[RX_ADR_WIDTH]= {0x34,0x43,0x10,0x10,0x01}; //接收地址
//===== 粗略的延时 =====
//================== NRF24L01初始化 ==================
//=============================================
//SPI读写函数,往MOSI引脚写入一个字节,同时从MISO引脚读取一个字节
//=============================================
void delay(unsigned int c)   //误差 0us
{
    unsigned char a, b;
//--c已经在传递过来的时候已经赋值了,所以在for语句第一句就不用赋值了--//
    for (;c>0;c--)
{
  for (b=38;b>0;b--)
  {
   for (a=130;a>0;a--);
  }
           
}
        
}
uchar SPI_RW(uchar num)
{
uchar bit_ctr;
    for(bit_ctr=0;bit_ctr<8;bit_ctr++)  
    {
  MOSI = (num & 0x80);            
  num = (num << 1);               
  SCK = 1;                        
  num |= MISO;                 
  SCK = 0;                  
    }
    return(num);                     
}
//=============================================
//SPI读寄存器函数。只有一个功能:读取reg的值并返回
//先写入寄存器地址,使SPI器件定位到该地址,
//下一次读取取出该寄存器的值,并返回该值。
//=============================================
uchar SPI_Read_Reg(uchar reg)
{
uchar reg_val;

CSN = 0;               
SPI_RW(reg);            
reg_val = SPI_RW(0);//此处的0没有什么意义,可以是1,2,3,……  
CSN = 1;               

return (reg_val);        
}
//=============================================
//SPI写寄存器函数。主要功能:往reg中写入value
//附加功能:返回寄存器的状态字
//=============================================
uchar SPI_Write_Reg(uchar reg, uchar value)
{
uchar status;
CSN = 0;               
status = SPI_RW(reg);      
SPI_RW(value);            
CSN = 1;                  
return(status);            
}
//====================================
//将SPI设备缓冲区的数据读入单片机,并保存到数组中
//连续读取nBytes个字节
//====================================
uchar SPI_Read_Buf(uchar reg, uchar *pBuf, uchar nBytes)
{
uchar status;
uchar i;
CSN = 0;
status = SPI_RW(reg);
for(i = 0;i < nBytes;i++)
  pBuf[i] = SPI_RW(0);
CSN = 1;
return(status);
}
//====================================
//将单片机有nBytes个成员的数组写入SPI设备的reg寄存器
//====================================
uchar SPI_Write_Buf(uchar reg, uchar *pBuf, uchar nBytes)
{
uchar status;
uchar i;

CSN = 0;            
status = SPI_RW(reg);   
for(i = 0; i < nBytes;i++)
  SPI_RW(pBuf[i]);
CSN = 1;           
return(status);     
}
void init_NRF24L01(void)
{
    delay(10);
  CE = 0;    // 片选使能
  CSN = 1;   // SPI使能
  SCK = 0;   // SPI时钟拉低
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_Write_Reg(WRITE_REG + EN_AA, 0x01);                                //通道0自动应答  
SPI_Write_Reg(WRITE_REG + EN_RXADDR, 0x01);                          //允许接收地址频道0
SPI_Write_Reg(WRITE_REG + RF_CH, 0x44);                                //设置信道工作频率,收发必须一致
SPI_Write_Reg(WRITE_REG + RX_PW_P0, RX_PLOAD_WIDTH);                //设置接收数据长度
SPI_Write_Reg(WRITE_REG + RF_SETUP, 0x0f);                      //设置发射速率为2MHZ,发射功率为最大值0dB
SPI_Write_Reg(WRITE_REG + NRF_CONFIG, 0x7c);       //IRQ引脚不显示中断 掉电模式  1~16CRC校验
}
//==================
//读取状态标志
//==================
void get_nrf_sta(void)
{
nrf_sta = SPI_Read_Reg(STATUS);
SPI_Write_Reg(WRITE_REG+STATUS,nrf_sta);   
}
//==================
//设置为接收模式
//==================
void nrf_RxMod(void)
{
CE = 0;
SPI_Write_Reg(WRITE_REG+STATUS,0xff); //清除中断标志
SPI_Write_Reg(FLUSH_RX,0x00);    //清除RX_FIFO寄存器
SPI_Write_Reg(WRITE_REG + NRF_CONFIG, 0x7f);//IRQ引脚不显示中断 上电 接收模式   1~16CRC校验   
CE = 1;
delay(10);
}
//==================
//把接收到的数据存入数组
//==================
void nrf_read(uchar *rx_buf)
{
  if(RX_DR == 1)      //收到数据
  {
   CE = 0;  
   SPI_Read_Buf(RD_RX_PLOAD,rx_buf,RX_PLOAD_WIDTH);//读取数据 存入数组
   SPI_Write_Reg(FLUSH_RX,0x00);//清除rx fifo寄存器
   CE = 1;
   delay(10);
  }   
}
//==================
//设置为发送模式
//==================
void nrf_TxMod(void)
{
CE = 0;
SPI_Write_Reg(WRITE_REG+STATUS,0xff);    //清除中断标志
SPI_Write_Reg(FLUSH_TX,0x00);        //清除TX_FIFO寄存器
SPI_Write_Reg(WRITE_REG + NRF_CONFIG,0x7e);  //IRQ引脚不显示中断 上电 发射模式  1~16CRC校验
CE = 1;
delay(10);
}
//==================
//发送  不做任何判断只管发送
//==================
void nrf_trans(uchar *tx_buf)
{
CE = 0;   //StandBy I模式
SPI_Write_Reg(WRITE_REG+STATUS,0xFF);  //清除所有中断
SPI_Write_Reg(FLUSH_TX,0x00);        //清除tx fifo寄存器 //===== 重要 =====
SPI_Write_Buf(WRITE_REG + RX_ADDR_P0, TX_ADDRESS, TX_ADR_WIDTH);   // 装载接收端地址
SPI_Write_Buf(WR_TX_PLOAD,tx_buf,TX_PLOAD_WIDTH);           // 装载数据
CE = 1;      //置高CE激发数据发送
delay(10);  //此延时必须有 因为从待机模式到收发模式需要时间,最大需要130us
}
//=========================
//将float数编码装载 保留4位小数
//占用5个字节 数据范围+- 65535.9999
//=========================
void nrf_load_float(uchar a,float num)
{
if(num > 0)
{
  TxBuf[a] = '+';
  TxBuf[a+1] = (uint)num/256;
  TxBuf[a+2] = (uint)num%256;
  TxBuf[a+3] = (uint)((num - (int)num)*10000)/256;
  TxBuf[a+4] = (uint)((num - (int)num)*10000)%256;
}
else if(num < 0)
{
  num = -num;
  TxBuf[a] = '-';
  TxBuf[a+1] = (uint)num/256;
  TxBuf[a+2] = (uint)num%256;
  TxBuf[a+3] = (uint)((num - (int)num)*10000)/256;
  TxBuf[a+4] = (uint)((num - (int)num)*10000)%256;
}
else
{
  TxBuf[a] = '0';
  TxBuf[a+1] = 0;
  TxBuf[a+2] = 0;
  TxBuf[a+3] = 0;
  TxBuf[a+4] = 0;
}
}
//=======================
//将接收到的float数组解码
//占用5个字节 数据范围+- 65535.9999
//=======================
float nrf_unload_float(uchar a)
{
float num;
if(RxBuf[a] == '+'){
  num = RxBuf[a+1]*256 + RxBuf[a+2]+ (float)((int)RxBuf[a+3]*256 + RxBuf[a+4])/10000.0;
}
else if(RxBuf[a] == '-'){
  num = RxBuf[a+1]*256 + RxBuf[a+2]+ (float)((int)RxBuf[a+3]*256 + RxBuf[a+4])/10000.0;
  num = -num;
}
else if(RxBuf[a] == '0')
  num = 0;

return (num);
}
//=======================
//将float数编码装载 保留2位小数
//占用3个字节 数据范围+- 255.99
//=======================
void nrf_load_sfloat(uchar a,float num)
{
if(num > 0){
  TxBuf[a] = '+';
  TxBuf[a+1] = (uchar)num;  //转换成uchar类型,自动将保留低8位,去除高位。
  TxBuf[a+2] = (uint)((num - (int)num)*100);
}
else if(num < 0){
  num = -num;
  TxBuf[a] = '-';
  TxBuf[a+1] = (uchar)num;
  TxBuf[a+2] = (uint)((num - (int)num)*100);
}
else{
  TxBuf[a] = '0';
  TxBuf[a+1] = 0;
  TxBuf[a+2] = 0;
}
}
//=======================
//将float数解码 保留2位小数
//占用3个字节 数据范围+- 255.99
//======================
float nrf_unload_sfloat(uchar a) //a是数据包在数组内的起始位置
{
float num;
if(RxBuf[a] == '+'){
  num = RxBuf[a+1]+ (float)RxBuf[a+2]/100;
}
else if(RxBuf[a] == '-'){
  num = RxBuf[a+1]+ (float)RxBuf[a+2]/100;
  num = -num;
}
else if(RxBuf[a] == '0')
  num = 0;

return (num);
}

//======================
//主函数
//======================
void main(void)
{
uint while_times = 0;
init_NRF24L01();
    LED=0;
delay(30);

while(1)
{
  //===== 发送模式 =====
  nrf_TxMod();
   TxBuf[0] = 1;  //把1存入TxBuf[0]中,然后发送出去;接收程序判断RxBuf[0]的值,等于1的话点亮LED           //【注:RxBuf数组和TxBuf数组中的元素是对应的】
  nrf_trans(TxBuf);   //将待发送的数据写入NRF24L01
   get_nrf_sta();   //获取状态标志
   if(TX_DS == 1)   //发送成功,跳出循环
   {
   TX_DS=0;
   LED=1;
   delay(30);
   LED=0;
   }
    }
}

接收:
#include <reg51.h>
#include <intrins.h>
//=========================================================================
//========== NRF24L01 IO端口定义 ==========
//SPI相关引脚在SPI.H文件内定义
//====================================
typedef unsigned char uchar;
typedef unsigned int uint;
//引脚定义
//====================================
sbit IRQ  =P1^0;
sbit  MISO =P1^1;
sbit  MOSI =P1^2;
sbit SCK     =P1^3;
sbit CE     =P1^5;
sbit CSN  =P1^4;
sbit LED=P1^6;
//============ 状态标志 =============
uint  bdata sta;   //状态标志
sbit RX_DR =sta^6;
sbit TX_DS =sta^5;
sbit MAX_RT =sta^4;
//================== NRF24L01的接收和发送地址 ===================
#define TX_ADR_WIDTH    5   // 5个字节的TX地址长度
#define RX_ADR_WIDTH    5   // 5个字节的RX地址长度
#define TX_PLOAD_WIDTH  32  // ?个字节的TX数据长度
#define RX_PLOAD_WIDTH  32  // ?个字节的RX数据长度
//================== 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 NRF_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栈入栈出状态寄存器设置
//==============================
//收发缓存数组
//=====================
//函数声明
//=====================
/*
#define uchar unsigned char
#define uint unsigned int
*/

#endif
//===============
//延时函数
//===============

uchar idata nrf_sta;
uchar idata RxBuf[32] =  "0"; //接收缓存 存入idata区
uchar idata TxBuf[32] =  "0"; //发送缓存

uchar const TX_ADDRESS[TX_ADR_WIDTH]= {0x34,0x43,0x10,0x10,0x01}; //本地地址
uchar const RX_ADDRESS[RX_ADR_WIDTH]= {0x34,0x43,0x10,0x10,0x01}; //接收地址
//===== 粗略的延时 =====
//================== NRF24L01初始化 ==================
//=============================================
//SPI读写函数,往MOSI引脚写入一个字节,同时从MISO引脚读取一个字节
//=============================================
void delay(unsigned int c)   //误差 0us
{
    unsigned char a, b;
//--c已经在传递过来的时候已经赋值了,所以在for语句第一句就不用赋值了--//
    for (;c>0;c--)
{
  for (b=38;b>0;b--)
  {
   for (a=130;a>0;a--);
  }
           
}
        
}
uchar SPI_RW(uchar num)
{
uchar bit_ctr;
    for(bit_ctr=0;bit_ctr<8;bit_ctr++)  
    {
  MOSI = (num & 0x80);            
  num = (num << 1);               
  SCK = 1;                        
  num |= MISO;                 
  SCK = 0;                  
    }
    return(num);                     
}
//=============================================
//SPI读寄存器函数。只有一个功能:读取reg的值并返回
//先写入寄存器地址,使SPI器件定位到该地址,
//下一次读取取出该寄存器的值,并返回该值。
//=============================================
uchar SPI_Read_Reg(uchar reg)
{
uchar reg_val;

CSN = 0;               
SPI_RW(reg);            
reg_val = SPI_RW(0);//此处的0没有什么意义,可以是1,2,3,……  
CSN = 1;               

return (reg_val);        
}
//=============================================
//SPI写寄存器函数。主要功能:往reg中写入value
//附加功能:返回寄存器的状态字
//=============================================
uchar SPI_Write_Reg(uchar reg, uchar value)
{
uchar status;
CSN = 0;               
status = SPI_RW(reg);      
SPI_RW(value);            
CSN = 1;                  
return(status);            
}
//====================================
//将SPI设备缓冲区的数据读入单片机,并保存到数组中
//连续读取nBytes个字节
//====================================
uchar SPI_Read_Buf(uchar reg, uchar *pBuf, uchar nBytes)
{
uchar status;
uchar i;
CSN = 0;
status = SPI_RW(reg);
for(i = 0;i < nBytes;i++)
  pBuf[i] = SPI_RW(0);
CSN = 1;
return(status);
}
//====================================
//将单片机有nBytes个成员的数组写入SPI设备的reg寄存器
//====================================
uchar SPI_Write_Buf(uchar reg, uchar *pBuf, uchar nBytes)
{
uchar status;
uchar i;

CSN = 0;            
status = SPI_RW(reg);   
for(i = 0; i < nBytes;i++)
  SPI_RW(pBuf[i]);
CSN = 1;           
return(status);     
}
void init_NRF24L01(void)
{
    delay(10);
  CE = 0;    // 片选使能
  CSN = 1;   // SPI使能
  SCK = 0;   // SPI时钟拉低
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_Write_Reg(WRITE_REG + EN_AA, 0x01);                                //通道0自动应答  
SPI_Write_Reg(WRITE_REG + EN_RXADDR, 0x01);                          //允许接收地址频道0
SPI_Write_Reg(WRITE_REG + RF_CH, 0x44);                                //设置信道工作频率,收发必须一致
SPI_Write_Reg(WRITE_REG + RX_PW_P0, RX_PLOAD_WIDTH);                //设置接收数据长度
SPI_Write_Reg(WRITE_REG + RF_SETUP, 0x0f);                      //设置发射速率为2MHZ,发射功率为最大值0dB
SPI_Write_Reg(WRITE_REG + NRF_CONFIG, 0x7c);       //IRQ引脚不显示中断 掉电模式  1~16CRC校验
}
//==================
//读取状态标志
//==================
void get_nrf_sta(void)
{
nrf_sta = SPI_Read_Reg(STATUS);
SPI_Write_Reg(WRITE_REG+STATUS,nrf_sta);   
}
//==================
//设置为接收模式
//==================
void nrf_RxMod(void)
{
CE = 0;
SPI_Write_Reg(WRITE_REG+STATUS,0xff); //清除中断标志
SPI_Write_Reg(FLUSH_RX,0x00);    //清除RX_FIFO寄存器
SPI_Write_Reg(WRITE_REG + NRF_CONFIG, 0x7f);//IRQ引脚不显示中断 上电 接收模式   1~16CRC校验   
CE = 1;
delay(10);
}
//==================
//把接收到的数据存入数组
//==================
void nrf_read(uchar *rx_buf)
{
  if(RX_DR == 1)      //收到数据
  {
   CE = 0;  
   SPI_Read_Buf(RD_RX_PLOAD,rx_buf,RX_PLOAD_WIDTH);//读取数据 存入数组
   SPI_Write_Reg(FLUSH_RX,0x00);//清除rx fifo寄存器
   CE = 1;
   delay(10);
  }   
}
//==================
//设置为发送模式
//==================
void nrf_TxMod(void)
{
CE = 0;
SPI_Write_Reg(WRITE_REG+STATUS,0xff);    //清除中断标志
SPI_Write_Reg(FLUSH_TX,0x00);        //清除TX_FIFO寄存器
SPI_Write_Reg(WRITE_REG + NRF_CONFIG,0x7e);  //IRQ引脚不显示中断 上电 发射模式  1~16CRC校验
CE = 1;
delay(10);
}
//==================
//发送  不做任何判断只管发送
//==================
void nrf_trans(uchar *tx_buf)
{
CE = 0;   //StandBy I模式
SPI_Write_Reg(WRITE_REG+STATUS,0xFF);  //清除所有中断
SPI_Write_Reg(FLUSH_TX,0x00);        //清除tx fifo寄存器 //===== 重要 =====
SPI_Write_Buf(WRITE_REG + RX_ADDR_P0, TX_ADDRESS, TX_ADR_WIDTH);   // 装载接收端地址
SPI_Write_Buf(WR_TX_PLOAD,tx_buf,TX_PLOAD_WIDTH);           // 装载数据
CE = 1;      //置高CE激发数据发送
delay(10);  //此延时必须有 因为从待机模式到收发模式需要时间,最大需要130us
}
//=========================
//将float数编码装载 保留4位小数
//占用5个字节 数据范围+- 65535.9999
//=========================
void nrf_load_float(uchar a,float num)
{
if(num > 0)
{
  TxBuf[a] = '+';
  TxBuf[a+1] = (uint)num/256;
  TxBuf[a+2] = (uint)num%256;
  TxBuf[a+3] = (uint)((num - (int)num)*10000)/256;
  TxBuf[a+4] = (uint)((num - (int)num)*10000)%256;
}
else if(num < 0)
{
  num = -num;
  TxBuf[a] = '-';
  TxBuf[a+1] = (uint)num/256;
  TxBuf[a+2] = (uint)num%256;
  TxBuf[a+3] = (uint)((num - (int)num)*10000)/256;
  TxBuf[a+4] = (uint)((num - (int)num)*10000)%256;
}
else
{
  TxBuf[a] = '0';
  TxBuf[a+1] = 0;
  TxBuf[a+2] = 0;
  TxBuf[a+3] = 0;
  TxBuf[a+4] = 0;
}
}
//=======================
//将接收到的float数组解码
//占用5个字节 数据范围+- 65535.9999
//=======================
float nrf_unload_float(uchar a)
{
float num;
if(RxBuf[a] == '+'){
  num = RxBuf[a+1]*256 + RxBuf[a+2]+ (float)((int)RxBuf[a+3]*256 + RxBuf[a+4])/10000.0;
}
else if(RxBuf[a] == '-'){
  num = RxBuf[a+1]*256 + RxBuf[a+2]+ (float)((int)RxBuf[a+3]*256 + RxBuf[a+4])/10000.0;
  num = -num;
}
else if(RxBuf[a] == '0')
  num = 0;

return (num);
}
//=======================
//将float数编码装载 保留2位小数
//占用3个字节 数据范围+- 255.99
//=======================
void nrf_load_sfloat(uchar a,float num)
{
if(num > 0){
  TxBuf[a] = '+';
  TxBuf[a+1] = (uchar)num;  //转换成uchar类型,自动将保留低8位,去除高位。
  TxBuf[a+2] = (uint)((num - (int)num)*100);
}
else if(num < 0){
  num = -num;
  TxBuf[a] = '-';
  TxBuf[a+1] = (uchar)num;
  TxBuf[a+2] = (uint)((num - (int)num)*100);
}
else{
  TxBuf[a] = '0';
  TxBuf[a+1] = 0;
  TxBuf[a+2] = 0;
}
}
//=======================
//将float数解码 保留2位小数
//占用3个字节 数据范围+- 255.99
//======================
float nrf_unload_sfloat(uchar a) //a是数据包在数组内的起始位置
{
float num;
if(RxBuf[a] == '+'){
  num = RxBuf[a+1]+ (float)RxBuf[a+2]/100;
}
else if(RxBuf[a] == '-'){
  num = RxBuf[a+1]+ (float)RxBuf[a+2]/100;
  num = -num;
}
else if(RxBuf[a] == '0')
  num = 0;

return (num);
}

//======================
//主函数
//======================
void main(void)
{
uint while_times = 0;
init_NRF24L01();
    LED=0;
delay(30);

while(1)
    {
  nrf_RxMod();
   get_nrf_sta();   //获取状态标志
   if(RX_DR == 1)   //接收成功
   {
            LED=1;
            delay(30);     //跳出循环
            LED=0;
            }
    }
}
求助求助,QQ514509535

回复

使用道具 举报

ID:74784 发表于 2015-4-28 19:19 | 显示全部楼层
你的代码太长
看的头晕
................................
回复

使用道具 举报

ID:75782 发表于 2015-4-29 08:22 | 显示全部楼层
没事时间看代码呀,只能给你个建议,借助仪器,示波器,看一下发射的数据是否正常(CLK 和MOSI),然后看是否能够收到数据(收发数据引脚是否有电平变化),最后分析收到的数据是否正确(clk和MISO)。

评分

参与人数 1黑币 +35 收起 理由
admin + 35 回帖助人的奖励!

查看全部评分

回复

使用道具 举报

ID:69862 发表于 2015-4-29 09:18 | 显示全部楼层
我专治这种病,今天外出,回来治哈。可以联系QQ:939740651

评分

参与人数 1黑币 +35 收起 理由
admin + 35 回帖助人的奖励!

查看全部评分

回复

使用道具 举报

ID:69862 发表于 2015-4-29 23:14 | 显示全部楼层
这个问题我来回答一下:
1、首先你要先弄明白那几个函数的作用,这个跟STM32一样的有现成的函数了,只需要明白怎么用就行了。
2、要操作NRF24L01要先明白SPI通信的过程,如何实现主从的数据交换?如何把从器件的数据读出来?
3、在调试NRF24L01的时候,千万不要一开始就收、发一起调试,要先调试发送,能成功发送数据再调试接收。
4、NRF24L01有接收应答和自动重发功能,那么没有接收如何才能调试发送呢?这里就要先关闭接收应答自动重发功能,这里如何关闭,我就不多说了,网上有资料,找一份看看吧。
5、关闭了上面两个功能,就可以单独调试发送了,没有接收端如何才能知道发送呢?NRF24L01芯片自带有寄存器,一但发送成功了,相应的寄存器会置1,就用软件去查询这个位,就知道了。
6、如果上面的发送端能够成功了,那就好办了,就让发送端一直发,不用管,现在安心的来调试接收端了、如果接收端设置正确,就会成功的接收到数据了。
7、收、发都能成功后,把上面两个关闭的功能打开,这样就完成了一次无线调试,是不是感觉非常的好。

说在后面:在调试无线的时候,一定不要收发一起调试,这个是很多初学者都会出现的问题。

评分

参与人数 1黑币 +35 收起 理由
admin + 35 回帖助人的奖励!

查看全部评分

回复

使用道具 举报

ID:78515 发表于 2015-4-30 14:16 | 显示全部楼层
楼上说的对,NRF24L01对于用户来言底层函数会调用会修改就可以了,2.4G模块一般模块公司提供现成的例程文件,拿过来直接用就可以了,常用的底层模块都有,做简单修改就行了。
给你个参考网站去看看:安阳市新世纪电子研究所  
咨询电话:0372-3326775   QQ:2376726675

评分

参与人数 1黑币 +35 收起 理由
admin + 35 回帖助人的奖励!

查看全部评分

回复

使用道具 举报

ID:78646 发表于 2015-5-2 12:28 | 显示全部楼层
太多了吧
回复

使用道具 举报

ID:79154 发表于 2015-5-7 08:23 | 显示全部楼层
还不会呢,看的晕晕乎乎的。
回复

使用道具 举报

ID:79164 发表于 2015-5-7 10:04 | 显示全部楼层
代码好长呀,看了好久
回复

使用道具 举报

ID:83083 发表于 2015-8-11 23:57 | 显示全部楼层
其实我想问一下。单片机芯片的电压是5V但是无线模块的电压是3.3V这样会不会影响数据的发送
回复

使用道具 举报

ID:88247 发表于 2015-8-13 10:18 | 显示全部楼层
初始化2401把ce拉高看
回复

使用道具 举报

ID:72995 发表于 2015-8-25 19:50 | 显示全部楼层
这种程序网上多得是,你可以换一个试试,最好找那种实验板的教程,那里的程序一般不会出错,然后发送和接收分别测试,你可以通过串口观察发送和接收是否对应
回复

使用道具 举报

ID:153199 发表于 2016-12-31 15:03 | 显示全部楼层
问题解决了吗、分享经验
回复

使用道具 举报

ID:68499 发表于 2016-12-31 18:43 | 显示全部楼层
已经调通了的。用的89c52和lcd1602.根据需要改吧,当时是为了测试改的,有点乱。后来移植的延时不一样,你估计会出问题。

NRF24L01P一对一发送和接收.rar

107.51 KB, 下载次数: 45

回复

使用道具 举报

ID:159118 发表于 2016-12-31 20:02 | 显示全部楼层

代码好长呀,看了好久
回复

使用道具 举报

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

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

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