




已阅读5页,还剩6页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
#include #include /*/*NRF24L01 的管脚定义,以及在本程序中的应用,VCC接3.3V电源,可以通过5V用电压转换芯片/*得到,NC 管脚可以接可以不接,暂时没用途。本程序应用于51或者52单片机,是两个模块进行通讯/*成功的简单指示,现象是:模块1的 KEY1 对应模块1的LED1 和模块2的LED3 ,模块1的 KEY2 对应模/*块1的LED2 和模块2的LED4,发过来也对应。/*/typedef unsigned char uchar;typedef unsigned char uint;/*NRF24L01端口定义*/sbit NC =P20;/没用,不接也可sbitMISO=P25;/数字输出(从 SPI 数据输出脚)sbitMOSI=P24;/数字输入(从 SPI 数据输入脚)sbitSCK =P17;/数字输入(SPI 时钟)sbitCE =P21;/数字输入(RX 或 TX 模式选择)sbitCSN=P22;/数字输入(SPI片选信号)sbitIRQ=P26;/数字输入(可屏蔽中断)/*按键*/sbitKEY1=P33;/按键S1sbitKEY2=P32;/按键S2/*数码管位选*/sbitled1=P10;/LED0sbitled2=P11;/LED1sbit led3 =P12; /LED2sbit led4 =P13;/LED3sbit led5 =P14;/LED4/*NRF24L01*/#define TX_ADR_WIDTH 5 / 5 uints TX address width 发送地址宽度#define RX_ADR_WIDTH 5 / 5 uints RX address width 接收地址宽度#define TX_PLOAD_WIDTH 20 / 20 uints TX payload 有效载荷 装载货物#define RX_PLOAD_WIDTH 20 / 20 uints TX payloaduint const TX_ADDRESSTX_ADR_WIDTH= 0x34,0x43,0x10,0x10,0x01;/本地地址uint 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(unsigned int s); /大延时void inerDelay_us(unsigned char n);/小延时void init_NRF24L01(void);/NRF24L01 初始化uint SPI_RW(uint dat);/根据SPI协议,写一字节数据到nRF24L01,同时从nRF24L01读出一字节uchar SPI_Read(uchar reg);/从reg寄存器读一字节void SetRX_Mode(void);/数据接收配置uint SPI_RW_Reg(uchar reg, uchar value);/写数据value到reg寄存器uint SPI_Read_Buf(uchar reg, uchar *pBuf, uchar uchars); /从reg寄存器读出bytes个字节,通常用来读取接收通道数据或接收/发送地址uint SPI_Write_Buf(uchar reg, uchar *pBuf, uchar uchars); /把pBuf缓存中的数据写入到nRF24L01,通常用来写入发射通道数据或接收/发送地址unsigned char nRF24L01_RxPacket(unsigned char* rx_buf);/数据读取后放入rx_buf接收缓冲区中void nRF24L01_TxPacket(unsigned char * tx_buf);/发送 tx_buf中数据/*长延时*/void Delay(unsigned int s)unsigned int i;for(i=0; is; i+);for(i=0; i0;n-)_nop_();/*/*NRF24L01初始化/*/void init_NRF24L01(void) inerDelay_us(100);CE=0; / 芯片使能CSN=1; / 禁止 SPISCK=0; / SPI时钟置低SPI_Write_Buf(WRITE_REG + TX_ADDR, TX_ADDRESS, TX_ADR_WIDTH); / 写本地地址SPI_Write_Buf(WRITE_REG + RX_ADDR_P0, RX_ADDRESS, RX_ADR_WIDTH); / 写接收端地址SPI_RW_Reg(WRITE_REG + EN_AA, 0x01); / 频道0自动ACK应答允许SPI_RW_Reg(WRITE_REG + EN_RXADDR, 0x01); / 允许接收地址只有频道0,如果需要多频道可以参考Page21 SPI_RW_Reg(WRITE_REG + RF_CH, 0); / 设置信道工作为2.4GHZ,收发必须一致SPI_RW_Reg(WRITE_REG + RX_PW_P0, RX_PLOAD_WIDTH); /设置接收数据长度,本次设置为32字节SPI_RW_Reg(WRITE_REG + RF_SETUP, 0x07); /设置发射速率为1MHZ,发射功率为最大值0dB/*/*函数:uint SPI_RW(uint uchar)/*功能:NRF24L01的SPI写时序-根据SPI协议,写一字节数据到nRF24L01,同时从nRF24L01 读出一字节/*/uint SPI_RW(uint dat)uint i;for(i=0;i8;i+) / 循环8次MOSI = (dat & 0x80); / dat的最高位输出到MOSI MSB to MOSIdat = (dat 1); / 从右向左进一位 shift next bit into MSB.SCK = 1; / 拉高SCK,nRF24L01从MOSI读入1位数据,同时从MISO输出1位数据 Set SCK high.dat |= MISO; /读MISO到 dat 最低位 capture current MISO bitSCK = 0; / SCK置低 .then set SCK low again return(dat); /返回读出的一字节 return read dat/*/*函数:uchar SPI_Read(uchar reg)/*功能:NRF24L01的SPI时序-从reg寄存器读一字节/*/uchar SPI_Read(uchar reg)uchar reg_val;CSN = 0; /CSN置低,开始传输数据 CSN low, initialize SPI communication.SPI_RW(reg); /选择寄存器 Select register to read from.reg_val = SPI_RW(0); /然后从该寄存器读数据 .then read registervalueCSN = 1; /CSN拉高,结束数据传输 CSN high, terminate SPI communicationreturn(reg_val); /返回寄存器数据 return register value/*/*功能:NRF24L01读写寄存器函数/*描述:写数据value到reg寄存器/*/uint SPI_RW_Reg(uchar reg, uchar value)uchar status;CSN = 0; / CSN置低,开始传输数据 CSN low, init SPI transactionstatus = SPI_RW(reg); / 选择寄存器,同时返回状态字 select registerSPI_RW(value); / 然后写数据到该寄存器 .and write value to it.CSN = 1; / CSN拉高,结束数据传输 CSN high againreturn(status); / 返回状态寄存器 return nRF24L01 status uchar/*/*函数:uint SPI_Read_Buf(uchar reg, uchar *pBuf, uchar uchars)/*功能: 用于读数据,reg:为寄存器地址,pBuf:为待读出数据地址,uchars:读出数据的个数/*描述: 从reg寄存器读出bytes个字节,通常用来读取接收通道数据或接收/发送地址/*/uint SPI_Read_Buf(uchar reg, uchar *pBuf, uchar uchars)uint status,i;CSN = 0; /CSN置低,开始传输数据 Set CSN low, init SPI tranactionstatus = SPI_RW(reg); /选择寄存器,同时返回状态字 Select register to write to and read status ucharfor(i=0;iuchars;i+)pBufi = SPI_RW(0); /逐个字节从nRF24L01读出CSN = 1; /CSN拉高,结束数据传输 return(status); /返回状态寄存器 return nRF24L01 status uchar/*/*函数:uint SPI_Write_Buf(uchar reg, uchar *pBuf, uchar uchars)/*功能: 用于写数据:为寄存器地址,pBuf:为待写入数据地址,uchars:写入数据的个数/*描述:把pBuf缓存中的数据写入到nRF24L01,通常用来写入发射通道数据或接收/发送地址/*/uint SPI_Write_Buf(uchar reg, uchar *pBuf, uchar uchars)uint status,i;CSN = 0; /CSN置低,开始传输数据 status = SPI_RW(reg); /选择寄存器,同时返回状态字inerDelay_us(10); for(i=0; iuchars; i+)SPI_RW(*pBuf+);/逐个字节写入nRF24L01CSN = 1; /CSN拉高,结束数据传输return(status); /返回状态寄存器/*/*函数:void SetRX_Mode(void)/*功能:数据接收配置/*/void SetRX_Mode(void)CE=0;SPI_RW_Reg(WRITE_REG + CONFIG, 0x0f);/CRC使能,16位CRC校验,上电,接收模式CE = 1; / 拉高CE启动接收设备inerDelay_us(130);/*/*函数:unsigned char nRF24L01_RxPacket(unsigned char* rx_buf)/*功能:数据读取后放入rx_buf接收缓冲区中/*/unsigned char nRF24L01_RxPacket(unsigned char* rx_buf) unsigned char revale=0;sta=SPI_Read(STATUS);/ 读取状态寄存其来判断数据接收状况if(RX_DR)/ 判断是否接收到数据 CE = 0;/SPI使能SPI_Read_Buf(RD_RX_PLOAD,rx_buf,TX_PLOAD_WIDTH);/ read receive payload from RX_FIFO bufferrevale =1;/读取数据完成标志SPI_RW_Reg(WRITE_REG+STATUS,sta); /接收到数据后RX_DR,TX_DS,MAX_PT都置高为1,通过写1来清楚中断标志return revale;/*/*函数:void nRF24L01_TxPacket(unsigned char * tx_buf)/*功能:发送 tx_buf中数据/*/void nRF24L01_TxPacket(unsigned char * tx_buf)CE=0;/StandBy I模式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 + CONFIG, 0x0e); / IRQ收发完成中断响应,16位CRC,主发送CE=1;/置高CE,激发数据发送inerDelay_us(10);/*主函数*/void main(void)unsigned char tf =0;unsigned char TxBuf20=0; / 要发送的数组unsigned char RxBuf20=0; / 接收的数据 数组 init_NRF24L01() ;/模块初始化led1=1;led2=1;led3 =1;led4 =1;/led 灯关闭Delay(1000);while(1) if(KEY1 =0 ) /按键 1 按下 TxBuf1 = 1 ;/赋值 tf = 1 ;led1=0;/本地led 灯闪烁Delay(200);led1=1;Delay(200); if(KEY2 =0 ) /按键 2 按下 TxBuf2 =1 ;/赋值tf = 1 ;led2=0;/本地led 灯闪烁Delay(200);led2=1;Delay(200); if (tf=1)/有键按下 nRF24L01_TxPacket(TxBuf);/发送数据 Transmit Tx buffer dataTxBuf1 = 0x00;/清零TxBuf2 = 0x00;tf=0;Delay(1000); SetRX_Mode();/设置成接受模式RxBuf1 = 0x00; /接收的数组相应位清零RxBuf2 = 0x00; Delay(1000);nRF24L01_RxPacket(RxBuf); /接收数据if(RxBuf1|RxBuf2)if(RxBuf1=1) led3=RxBuf0;if(RxBuf2=1)led4=RxBuf4;Delay(3000);/old is 1000RxBuf1 = 0x00; /清零RxBuf2 = 0x00;led3=1;/关灯led4=1;本程序存在的问题:反应不够灵敏,当在按键1和按键2之间切换的时候,对方的灯闪烁会有一定的延时,另外本程序没有消除按键的抖动。对部分函数的解释:uint SPI_RW(uint dat) 最基本的函数,完成 GPIO模拟 SPI 的功能。将输出字节(MOSI)从 MSB 循环输出,同时将输入字节(MISO)从 LSB 循环移入。上升沿读入,下降沿输出。 (从 SCK被初始化为低电平可以判断出)uchar SPI_Read(uchar reg);/从reg寄存器读一字节 读取寄存器值的函数:基本思路就是通过 READ_REG命令(也就是 0x00+寄存器地址) ,把寄存器中的值读出来。对于函数来说也就是把 reg 寄存器的值读到 reg_val 中去。uint SPI_RW_Reg(uchar reg, uchar value);/写数据value到reg寄存器 寄存器访问函数:用来设置 24L01 的寄存器的值。基本思路就是通过 WRITE_REG命令(也就是 0x20+寄存器地址)把要设定的值写到相应的寄存器地址里面去,并读取返回值。对于函数来说也就是把 value值写到 reg 寄存器中。需要注意的是,访问 NRF24L
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 高三原电池课件
- 高一劳动课本内容
- 文化创意产业全职设计师劳动合同与知识产权保护协议
- 离婚后房产分割及子女抚养权补充协议
- 跨国公司知识产权保护、保密及竞业禁止合同范本
- 离婚案件中宅基地房屋分割及共有权确认合同
- 物业公司股权转让及社区智能化升级协议
- 养殖业发展资金统筹方案
- 深入推进职业教育改革指南
- 利润分籍审计效果
- 2025年全国小学生“学宪法、讲宪法”活动知识竞赛题库及答案
- 《智能建造概论》高职完整全套教学课件
- 企业突发环境事件隐患排查与治理工作指南课件
- 小区门岗值班登记表
- 《计算机操作系统(第4版)》配套教学课件
- 哈尔滨市城市规划管理技术规定
- 大学语文课件(完整版)
- 液压与气压传动完整版课件
- 国家教学示范中心-电子科学与技术中心-国防科技大学
- 实名制管理台账资料规范模板内容
- 《关键对话》读书笔记-PPT课件
评论
0/150
提交评论