NRF24L01无线通讯8051驱动程序.doc_第1页
NRF24L01无线通讯8051驱动程序.doc_第2页
NRF24L01无线通讯8051驱动程序.doc_第3页
NRF24L01无线通讯8051驱动程序.doc_第4页
NRF24L01无线通讯8051驱动程序.doc_第5页
已阅读5页,还剩3页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

/=/ 工程名称: NRF24L01无线通讯8051驱动程序 / 硬件连接: NRF24L01无线通讯模块和8051单片机 /=嘉兴学院电子创新实验室2012年=#include #include typedef unsigned char uchar;typedef unsigned int uint;/*IO端口定义*sbit MISO=P20;sbit MOSI=P21;sbitSCK =P22;sbitCE =P23;sbitCSN=P24;sbitIRQ=P22;/*定义待发数据宽度和内容*#define TX_PLOAD_WIDTH 1 / 1 uchar TX payload#define RX_PLOAD_WIDTH 1 / 1 uchar TX payloaduchar TxBuf1=0xaa;uchar RxBuf1;/*定义NRF24L01通讯地址宽度和内容*#define TX_ADR_WIDTH 5 / 5 uchar TX address width#define RX_ADR_WIDTH 5 / 5 uchar RX address widthuchar const TX_ADDRESSTX_ADR_WIDTH= 0x34,0x43,0x10,0x10,0x01;/本地地址uchar const RX_ADDRESSRX_ADR_WIDTH= 0x34,0x43,0x10,0x10,0x01;/接收端地址/*NRF24L01寄存器指令*#define READ_REG 0x00 / 读寄存器指令#define WRITE_REG 0x20 / 写寄存器指令#define RD_RX_PLOAD 0x61 / 读取接收数据指令#define WR_TX_PLOAD 0xA0 / 写入待发数据指令#define FLUSH_TX 0xE1 / 冲洗发送 FIFO指令#define FLUSH_RX 0xE2 / 冲洗接收 FIFO指令#define REUSE_TX_PL 0xE3 / 定义重复装载数据指令#define NOP 0xFF / 保留/*SPI(nRF24L01)寄存器地址*#define CONFIG 0x00 / 配置收发状态,CRC校验模式以及收发状态响应方式#define EN_AA 0x01 / 自动应答功能设置#define EN_RXADDR 0x02 / 可用信道设置#define SETUP_AW 0x03 / 收发地址宽度设置#define SETUP_RETR 0x04 / 自动重发功能设置#define RF_CH 0x05 / 工作频率设置#define RF_SETUP 0x06 / 发射速率、功耗功能设置#define STATUS 0x07 / 状态寄存器#define OBSERVE_TX 0x08 / 发送监测功能#define CD 0x09 / 地址检测 #define RX_ADDR_P0 0x0A / 频道0接收数据地址#define RX_ADDR_P1 0x0B / 频道1接收数据地址#define RX_ADDR_P2 0x0C / 频道2接收数据地址#define RX_ADDR_P3 0x0D / 频道3接收数据地址#define RX_ADDR_P4 0x0E / 频道4接收数据地址#define RX_ADDR_P5 0x0F / 频道5接收数据地址#define TX_ADDR 0x10 / 本地地址寄存器#define RX_PW_P0 0x11 / 接收频道0接收数据长度#define RX_PW_P1 0x12 / 接收频道0接收数据长度#define RX_PW_P2 0x13 / 接收频道0接收数据长度#define RX_PW_P3 0x14 / 接收频道0接收数据长度#define RX_PW_P4 0x15 / 接收频道0接收数据长度#define RX_PW_P5 0x16 / 接收频道0接收数据长度#define FIFO_STATUS 0x17 / FIFO栈入栈出状态寄存器设置/*void Delay(uint s);/长延时void inerDelay_us(uchar n);/延时void init_NRF24L01(void);/初始化uchar SPI_RW(uchar uchar_data);/SPI读写数据uchar SPI_Read(uchar reg);/SPI读寄存器void SPI_RW_Reg(uchar reg, uchar value);/SPI写寄存器void SPI_Read_Buf(uchar reg, uchar *pBuf, uchar uchars);/SPI读多字节数据void SPI_Write_Buf(uchar reg, uchar *pBuf, uchar uchars);/SPI写多字节数据void SetRX_Mode(void);/数据接收设置void SetTX_Mode(void);/数据发送设置void nRF24L01_RxPacket(uchar* rx_buf);/接收数据函数void nRF24L01_TxPacket(uchar * tx_buf);/发送数据函数/*uchar bdata sta; /状态标志sbitRX_DR =sta6;sbitTX_DS =sta5;sbitMAX_RT =sta4;/*长延时*void Delay(uint s)uint i,j;for(i=0; is; i+)for(j=0; j0;n-)_nop_();/*/*NRF24L01初始化/*void init_NRF24L01(void) inerDelay_us(100); CE=0; / StandBy I模式 CSN=1; / Spi disable SCK=0; / Spi clock line init lowSPI_RW_Reg(WRITE_REG + CONFIG, 0x5e); /IRQ发送完成中断响应,主发送SPI_RW_Reg(WRITE_REG + EN_AA, 0x00); /允许频道0自动应答SPI_RW_Reg(WRITE_REG + EN_RXADDR, 0x01); /允许接收地址只有频道0 /SPI_RW_Reg(WRITE_REG + SETUP_AW, 0x01); /设置接收地址长度,本次设置为3字节/SPI_RW_Reg(WRITE_REG + SETUP_RETR, 0x00);/设置禁止自动重发SPI_RW_Reg(WRITE_REG + RF_CH, 0x02); /设置信道工作频率,收发必须一致SPI_RW_Reg(WRITE_REG + RF_SETUP, 0x0f); /设置发射速率为2MHZ,发射功率为最大值0dBSPI_Write_Buf(WRITE_REG + RX_ADDR_P0, RX_ADDRESS, RX_ADR_WIDTH); /写接收端地址SPI_Write_Buf(WRITE_REG + TX_ADDR, TX_ADDRESS, TX_ADR_WIDTH); /写本地地址SPI_RW_Reg(WRITE_REG + RX_PW_P0, RX_PLOAD_WIDTH); /设置接收数据长度,本次设置为1字节inerDelay_us(150);/*/*函数:uint SPI_RW(uint uchar_data)/*功能:NRF24L01的SPI读写数据/*uchar SPI_RW(uchar uchar_data) uchar bit_ctr; for(bit_ctr=0;bit_ctr8;bit_ctr+) / output 8-bit MOSI = (uchar_data & 0x80); / output uchar_data, MSB to MOSIuchar_data = (uchar_data 1); / shift next bit into MSB.SCK = 1; / Set SCK high.uchar_data |= MISO; / capture current MISO bitSCK = 0; / .then set SCK low again return(uchar_data); / return read uchar_data/*/*函数:uchar SPI_Read(uchar reg)/*功能:NRF24L01的SPI读寄存器and clear/*uchar SPI_Read(uchar reg)uchar reg_val;CSN = 0; / CSN low, initialize SPI communication.SPI_RW(reg); / Select register to read from.reg_val = SPI_RW(0); / .then read registervalueCSN = 1; / CSN high, terminate SPI communicationreturn(reg_val); / return register value/*/*函数:uint SPI_RW_Reg(uchar reg, uchar value)/*功能:NRF24L01的SPI写寄存器函数,返回status/*void SPI_RW_Reg(uchar reg, uchar value)CSN = 0; / CSN low, init SPI transaction SPI_RW(reg); / select registerSPI_RW(value); / .and write value to it.CSN = 1; / CSN high again/*/*函数:uint SPI_Read_Buf(uchar reg, uchar *pBuf, uchar uchars)/*功能: 用于读数据,reg:指令+为寄存器地址,pBuf:为待读出数据地址,uchars:读出数据的个数/*void SPI_Read_Buf(uchar reg, uchar *pBuf, uchar uchars)uchar uchar_ctr;CSN = 0; / Set CSN low, init SPI tranactionSPI_RW(reg); / Select register to write to and read status ucharfor(uchar_ctr=0;uchar_ctruchars;uchar_ctr+)pBufuchar_ctr = SPI_RW(0); CSN = 1; /*/*函数:uint SPI_Write_Buf(uchar reg, uchar *pBuf, uchar uchars)/*功能: 用于写数据,reg:为指令+寄存器地址,pBuf:为待写入数据地址,uchars:写入数据的个数/*void SPI_Write_Buf(uchar reg, uchar *pBuf, uchar uchars)uchar uchar_ctr;CSN = 0; /SPI使能 SPI_RW(reg); for(uchar_ctr=0; uchar_ctruchars; uchar_ctr+) SPI_RW(*pBuf+);CSN = 1; /关闭SPI/*/*函数:void SetRX_Mode(void)/*功能:数据接收配置 /*void SetRX_Mode(void)CE=0;SPI_RW_Reg(WRITE_REG + CONFIG, 0x3f); / IRQ接收完成中断响应,主接收CE = 1; inerDelay_us(130);/*/*函数:void SetTX_Mode(void)/*功能:数据发送配置 /*void SetTX_Mode(void)CE=0;SPI_RW_Reg(WRITE_REG + CONFIG, 0x7e); / IRQ禁止中断响应,主发送/*/*函数:void nRF24L01_RxPacket(unsigned char* rx_buf)/*功能:读取RX_FIFO数据,然后存入自定义数组中/*void nRF24L01_RxPacket(uchar* rx_buf)SPI_Read_Buf(RD_RX_PLOAD,rx_buf,TX_PLOAD_WIDTH);/ read receive payload from RX_FIFO bufferCE=0; SPI_RW_Reg(WRITE_REG+STATUS,0x70); /接收到数据后RX_DR置高为1,通过写1来清楚中断标志SPI_RW(FLUSH_RX); / 冲洗接收 FIFO指令 CE=1;inerDelay_us(130);/*/*函数:void nRF24L01_TxPacket(

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论