NRF24L01收发程序文档格式.docx
《NRF24L01收发程序文档格式.docx》由会员分享,可在线阅读,更多相关《NRF24L01收发程序文档格式.docx(10页珍藏版)》请在冰点文库上搜索。
PB6)#defineRead_24L01_MISOPINB&
(1<
PB6)
//#defineNRF24L01_MOSIPB5//输出1
#defineHign_24L01_MOSIPORTB|=(1<
PB5)#defineLow_24L01_MOSIPORTB&
PB5)#defineRead_24L01_MOSIPINB&
PB5)
//#defineNRF24L01_SCKPB7//输出1
#defineHign_24L01_SCKPORTB|=(1<
PB7)#defineLow_24L01_SCKPORTB&
PB7)#defineRead_24L01_SCKPINB&
PB7);
//#defineNRF24L01_CSNPB4//输出1
#defineLow_24L01_CSNPORTB&
PB4)#defineHign_24L01_CSNPORTB|=(1<
PB4)
//#defineNRF24L01_CEPB3//输出1
#defineHign_24L01_CEPORTB|=(1<
PB3)#defineLow_24L01_CEPORTB&
PB3)#defineRead_24L01_CEPINB&
PB3)
//*********************************************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<
DD_MOSI)|(1<
DD_SCK)|(1<
DD_SS)|(1<
CE);
//设置MOSI,SCK,SS.CE为OUTPUT,其它为INPUT
DDR_SPI&
=~((1<
DD_MISO)|(1<
IRQ));
SPCR=(1<
SPE)|(1<
MSTR)|(1<
SPR0);
//使能SPI接口,主机模式,MSB低位在前,模式0,16
分频,SPI时钟1MHZ
SPSR=0;
}
//**************************************************//*******ucharSPI_RW(uchardate)读写SPI
//**************************************************ucharSPI_RW(uchardate)
SPDR=date;
while(!
(SPSR&
(1<
SPIF)));
returnSPDR;
//**************************************************//*******ucharSPI_Read(ucharreg)读24L01寄存器
//**************************************************ucharSPI_Read(ucharreg)
ucharreg_val;
Low_24L01_CSN;
SPI_RW(reg);
reg_val=SPI_RW(0);
return(reg_val);
//**************************************************//*******ucharSPI_RW_Reg(ucharreg,ucharvalue)//写24L01寄存器
//**************************************************
ucharSPI_RW_Reg(ucharreg,ucharvalue)
ucharstatus;
status=SPI_RW(reg);
SPI_RW(value);
return(status);
//**************************************************//*******ucharSPI_Read_Buf(ucharreg,uchar*pBuf,ucharbites)
//读24L01寄存器BUFF
//**************************************************ucharSPI_Read_Buf(ucharreg,uchar*pBuf,ucharbites){
uintstatus1,uchar_ctr;
status1=SPI_RW(reg);
for(uchar_ctr=0;
uchar_ctr<
bites;
uchar_ctr++)
pBuf[uchar_ctr]=SPI_RW(0);
return(status1);
//**************************************************//*******ucharSPI_Write_Buf(ucharreg,uchar*pBuf,ucharbites)
//写24L01寄存器BUFF
//**************************************************ucharSPI_Write_Buf(ucharreg,uchar*pBuf,ucharbites){
ucharstatus1,uchar_ctr;
//SPI使能
uchar_ctr<
uchar_ctr++)//
SPI_RW(*pBuf++);
//关闭SPI
//
//**************************************************//*******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?
//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;
//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+SETUP_RETR,0x1f);
//500+86us
SPI_RW_Reg(WRITE_REG+RF_CH,0);
SPI_RW_Reg(WRITE_REG+CONFIG,0x0e);
//IRQ收发完成中断响应,16位CRC,主发送
delayms
(2);
//置高CE,激发数据发送
delayus(10);
voidinit_NRF24L01(void)
spi_init();
//空闲模式
//SPI关闭
Low_24L01_SCK;
//关闭时钟
发送程序:
RF24L01.H"
voidmain(void)
ucharsta;
ucharTX_BUF[32]={'
s'
'
u'
c'
e'
f'
l'
!
'
};
delayms(22);
init_NRF24L01();
while
(1)
nRF24L01_TxPacket(TX_BUF);
delayms(50);
接收程序:
#include"
voidmain()
ucharsta,i;
ucharRX_BUF[32];
LcdIni();
SetRX_Mode();
if(nRF24L01_RxPacket(RX_BUF))
for(i=0;
i<
11;
i++)
write_com(0x80+i);
write_data(RX_BUF[i]);