nrf24l01程序.docx
- 文档编号:23316970
- 上传时间:2023-05-16
- 格式:DOCX
- 页数:12
- 大小:16.96KB
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_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 |
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- nrf24l01 程序