找回密码
 注册会员
更新自动建库工具PCB Footprint Expert 2024.04 Pro / Library Expert 破解版

关于nrf24l01问题求助

[复制链接]
小白鱼 发表于 2013-10-2 18:52:22 | 显示全部楼层 |阅读模式

本文包含原理图、PCB、源代码、封装库、中英文PDF等资源

您需要 登录 才可以下载或查看,没有账号?注册会员

×
本人刚刚学nrf24l01想弄一个简单的程序试一下,程序的功能是按下一块开放板的按键另一块开放板的蜂鸣器就响,可是就是不成功,已经调试了两周了,就是找不出问题所在,求大神指教!
程序如下:
#include<reg52.h>
#include<intrins.h>
#define uchar unsigned char
//*********************************************NRF24L01*************************************
#define TX_ADR_WIDTH 5
#define RX_ADR_WIDTH 5
#define TX_PLOAD_WIDTH 20
#define RX_PLOAD_WIDTH 20
uchar const TX_ADDRESS[TX_ADR_WIDTH]={0x34,0x43,0x10,0x10,0x01};
uchar rx_buf[TX_PLOAD_WIDTH];
uchar tx_buf[RX_PLOAD_WIDTH];

//****************************************IO端口定义***************************************
sbit IRQ=P1^3;
sbit CE=P1^4;
sbit MOSI=P1^5;
sbit SCK=P1^6;
sbit MISO=P1^7;
sbit CSN=P3^3;
sbit k1=P3^4;
sbit k2=P3^5;
sbit beep=P2^3;

//***************************************NRF24L01寄存器指令*******************************************************

#define READ_REG        0x00
#define WRITE_REG       0x20
#define RD_RX_PLOAD     0x61
#define WR_TX_PLOAD     0xa0
#define FLUSH_TX        0xe1
#define FLUSH_RX        0xe2
#define REUSE_TX_PL     0xe3
#define NOP             0Xff

//*************************************SPI(nRF24L01)寄存器地址****************************************************

#define CONFIG          0x00
#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
#define RX_ADDR_P1      0x0b
#define RX_ADDR_P2      0x0c
#define RX_ADDR_P3      0x0d
#define RX_ADDR_P4      0x0e
#define RX_ADDR_P5      0x0f
#define TX_ADDR         0x10
#define RX_RW_P0        0x11
#define RX_RW_P1        0x12
#define RX_RW_P2        0x13
#define RX_RW_P3        0x14
#define RX_RW_P4        0x15
#define RX_RW_P5        0x16
#define FIFO_STASTUS    0x17

//******************************************************************************************

uchar bdata sta ;
sbit RX_DR=sta^6;
sbit TX_DS=sta^5;
sbit MAX_RT=sta^4;

/******************************************************************************************
/*延时函数
/******************************************************************************************/

void inerDelay_us(uchar n)
{
for(;n>0;n--)
_nop_();
}

void delay()
{
uchar i,j;
for(j=20;j>0;j--)
for(i=248;i>0;i--);
}

//****************************************************************************************
/*NRF24L01初始化
//***************************************************************************************/

void init_io(void)
{
inerDelay_us(100);
CE=0;
CSN=1;
SCK=0;
}

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

uchar SPI_RW(uchar byte)
{
uchar bit_ctr;
for(bit_ctr=0;bit_ctr<8;bit_ctr++)
{
MOSI=(byte&0x80);
byte=(byte<<1);
SCK=1;
byte|=MISO;
SCK=0;
}
return(byte);
}
/****************************************************************************************************/
/*功能:NRF24L01读写寄存器函数
/****************************************************************************************************/

uchar SPI_RW_Reg(uchar reg,uchar value)
{
uchar status;
CSN=0;
status=SPI_RW(reg);
SPI_RW(value);
CSN=1;
return(status);
}

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

uchar SPI_Read(uchar reg)
{
uchar reg_val;
CSN=0;
SPI_RW(reg);
reg_val=SPI_RW(0);
CSN=1;
return(reg_val);
}

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

uchar SPI_Read_Buf(uchar reg, uchar * pBuf, uchar bytes)
{
uchar status, i;
   CSN = 0;                    // CSN置低,开始传输数据
   status = SPI_RW(reg);       // 选择寄存器,同时返回状态字
   for(i=0; i<bytes; i++)
     pBuf = SPI_RW(0);    // 逐个字节从nRF24L01读出
   CSN = 1;                    // CSN拉高,结束数据传输
   return(status);             // 返回状态寄存器
}

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

uchar SPI_Write_Buf(uchar reg,uchar *pBuf,uchar uchars)
{
uchar status,uchar_ctr;
CSN=0;
status=SPI_RW(reg);
for(uchar_ctr=0;uchar_ctr<uchars;uchar_ctr++)
SPI_RW(*pBuf++);
CSN=1;
return(status);
}

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

void RX_Mode(void)
{
CE=0;
SPI_Write_Buf(WRITE_REG+RX_ADDR_P0,TX_ADDRESS,TX_ADR_WIDTH);
SPI_RW_Reg(WRITE_REG+EN_AA,0x01);
SPI_RW_Reg(WRITE_REG+EN_RXADDR,0x01);
SPI_RW_Reg(WRITE_REG+RF_CH,0x40);
SPI_RW_Reg(WRITE_REG+RX_RW_P0,TX_PLOAD_WIDTH);
SPI_RW_Reg(WRITE_REG+RF_SETUP,0x07);
SPI_RW_Reg(WRITE_REG+CONFIG,0x0f);
CE=1;
inerDelay_us(130);
}

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

void nRF24L01_TxPacket(uchar *tx_buf)
{
CE=0;
SPI_Write_Buf(WRITE_REG+TX_ADDR,TX_ADDRESS,TX_ADR_WIDTH);
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+EN_AA,0x01);
SPI_RW_Reg(WRITE_REG+EN_RXADDR,0x01);
SPI_RW_Reg(WRITE_REG+SETUP_RETR,0x1a);
SPI_RW_Reg(WRITE_REG+RF_CH,0x40);
SPI_RW_Reg(WRITE_REG+RF_SETUP,0x07);
SPI_RW_Reg(WRITE_REG+CONFIG,0x0e);
CE=1;
inerDelay_us(10);
sta=SPI_Read(STATUS);
SPI_RW_Reg(WRITE_REG+STATUS,sta);
}

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

uchar nRF24L01_RxPacket(uchar *rx_buf)
{
uchar revale=0;
sta=SPI_Read(STATUS);
if(RX_DR)
{
CE=0;
SPI_Read_Buf(RD_RX_PLOAD,rx_buf,TX_PLOAD_WIDTH);
revale=1;
}
SPI_RW_Reg(WRITE_REG+STATUS,sta);
return revale;
}

//************************************主函数************************************************************

main()
{
init_io();
RX_Mode();
while(1)
{
if(k1==0)
{
delay();
if(k1==0)
{
tx_buf[0]=1;
nRF24L01_TxPacket(tx_buf);
}}
nRF24L01_RxPacket(rx_buf);
if(rx_buf[0]==1)
beep=0;
if(k2==0)
{
delay();
if(k2==0)
{
rx_buf[0]=0;
beep=1;
}}
}
  }


365567240 发表于 2014-3-12 21:02:00 | 显示全部楼层
+++++++++++++++++++++++++++++
*滑块验证:
您需要登录后才可以回帖 登录 | 注册会员

本版积分规则

QQ|手机版|MCU资讯论坛 ( 京ICP备18035221号-2 )|网站地图

GMT+8, 2024-12-23 13:35 , Processed in 0.053934 second(s), 10 queries , Redis On.

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

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