//*********************************************NRF24L01***********************
**************
#defineTX_ADR_WIDTH5//发送地址长度,最大长度为55*8=40bit#defineRX_ADR_WIDTH5//接收地址长度
#defineTX_PLOAD_WIDTH32//发送字节长度,
#defineRX_PLOAD_WIDTH32//接收字节长度
ucharTX_ADDRESS[TX_ADR_WIDTH]={0x34,0x43,0x10,0x10,0x01};//发送地址
ucharRX_ADDRESS[RX_ADR_WIDTH]={0x34,0x43,0x10,0x10,0x01};//接收地址//***************************************NRF24L01寄存器指令*******************************************************
#defineREAD_REG0x00//读寄存器指令
#defineWRITE_REG0x20//写寄存器指令
#defineRD_RX_PLOAD0x61//读取接收数据指令
#defineWR_TX_PLOAD0xA0//写待发数据指令
#defineFLUSH_TX0xE1//冲洗发送FIFO指令
#defineFLUSH_RX0xE2//冲洗接收FIFO指令
#defineREUSE_TX_PL0xE3//定义重复装载数据指令#defineNOP0xFF//保留
//*************************************SPI(nRF24L01)寄存器地址****************************************************
#defineCONFIG0x00//配置收发状态,CRC校验模式以及收发状态响应方式#defineEN_AA0x01//自动应答功能设置
#defineEN_RXADDR0x02//可用信道设置
#defineSETUP_AW0x03//收发地址宽度设置
#defineSETUP_RETR0x04//自动重发功能设置
#defineRF_CH0x05//工作频率设置
#defineRF_SETUP0x06//发射速率、功耗功能设置#defineSTATUS0x07//状态寄存器
#defineOBSERVE_TX0x08//发送监测功能
#defineCD0x09//地址检测#defineRX_ADDR_P00x0A//频道0接收数据地址
#defineRX_ADDR_P10x0B//频道1接收数据地址
#defineRX_ADDR_P20x0C//频道2接收数据地址
#defineRX_ADDR_P30x0D//频道3接收数据地址
#defineRX_ADDR_P40x0E//频道4接收数据地址
#defineRX_ADDR_P50x0F//频道5接收数据地址
#defineTX_ADDR0x10//发送地址寄存器
#defineRX_PW_P00x11//接收频道0接收数据长度#defineRX_PW_P10x12//接收频道0接收数据长度#defineRX_PW_P20x13//接收频道0接收数据长度#defineRX_PW_P30x14//接收频道0接收数据长度#defineRX_PW_P40x15//接收频道0接收数据长度#defineRX_PW_P50x16//接收频道0接收数据长度#defineFIFO_STATUS0x17//FIFO栈入栈出状态寄存器设置//*************************************************************
//*************************************************
//*******voidspi_init()初始化SPI
//**************************************************voidspi_init()
{
Hign_24L01_CSN;
DDR_SPI=(1<DDR_SPI&=~((1<SPCR=(1<分频,SPI时钟1MHZ
SPSR=0;
}
//**************************************************//*******ucharSPI_RW(uchardate)读写SPI
//**************************************************ucharSPI_RW(uchardate)
{
SPDR=date;
while(!
(SPSR&(1<returnSPDR;
}
//**************************************************//*******ucharSPI_Read(ucharreg)读24L01寄存器
//**************************************************ucharSPI_Read(ucharreg)
{
ucharreg_val;
Low_24L01_CSN;
SPI_RW(reg);
reg_val=SPI_RW(0);
Hign_24L01_CSN;
return(reg_val);
}
//**************************************************//*******ucharSPI_RW_Reg(ucharreg,ucharvalue)//写24L01寄存器
//**************************************************
ucharSPI_RW_Reg(ucharreg,ucharvalue)
{
ucharstatus;
Low_24L01_CSN;
status=SPI_RW(reg);
SPI_RW(value);
Hign_24L01_CSN;
return(status);
}
//**************************************************//*******ucharSPI_Read_Buf(ucharreg,uchar*pBuf,ucharbites)
//读24L01寄存器BUFF
//**************************************************ucharSPI_Read_Buf(ucharreg,uchar*pBuf,ucharbites){
uintstatus1,uchar_ctr;
Low_24L01_CSN;
status1=SPI_RW(reg);
for(uchar_ctr=0;uchar_ctrpBuf[uchar_ctr]=SPI_RW(0);
Hign_24L01_CSN;
return(status1);
}
//**************************************************//*******ucharSPI_Write_Buf(ucharreg,uchar*pBuf,ucharbites)
//写24L01寄存器BUFF
//**************************************************ucharSPI_Write_Buf(ucharreg,uchar*pBuf,ucharbites){
ucharstatus1,uchar_ctr;
Low_24L01_CSN;//SPI使能
status1=SPI_RW(reg);
for(uchar_ctr=0;uchar_ctrSPI_RW(*pBuf++);
Hign_24L01_CSN;//关闭SPI
return(status1);//
}
//**************************************************//*******voidSetRX_Mode(void)
//接收模式设置
//**************************************************voidSetRX_Mode(void)
{
Low_24L01_CE;
SPI_Write_Buf(WRITE_REG+RX_ADDR_P0,RX_ADDRESS,RX_ADR_WIDTH);//写接
收地址
SPI_RW_Reg(WRITE_REG+EN_AA,0x01);//0通道自动应答
SPI_RW_Reg(WRITE_REG+EN_RXADDR,0x01);//数据通道0
SPI_RW_Reg(WRITE_REG+RF_CH,0);//射频通道
SPI_RW_Reg(WRITE_REG+RX_PW_P0,RX_PLOAD_WIDTH);//写通道0接受数据长度
SPI_RW_Reg(WRITE_REG+RF_SETUP,0x07);//0db1M
SPI_RW_Reg(WRITE_REG+CONFIG,0x0f);//接收模式
Hign_24L01_CE;//开始接收
delayus(200);//注意不能太小
}
//**************************************************//*******ucharnRF24L01_RxPacket(uchar*rx_buf)//接收数据包
//**************************************************ucharnRF24L01_RxPacket(uchar*rx_buf)
{
ucharsta,flag=0;
sta=SPI_Read(STATUS);//读取状态寄存其来判断数据接收状况
if(sta&0x40)//判断是否接收到数据RX_DR==1?
{
Low_24L01_CE;//StandByI模式
SPI_Read_Buf(RD_RX_PLOAD,rx_buf,TX_PLOAD_WIDTH);//readreceivepayload
fromRX_FIFObuffer
flag=1;//读取数据完成标志
}
SPI_RW_Reg(WRITE_REG+STATUS,sta);//接收到数据后RX_DR,TX_DS,MAX_PT都置高为1,通过写1来清楚中断标志
return(flag);
}
//**************************************************
//*******voidnRF24L01_TxPacket(uchar*tx_buf)//发送数据包
//**************************************************voidnRF24L01_TxPacket(uchar*tx_buf){
ucharsta=0;
ucharflag=0;
Low_24L01_CE;//StandByI模式
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,0x1f);//500+86us
SPI_RW_Reg(WRITE_REG+RF_CH,0);//
SPI_RW_Reg(WRITE_REG+RF_SETUP,0x07);//
SPI_RW_Reg(WRITE_REG+CONFIG,0x0e);//IRQ收发完成中断响应,16位CRC,主发送
delayms
(2);
Hign_24L01_CE;//置高CE,激发数据发送
delayus(10);
Low_24L01_CE;
}
voidinit_NRF24L01(void)
{
spi_init();
Low_24L01_CE;//空闲模式
Hign_24L01_CSN;//SPI关闭
Low_24L01_SCK;//关闭时钟
}
发送程序:
#include"RF24L01.H"
voidmain(void)
{
ucharsta;
ucharTX_BUF[32]={'s','u','c','c','e','s','s','f','u','l','!
'};
delayms(22);
init_NRF24L01();
while
(1)
{
nRF24L01_TxPacket(TX_BUF);
delayms(50);
}
}
接收程序:
#include"RF24L01.H"
voidmain()
{
ucharsta,i;
ucharRX_BUF[32];
init_NRF24L01();
LcdIni();
while
(1)
{
SetRX_Mode();
if(nRF24L01_RxPacket(RX_BUF))
{
for(i=0;i<11;i++)
{
write_com(0x80+i);
write_data(RX_BUF[i]);
}
}
delayms(50);
}
}