nrf24l01程序.docx

上传人:b****9 文档编号:23316970 上传时间:2023-05-16 格式:DOCX 页数:12 大小:16.96KB
下载 相关 举报
nrf24l01程序.docx_第1页
第1页 / 共12页
nrf24l01程序.docx_第2页
第2页 / 共12页
nrf24l01程序.docx_第3页
第3页 / 共12页
nrf24l01程序.docx_第4页
第4页 / 共12页
nrf24l01程序.docx_第5页
第5页 / 共12页
点击查看更多>>
下载资源
资源描述

nrf24l01程序.docx

《nrf24l01程序.docx》由会员分享,可在线阅读,更多相关《nrf24l01程序.docx(12页珍藏版)》请在冰豆网上搜索。

nrf24l01程序.docx

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_ctr

pBuf[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_ctr

SPI_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

|

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 人文社科 > 法律资料

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1