|
下面的是发送程序:
#include<reg52.h>
#include<intrins.h>
typedef unsigned char uchar;
typedef unsigned int uint;
uint bdata sta;
sbit RX_DR=sta^6;
sbit TX_DS=sta^5;
sbit MAX_RT=sta^4;
//按键定义
sbit qian=P3^2;
sbit hou=P3^3;
sbit zuo=P3^4;
sbit you=P3^5;
//sbit a=P3^4;
//sbit b=P3^5;
//sbit c=P3^6;
//sbit back=P3^5;
//NRF24L01端口定义
sbit MISO =P2^1;
sbit MOSI =P2^2;
sbit SCK =P2^3;
sbit CE =P2^4;
sbit CSN =P2^5;
sbit IRQ =P2^6;
uchar TxBuf[20]={0};
//*********************************************NRF24L01*************************************
#define TX_ADR_WIDTH 5 // 本机地址宽度设置
#define RX_ADR_WIDTH 5 // 接收方地址宽度设置
#define TX_PLOAD_WIDTH 20 // 4字节数据长度
#define RX_PLOAD_WIDTH 20 // 4字节数据长度
uchar const TX_ADDRESS[TX_ADR_WIDTH]= {0x34,0x10,0x10,0x10,0x01}; //本地地址
uchar const RX_ADDRESS[RX_ADR_WIDTH]= {0x34,0x10,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(uchar t); //延迟函数
void init_nRF24L01(void); //NRF24L01初始化函数
uchar SPI_RW(uchar byte); //NRF24L01的SPI写时序函数
uchar SPI_RW_Reg(uchar reg,uchar value); //寄存器访问函数
uchar SPI_Read(uchar reg); //读取寄存器值函数
//void Set_RX_Mode(void); //数据接收配置函数
uchar SPI_Read_Buf(uchar reg,uchar *pBuf,uchar bytes); //接收缓冲区访问函数
uchar SPI_Write_Buf(uchar reg,uchar *pBuf,uchar bytes); //发射缓冲区访问函数
uchar nRF24L01_RxPacket(uchar *rx_buf); //数据读取后放缓冲区函数
void nRF24L01_TxPacket(uchar *tx_buf); //发送缓冲区数据函数
void UART_init(void);//串口初始化函数
uchar Keyscan(void); //按键检测函数
//****************函数编写**************************
//长延时函数
void delay(uchar t)
{
uchar i;
for(i=0;i<t;i++);
for(i=0;i<t;i++);
}
//指令函数
void inerdelay(uchar n)
{
for(;n>0;n--)
_nop_();
}
//NRF24L01初始化函数
void init_nRF24L01(void)
{
inerdelay(100);
CE=0; //芯片使能
CSN=1;
SCK=0;
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);
SPI_RW_Reg(WRITE_REG+EN_RXADDR ,0X01);
//SPI_RW_Reg(WRITE_REG+SETUP_RETR,0X00);
SPI_RW_Reg(WRITE_REG+RF_CH,0);
SPI_RW_Reg(WRITE_REG+RX_PW_P0,RX_PLOAD_WIDTH);
SPI_RW_Reg(WRITE_REG+RF_SETUP,0X07 );
SPI_RW_Reg(WRITE_REG+CONFIG ,0X0E );
}
//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);
}
// 寄存器访问函数
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)
{
uchar reg_val;
CSN=0;
SPI_RW(reg);
reg_val=SPI_RW(0);
CSN=1;
return(reg_val);
}
//接收缓冲区访问函数
/*uchar SPI_Read_Buf(uchar reg,uchar *pBuf,uchar bytes)
{
uchar status,byte_ctr;
CSN=0;
status=SPI_RW(reg);
for(byte_ctr=0;byte_ctr<bytes;byte_ctr++)
pBuf[byte_ctr]=SPI_RW(0);
CSN=1;
return(status);
} */
//发射缓冲区访问函数
uchar SPI_Write_Buf(uchar reg,uchar *pBuf,uchar bytes)
{
uchar status,byte_ctr;
CSN=0;
status=SPI_RW(reg);
for(byte_ctr=0;byte_ctr<bytes;byte_ctr++)
SPI_RW(*pBuf++);
CSN=1;
return (status);
}
//数据接收配置函数
/*void Set_RX_Mode(void)
{
CE=0;
SPI_RW_Reg(WRITE_REG+CONFIG,0x0f);
CE=1;
inerdelay(130);
}
//数据读取后放缓冲区函数
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;
} */
//发送缓冲区数据函数
void nRF24L01_TxPacket(uchar *tx_buf)
{
CE=0;
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);
CE=1;
inerdelay(10);
}
//****************************主函数**********************//
void main(void)
{
uchar num;
init_nRF24L01(); //NRF24L01初始化
TxBuf[0]=0xff;
nRF24L01_TxPacket(TxBuf);
delay(6000);
while(1)
{
num=0xf6;
TxBuf[0]=num;
nRF24L01_TxPacket(TxBuf);
P1=SPI_Read(STATUS);
delay(10000);
SPI_RW_Reg(WRITE_REG+STATUS,0Xff);
delay(8000);
/* if(qian==0)
{
while(!qian)
{
num=0xfa;
TxBuf[0]=num;
nRF24L01_TxPacket(TxBuf);
P1=SPI_Read(STATUS);
delay(10000);
SPI_RW_Reg(WRITE_REG+STATUS,0Xff);
delay(8000) ;
}
}
else if(hou==0)
{
while(!hou)
{
num=0xf5;
TxBuf[0]=num;
nRF24L01_TxPacket(TxBuf);
P1=SPI_Read(STATUS);
delay(10000);
SPI_RW_Reg(WRITE_REG+STATUS,0Xff);
delay(8000) ;
}
}
else if(zuo==0)
{
while(!zuo)
{
num=0xf9;
TxBuf[0]=num;
nRF24L01_TxPacket(TxBuf);
P1=SPI_Read(STATUS);
delay(10000);
SPI_RW_Reg(WRITE_REG+STATUS,0Xff);
delay(8000) ;
}
}
else if(you==0)
{
while(!you)
{
num=0xf6;
TxBuf[0]=num;
nRF24L01_TxPacket(TxBuf);
P1=SPI_Read(STATUS);
delay(10000);
SPI_RW_Reg(WRITE_REG+STATUS,0Xff);
delay(8000) ;
}
} */
TxBuf[0]=0xff;
num=0xff;
}
}
这个是接收程序:
#include<reg52.h>
#include<intrins.h>
#define uchar unsigned char
//uchar N=0;
//uchar T=50;
sbit MISO =P2^1;
sbit MOSI =P2^2;
sbit SCK =P2^3;
sbit CE =P2^4;
sbit CSN =P2^5;
sbit IRQ =P2^6;
uchar RxBuf[20]={0};
uchar bdata sta;
sbit RX_DR=sta^6;
sbit TX_DS=sta^5;
sbit MAX_RT=sta^4;
//*********************************************NRF24L01*************************************
#define TX_ADR_WIDTH 5 // 本机地址宽度设置
#define RX_ADR_WIDTH 5 // 接收方地址宽度设置
#define TX_PLOAD_WIDTH 20 // 4字节数据长度
#define RX_PLOAD_WIDTH 20 // 4字节数据长度
uchar const TX_ADDRESS[TX_ADR_WIDTH]= {0x34,0x10,0x10,0x10,0x01}; //本地地址
uchar const RX_ADDRESS[RX_ADR_WIDTH]= {0x34,0x10,0x10,0x10,0x01}; //接收地址
/* #define TX_ADR_WIDTH 5 // 本机地址宽度设置
#define RX_ADR_WIDTH 5 // 接收方地址宽度设置
#define TX_PLOAD_WIDTH 20 // 4字节数据长度
#define RX_PLOAD_WIDTH 20 // 4字节数据长度 */
//***************************************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(uchar t); //延迟函数
void init_nRF24L01(void); //NRF24L01初始化函数
uchar SPI_RW(uchar byte); //NRF24L01的SPI写时序函数
uchar SPI_RW_Reg(uchar reg,uchar value); //寄存器访问函数
uchar SPI_Read(uchar reg); //读取寄存器值函数
void Set_RX_Mode(void); //数据接收配置函数
uchar SPI_Read_Buf(uchar reg,uchar *pBuf,uchar bytes); //接收缓冲区访问函数
uchar SPI_Write_Buf(uchar reg,uchar *pBuf,uchar bytes); //发射缓冲区访问函数
uchar nRF24L01_RxPacket(uchar *rx_buf); //数据读取后放缓冲区函数
void nRF24L01_TxPacket(uchar *tx_buf); //发送缓冲区数据函数
void UART_init(void);//串口初始化函数
uchar Keyscan(void); //按键检测函数
//****************函数编写**************************
//长延时函数
void delay(uchar t)
{
uchar i;
for(i=0;i<t;i++);
for(i=0;i<t;i++);
}
//指令函数
void inerdelay(uchar n)
{
for(;n>0;n--)
_nop_();
}
//NRF24L01初始化函数
void init_nRF24L01(void)
{
inerdelay(100);
CE=0; //芯片使能
CSN=1;
SCK=0;
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);
SPI_RW_Reg(WRITE_REG+EN_RXADDR ,0X01);
SPI_RW_Reg(WRITE_REG+RF_CH,0);
SPI_RW_Reg(WRITE_REG+RX_PW_P0,RX_PLOAD_WIDTH);
SPI_RW_Reg(WRITE_REG+RF_SETUP,0X07 );
SPI_RW_Reg(WRITE_REG+CONFIG ,0X0f );
}
//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);
}
// 寄存器访问函数
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)
{
uchar reg_val;
CSN=0;
SPI_RW(reg);
reg_val=SPI_RW(0);
CSN=1;
return(reg_val);
}
//接收缓冲区访问函数
uchar SPI_Read_Buf(uchar reg,uchar *pBuf,uchar bytes)
{
uchar status,byte_ctr;
CSN=0;
status=SPI_RW(reg);
for(byte_ctr=0;byte_ctr<bytes;byte_ctr++)
pBuf[byte_ctr]=SPI_RW(0);
CSN=1;
return(status);
}
//发射缓冲区访问函数
uchar SPI_Write_Buf(uchar reg,uchar *pBuf,uchar bytes)
{
uchar status,byte_ctr;
CSN=0;
status=SPI_RW(reg);
for(byte_ctr=0;byte_ctr<bytes;byte_ctr++)
SPI_RW(*pBuf++);
CSN=1;
return (status);
}
//数据接收配置函数
void Set_RX_Mode(void)
{
CE=0;
SPI_RW_Reg(WRITE_REG+CONFIG,0x0f);
CE=1;
inerdelay(130);
}
//数据读取后放缓冲区函数
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;
}
//发送缓冲区数据函数
/*void nRF24L01_TxPacket(uchar *tx_buf)
{
CE=0;
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);
CE=1;
inerdelay(10);
} */
void main()
{
init_nRF24L01() ;
// P1=0x00;
while(1)
{
Set_RX_Mode();
P1=SPI_Read(STATUS);
if(nRF24L01_RxPacket(RxBuf))
{
P1=RxBuf[0];
delay(6400);
}
delay(6400);
}
}
问题:
1.第一个发射程序中取status状态寄存器中的值给P1口(即led灯,共阳),上电后发现灯不亮,但是弄一下电源引脚(即nrf的VCC),则有时亮P1端的5,6,7脚,有时就全亮,有时就亮0,4,5,6,7脚,为什么啊,是电源不稳定吗?按照数据手册中的来看的话,正常的应该是亮0,4,5,6,7脚,但是为什么会有时亮其他的情况呢?重新上电后又出现一开始的情况,即灯不亮,弄一下能亮,但是不稳定。
2.接收程序一上电,灯就全亮(也是共阳极的),这又是为什么呢?
这个nrf弄了很久了,很烦啊。上来论坛问问。
|
阿莫论坛20周年了!感谢大家的支持与爱护!!
知道什么是神吗?其实神本来也是人,只不过神做了人做不到的事情 所以才成了神。 (头文字D, 杜汶泽)
|