本文包含原理图、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;
}}
}
}
|