nrf24l01程序.docx
《nrf24l01程序.docx》由会员分享,可在线阅读,更多相关《nrf24l01程序.docx(12页珍藏版)》请在冰豆网上搜索。
nrf24l01程序
//SPI(nRF24L01)命令定义
#defineREAD_REG0x00//定义读寄存器命令
#defineWRITE_REG0x20//定义写寄存器命令
#defineRD_RX_PLOAD0x61//定义接收有效载荷寄存器
#defineWR_TX_PLOAD0xA0//定义发送有效载荷寄存器
#defineFLUSH_TX0xE1//定义清除发送寄存器命令
#defineFLUSH_RX0xE2//定义清除接收寄存器命令
#defineREUSE_TX_PL0xE3//定义复用发送有效载荷寄存器命令
#defineNOP10xFF//定义空操作,用于读取状态寄存器
//SPI(nRF24L01)registers(addresses)
#defineCONFIG0x00//“配置寄存器”地址
#defineEN_AA0x01//“使能自动应答寄存器”地址
#defineEN_RXADDR0x02//“使能接收地址寄存器”地址
#defineSETUP_AW0x03//“设置地址长度寄存器”地址
#defineSETUP_RETR0x04//“设置自动重发寄存器”地址
#defineRF_CH0x05//“RF(射频)频道寄存器”地址
#defineRF_SETUP0x06//“RF(射频)设置寄存器”地址
#defineSTATUS_24L010x07//“状态寄存器”地址
#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//”通道1有效载荷长度寄存器“地址
#defineRX_PW_P20x13//”通道2有效载荷长度寄存器“地址
#defineRX_PW_P30x14//”通道3有效载荷长度寄存器“地址
#defineRX_PW_P40x15//”通道4有效载荷长度寄存器“地址
#defineRX_PW_P50x16//”通道5有效载荷长度寄存器“地址
#defineFIFO_STATUS0x17//“FIFO状态寄存器的寄存器”地址
//**-------------------------------
#defineTX_ADR_WIDTH5//发送地址字节数
#defineRX_PLOAD_WIDTH16//接收数据字节数
#defineTX_PLOAD_WIDTH16//发送数据字节数
#defineMAX_CONTROL_NUMBER2//2lineconcrol2relayremotecontrol
#defineNOP_nop_();
#defineNOP5NOP;NOP;NOP;NOP;NOP;
#defineNOP10NOP5;NOP5;
#defineNOP20NOP10;NOP10;
#definedelay_130us()NOP20;NOP20;NOP20;NOP20;NOP20;NOP20;NOP10;
#defineucharunsignedchar
#defineBYTEunsignedchar
sbitCE=P2^2;
sbitCSN=P2^3;
sbitSCK=P2^4;
sbitMOSI=P2^5;
sbitMISO=P2^6;//数据输入引脚
sbitIRQ_24L01=P2^7;//spi通讯端口定义
/**---------------------------------*/
unsignedcharTX_ADDRESS[5]={
0x1,0x02,0x03,0x04,0x05
};
unsignedcharRX_ADDRESS[5]={
0x01,0x02,0x03,0x04,0x05
};
/*_________________________________*/
voidnRF24L01_Config(void);//配置函数
ucharSPI_RW(ucharbyte);//写一个字节到24L01,同时读出一个字节
//ucharSPI_READ_Reg(BYTEreg);//读出寄存器的值
ucharSPI_RW_Reg(BYTEreg,BYTEvalue);//向寄存器reg写一个字节,同时返回状态字节
ucharSPI_Read_Buf(BYTEreg,BYTE*pBuf,BYTEbytes);//nRF24L01读出字节
ucharSPI_Write_Buf(BYTEreg,BYTE*pBuf,BYTEbytes);//nRF24L01写入字节
unsignedcharnRF24L01_RxPacket(unsignedchar*rx_buf);//nRF24L01数据接收
voidnRF24L01_TxPacket(unsignedchar*tx_buf);//nRF24L01数据发送
bitrec_validate_end(void);//接收数据完成后进行校正处理
voidset_24L01_rec_mode(void);
//voidtest_24l01_irq(void);//测试nRF24L01
/*-----------------------------*
公司名称:
xxxxxx
函数名称:
nRF24L01数据读/写
函数功能:
写一个字节到24L01,同时读出一个字节
设计时间:
设计者:
------------------------------*/
ucharSPI_RW(ucharbyte)
{
ucharbit_ctr;
bit_ctr=0;
for(bit_ctr=0;bit_ctr<8;bit_ctr++)//output8-bit
{
MOSI=(byte&0x80);//waitoutput'byte',MSBtoMOSI
byte=(byte<<1);//shiftnextbitintoMSB..
SCK=1;//SetSCKhigh..
//--------------------------
MISO=1;
NOP5;
///-------------------------
byte|=MISO;//readcapturecurrentMISObit
SCK=0;//..thensetSCKlowagain
}
return(byte);//returnreadbyte
}
/*-----------------------------*
公司名称:
xxxxxx
函数名称:
nRF24L01数据读取
函数功能:
向寄存器reg写一个字节,同时返回状态字节
设计时间:
设计者:
------------------------------*/
//
ucharSPI_RW_Reg(BYTEreg,BYTEvalue)
{
ucharstatus_24L01;
status_24L01=0;
CSN=0;//CSNlow,initSPItransaction
status_24L01=SPI_RW(reg);//selectregister选择通道
SPI_RW(value);//..andwritevaluetoit..
CSN=1;//CSNhighagain
return(status_24L01);//returnnRF24L01statusbyte
}
//读数据
ucharSPI_Read_Buf(BYTEreg,BYTE*pBuf,BYTEbytes)
{
ucharstatus_24L01,byte_ctr;
status_24L01=0;
byte_ctr=0;
CSN=0;//SetCSNlow,initSPItranaction
status_24L01=SPI_RW(reg);//Selectregistertowritetoandreadstatusbyte
for(byte_ctr=0;byte_ctrpBuf[byte_ctr]=SPI_RW(0);//选择信号通道?
CSN=1;
return(status_24L01);//returnnRF24L01statusbyte
}
/*-----------------------------*
公司名称:
xxxxxx
函数名称:
nRF24L01
函数功能:
写入bytes字节的数据
设计时间:
设计者:
------------------------------*/
ucharSPI_Write_Buf(BYTEreg,BYTE*pBuf,BYTEbytes)
{
ucharstatus_24L01,byte_ctr;
status_24L01=0;
byte_ctr=0;
CSN=0;
status_24L01=SPI_RW(reg);
for(byte_ctr=0;byte_ctrSPI_RW(*pBuf++);//;需要发送的数据在PBUF表格里;
//;需要发送的字节数载bytes;
//对其操作的命令在reg里
CSN=1;//SetCSNhighagain
return(status_24L01);//
}
/*-----------------------------*
公司名称:
xxxxxx
函数名称:
nRF24L01__set_24L01_rec_mode
函数功能:
写寄存器命令;并寄存器配置地址
设计时间:
设计者:
------------------------------*/
/*-----------------------------*
公司名称:
xxxxxx
函数名称:
nRF24L01**nRF24L01_RxPacket
函数功能:
接收函数,返回1表示有数据收到,否则没有数据接受到
设计时间:
设计者:
测试通过
------------------------------*/
unsignedcharnRF24L01_RxPacket(unsignedchar*rx_buf)
{
unsignedcharsta,revale=0;
sta=0;
revale=0;
//setinRXmode
SPI_RW_Reg(WRITE_REG+CONFIG,0x0f);//SetPWR_UPbit,enableCRC(2bytes)&Prim:
RX.RX_DRenabled..
CE=1;//SetCEpinhightoenableRXdevice
delay_130us();
sta=SPI_RW_Reg(WRITE_REG+EN_RXADDR,0x01);//readregisterSTATUS'svalue
//读取nRF24L01所处于的状态
if(sta&0x40)//ifreceivedataready(RX_DR)interrupt如果准备接收数据则中断1;
{
CE=0;//standbymode
SPI_Read_Buf(RD_RX_PLOAD,rx_buf,TX_PLOAD_WIDTH);
//readreceivepayloadfromRX_FIFObuffer
//读取16个字节的数据最大32BIT
revale=1;
}
SPI_RW_Reg(WRITE_REG+STATUS_24L01,sta);//clearRX_DRorTX_DSorMAX_RTinterruptflag
returnrevale;
}
/*-----------------------------*
公司名称:
xxxxxx
函数名称:
nRF24L01
函数功能:
发送函数
设计时间:
设计者:
------------------------------*/
voidnRF24L01_TxPacket(unsignedchar*tx_buf)
{
CE=0;
SPI_Write_Buf(WRITE_REG+TX_ADDR,TX_ADDRESS,TX_ADR_WIDTH);//发送5个地址24l01
SPI_Write_Buf(WRITE_REG+RX_ADDR_P0,TX_ADDRESS,TX_ADR_WIDTH);//RX_Addr0sameasTX_AdrforAuto.Ack
SPI_Write_Buf(WR_TX_PLOAD,tx_buf,TX_PLOAD_WIDTH);//WritesdatatoTXpayload
SPI_RW_Reg(WRITE_REG+CONFIG,0x0e);//SetPWR_UPbit,enableCRC(2bytes)&Prim:
TX.MAX_RT&TX_DSenabled..
CE=1;
NOP20;
CE=0;
}
/*-----------------------------*
公司名称:
xxxxxx
函数名称:
nRF24L01**nRF24L01_Config
函数功能:
配置函数
设计时间:
设计者:
------------------------------*/
voidnRF24L01_Config(void)
{
//initialioof24L01
CE=0;//chipenable
CSN=1;//Spidisable
SCK=0;//Spiclocklineinithigh
CE=0;
SPI_RW_Reg(WRITE_REG+CONFIG,0x0f);//SetPWR_UPbit,enableCRC(2bytes)&Prim:
RX.RX_DRenabled..
SPI_RW_Reg(WRITE_REG+EN_AA,0x01);//Enableauto_ackPipe0
//SPI_RW_Reg(WRITE_REG+EN_AA,0x00);//DISableauto_ackPipe0
SPI_RW_Reg(WRITE_REG+EN_RXADDR,0x01);//EnablePipe0
SPI_RW_Reg(WRITE_REG+SETUP_AW,0x03);//Setupaddresswidth=5bytes
SPI_RW_Reg(WRITE_REG+SETUP_RETR,0x1a);//500us+86us,10retrans...
SPI_RW_Reg(WRITE_REG+RF_CH,0x02);//channel2
SPI_RW_Reg(WRITE_REG+RF_SETUP,0x07);//TX_PWR:
0dBm,Datarate:
1Mbps,LNA:
HCURR
SPI_RW_Reg(WRITE_REG+RX_PW_P0,RX_PLOAD_WIDTH);
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);
CE=1;
}
/*------------------------------*/
bitrec_validate_end(void)
{
if(IRQ_24L01==1)return0;
//if(nRF24L01_RxPacket(remote_buf)&0x01)return
(1);
elsereturn(0);
}
voidset_24L01_rec_mode(void)
{
SPI_RW_Reg(WRITE_REG+CONFIG,0x0f);//SetPWR_UPbit,enableCRC(2bytes)&Prim:
RX.RX_DRenabled..
RX_ADDRESS[0]=0XF0;
RX_ADDRESS[1]=0XF0;
RX_ADDRESS[2]=0XF0;
RX_ADDRESS[3]=0XF0;
RX_ADDRESS[4]=0XC0;
SPI_Write_Buf(WRITE_REG+RX_ADDR_P0,&RX_ADDRESS[0],TX_ADR_WIDTH);
CE=1;//SetCEpinhightoenableRXdevice
}
1
|