NRF24L01收发程序.docx
- 文档编号:1759082
- 上传时间:2023-05-01
- 格式:DOCX
- 页数:10
- 大小:16.33KB
NRF24L01收发程序.docx
《NRF24L01收发程序.docx》由会员分享,可在线阅读,更多相关《NRF24L01收发程序.docx(10页珍藏版)》请在冰点文库上搜索。
NRF24L01收发程序
NRF24L01收发程序
包含nrf24L01头文件如下:
#include
#include
#include"12864.h"
//------------------------------------------------------------------------------
//spi标志
#defineDDR_SPIDDRB
#defineDD_MOSI5
#defineDD_MISO6
#defineDD_SCK7
#defineDD_SS4
#defineCEPB3
#defineIRQPB2
//--------------------------------NRF24L01接口定义--------------------------------//------------------------------------------------------------------------------
//#defineNRF24L01_MISOPB6//输入0
#defineHign_24L01_MISOPORTB|=(1< //#defineNRF24L01_MOSIPB5//输出1 #defineHign_24L01_MOSIPORTB|=(1< //#defineNRF24L01_SCKPB7//输出1 #defineHign_24L01_SCKPORTB|=(1< //#defineNRF24L01_CSNPB4//输出1 #defineLow_24L01_CSNPORTB&=~(1< //#defineNRF24L01_CEPB3//输出1 #defineHign_24L01_CEPORTB|=(1< //*********************************************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_ctr pBuf[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_ctr SPI_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); } }
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- NRF24L01 收发 程序