版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、#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端口定义*/=p13; sbit mosi=p12
2、; sbitsck =p11; sbitcsn=p10; sbitirq=p32;/数字输入(可屏蔽中断)/*按键*/sbitkey1=p27;/按键s1sbitkey2=p22;/按键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 ad
3、dress 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
4、0x20/ 写寄存器指令#define rd_rx_pload 0x61 / 读取接收数据指令 读rx 有效数据#define wr_tx_pload 0xa0 / 写待发数据指令 写tx 有效数据#define flush_tx 0xe1 / 冲洗发送 fifo指令 /清除tx fifo 寄存器应用于发射模式下#define flush_rx 0xe2 / 冲洗接收 fifo指令 /清除rx fifo 寄存器应用于接收模式下#define reuse_tx_pl 0xe3 / 定义重复装载数据指令 /重新使用上一包有效数据#define nop 0xff / 保留/*spi(nrf24l01
5、)寄存器地址*/#define config 0x00 / 配置收发状态,crc校验模式以及收发状态响应方式#define en_aa 0x01 / 自动应答功能设置 /使能自动应答功能 /此功能禁止后可与nrf2401 通讯#define en_rxaddr 0x02 / 可用信道设置 /接收地址允许#define setup_aw 0x03 / 收发地址宽度设置#define setup_retr 0x04 / 自动重发功能设置#define rf_ch 0x05 / 工作频率设置#define rf_setup 0x06 / 发射速率、功耗功能设置#define status 0x07
6、/ 状态寄存器#define observe_tx 0x08 / 发送监测功能#define cd 0x09 / 地址检测 #define rx_addr_p0 0x0a / 频道0接收数据地址 数据通道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 0
7、x10 / 发送地址寄存器#define rx_pw_p0 0x11 / 接收频道0接收数据长度#define rx_pw_p1 0x12 / 接收频道1接收数据长度#define rx_pw_p2 0x13 / 接收频道2接收数据长度#define rx_pw_p3 0x14 / 接收频道3接收数据长度#define rx_pw_p4 0x15 / 接收频道4接收数据长度#define rx_pw_p5 0x16 / 接收频道5接收数据长度#define fifo_status 0x17 / fifo栈入栈出状态寄存器设置 /fifo 状态寄存器/*函数声明 */void delay(uns
8、igned 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(u
9、char 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_b
10、uf);/发送 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
11、_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);
12、/设置接收数据长度,本次设置为32字节spi_rw_reg(write_reg + rf_setup, 0x07); /设置发射速率为1mhz,发射功率为最大值0db/*/*函数:uint spi_rw(uint uchar)/*功能:nrf24l01的spi写时序-根据spi协议,写一字节数据到nrf24l01,同时从nrf24l01 读出一字节/*要读/写的是最低字节的高位*/uint spi_readwrite(uint dat)uint i;for(i=0;i8;i+) / 循环8次mosi = (dat & 0x80); / dat的最高位输出到mosi msb to mosidat
13、 = (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_byte(uchar reg)/*功能:nrf24l01的spi时序-从
14、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); /然后从该寄存器读数据 /#define read_reg 0x00 / 读寄存器指令 csn = 1; /csn拉高,结束数据传 return(reg_val); /返回寄存器数据 return register value/*
15、/* uint spi_write_byte(uchar reg, uchar 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.cs
16、n = 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 uc
17、hars)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/*/*函数:uin
18、t 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); fo
19、r(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_rxpa
20、cket(unsigned char *rx_buf)/*功能:数据读取后放入rx_buf接收缓冲区中/*/unsigned char nrf24l01_rxpacket(unsigned char* rx_buf) unsigned char revale=0;sta=spi_read(status);/ 读取状态寄存其来判断数据接收状况 /#define status 0x07 / 状态寄存器if(rx_dr)/ 判断是否接收到数据 /rx_dr 为 sta 的第六位当接收到有效数据后置一 ce = 0;/spi使能spi_read_buf(rd_rx_pload,rx_buf,tx_pl
21、oad_width);/ read receive payload from rx_fifo buffer /#define rd_rx_pload 0x61 / 读取接收数据指令/#define tx_pload_width 20 revale =1;/读取数据完成标志spi_rw_reg(write_reg+status,sta); /接收到数据后rx_dr,tx_ds,max_pt都置高为1,通过写1来清楚中断标志 #define write_reg 0x20/ 写寄存器指令return revale;/*/*函数:void nrf24l01_txpacket(unsigned char
22、 * 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); / 装载接收端地址 /#define rx_addr_p0 0x0a / 频道0接收数据地址 数据通道0 接收地址/ uint const tx_addresstx_adr_width= 0x34,0x43,0x10,0x10,0x01;/本地地址 spi_write_buf(wr_
23、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;
24、/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;/清零t
25、xbuf2 = 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
26、之间切换的时候,对方的灯闪烁会有一定的延时,另外本程序没有消除按键的抖动。对部分函数的解释: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+寄存器地址)把要设定的值写到相应的寄存器地址里面去,并读取返回值。对于函数来说也就是把
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 中考物理复习主题单元12第31课时电路故障课件
- 冀少版八年级生物上册专项突破2根对水分的吸收和蒸腾作用课件
- 冀少版八年级生物上册第三单元第三节光合作用的场所课件
- 《买文具》教学设计
- 《人体解剖学》电子教案关节学(人卫版)
- 新兴城区房产打印发展潜力
- 湘教版五年级音乐上册教案
- 建筑施工承包合同样本
- 机场休息室改造敲墙协议
- 科技园区装修施工安全协议
- 混凝土的几种本构模型
- 污泥石灰干化工艺的工程应用
- 384种矿物与矿石标本实例照片
- 第二课简单趋向补语:v+上下进出回过起PPT课件
- 机动车登记证书翻译件中英文模板(共2页)
- C++程序设计:第8章 数组
- 小学书法人美版五年级下册 第10课 广字头 课件(10张PPT)
- 两自一包体制改革策略应用案例探索
- 生产计划与排产管理
- 设施农业用地备案申报材料(全套表格)
- 双培养工作实施方案3页
评论
0/150
提交评论