版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、#include #include typedef unsigned char uchar; typedef unsigned char uint; NRF24L01 端口定义 sbit MISO=P1A5; sbit MOSI=P1A1; sbit SCK =P1A6; sbit CE =P1A7; sbit CSN =P1A2; sbit IRQ =P1A0; /* * /* sbit KEY1=P3A4; /* sbit LED=P3A5; 按键 蜂明器 /* * 15 / 5 uints TX address width / 5 uints RX address width / 20
2、uints TX payload / 20 uints TX payload / 本地地址 / 接收地址 #define TX_ADR_WIDTH 5 #define RX_ADR_WIDTH 5 #define TX_PLOAD_WIDTH 32 #define RX_PLOAD_WIDTH 32 uint const TX_ADDRESSTX_ADR_WIDTH= 0 x34,0 x43,0 x10,0 x10,0 x01; uint const RX_ADDRESSRX_ADR_WIDTH= 0 x34,0 x43,0 x10,0 x10,0 x01; /* * NRF24L01 寄存器
3、指令 #define READ_REG0 x00 #define WRITE_REG0 x20 #define RD_RX_PLOAD 0 x61 #define WR_TX_PLOAD 0 xA0 #define FLUSH_TX0 xE1 #define FLUSH_RX0 xE2 #define REUSE_TX_PL 0 xE3 #define NOP 0 xFF / 读寄存器指令 / 写寄存器指令 / 读取接收数据指令 / 写待发数据指令 / 冲洗发送 FIFO 指令 / 冲洗接收 FIFO 指令 / 定义重复装载数据指令 / 保留 /* * *SPI(nRF24L01)寄存器地址
4、#define CONFIG 0 x00 / 配置收发状态,CRC校验模式以及收发状态响应方式 #define EN_AA 0 x01 / #define EN_RXADDR 0 x02 / #define SETUP_AW 0 x03 / #define SETUP_RETR 0 x04 / #define RF_CH 0 x05 / #define RF_SETUP 0 x06 / #define STATUS 0 x07 / #define OBSERVE_TX 0 x08 / #define CD 0 x09 / #define RX_ADDR_P0 0 x0A / #define R
5、X_ADDR_P1 0 x0B / 自动应答功能设置 可用信道设置 收发地址宽度设置 自动重发功能设置 工作频率设置 发射速率、功耗功能设置 状态寄存器 发送监测功能 地址检测 频道 0 接收数据地址 频道 1 接收数据地址 #define RX ADDR_P2 0 x0C / #define RX ADDR_P3 0 x0D / #define RX ADDR_P4 0 x0E / #define RX ADDR_P5 0 x0F / #define TX_ ADDR 0 x10 / #define RX PW_P0 0 x11 / #define RX PW_P1 0 x12 / #def
6、ine RX PW_P2 0 x13 / #define RX PW_P3 0 x14 / #define RX PW_P4 0 x15 / #define RX PW_P5 0 x16 / #define FIFO_STATUS 0 x17 / FIFO /* * *void /* * uint 频道 2 接收数据地址 频道 3 接收数据地址 频道 4 接收数据地址 频道 5 接收数据地址 发送地址寄存器 接收频道 0 接收数据长度 接收频道 0 接收数据长度 接收频道 0 接收数据长度 接收频道 0 接收数据长度 接收频道 0 接收数据长度 接收频道 0 接收数据长度 栈入栈出状态寄存器设
7、置 Delay(unsigned int s); void inerDelay_us(unsigned char n); void init_NRF24L01(void); uint SPI_RW(uint uchar); uchar SPI_Read(uchar reg); void SetRX_Mode(void); uint SPI_RW_Reg(uchar reg, uchar value); uint SPI_Read_Buf(uchar reg, uchar *pBuf, uchar uchars); uint SPI_Write_Buf(uchar reg, uchar *pBu
8、f, uchar uchars); unsigned char nRF24L01_RxPacket(unsigned char* rx_buf); void nRF24L01_TxPacket(unsigned char * tx_buf); /*n 了 e - void Delay(unsigned int s) unsigned int i; for(i=0; is; i+); for(i=0; i0;n-) _nop_(); /* * */*NRF24L 01 初始化 * void init_NRF24L01(void) inerDelay_us(100); CE=0; / chip e
9、nable CSN=1; / Spi disable SCK=0; / Spi clock line init high 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, 0 x01);/ 频道 0 自动ACK应答允许 SPI_RW_Reg(WRITE_REG + EN_RXADDR, 0 x01);
10、 / 允许接收地址只有频道 0,如果需要多频道可以 参考 Page21 SPI_RW_Reg(WRITE_REG + RF_CH, 0);/设置信道工作为 2.4GH Z 收发必须一致 SPI_RW_Reg(WRITE_REG + RX_PW_P0, RX_PLOAD_WIDTH)设置接收数据长度,本次设置为32 字节 SPI_RW_Reg(WRITE_REG + RF_SETUP, 0 x07);/设置发射速率为 1MHZ发射功率为最大 值 0dB SPI_RW_Reg(WRITE_REG + CONFIG, 0 x0f);/ IRQ 收发完成中断响应, 16位 CRC ,主 接收 /* /
11、* 函数: uint SPI_RW(uint uchar) /*功能:NRF24L01的SPI写时序 /* uint SPI_RW(uint uchar) uint bit_ctr; for(bit_ctr=0;bit_ctr8;bit_ctr+) / output 8-bit MOSI = (uchar / output uchar, MSB to MOSI uchar = (uchar 1);/ shift next bit into MSB. SCK = 1;/ Set SCK high. uchar |= MISO;/ capture current MISO bit SCK = 0;
12、/ .then set SCK low again return(uchar);/ return read uchar /* /* 函数: uchar SPI_Read(uchar reg) /*功能:NRF24L01的SPI时序 /* 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 registervalue
13、 CSN = 1;/ CSN high, terminate SPI communication return(reg_val); / return register value /* /*功能:NRF24L01读写寄存器函数 uint SPI_RW_Reg(uchar reg, uchar value) uint status; CSN = 0;/ CSN low, init SPI transaction status = SPI_RW(reg); / select register SPI_RW(value);/ .and write value to it. CSN = 1;/ CSN
14、 high again return(status); / return nRF24L01 status uchar /*/ /* 函数: uint SPI_Read_Buf(uchar reg, uchar *pBuf, uchar uchars) /*功能:用于读数据,reg :为寄存器地址,pBuf:为待读出数据地址,uchars :读出数据的个数 /*/ uint SPI_Read_Buf(uchar reg, uchar *pBuf, uchar uchars) uint status,uchar_ctr; CSN = 0;/ Set CSN low, init SPI tranac
15、tion status = SPI_RW(reg);/ Select register to write to and read status uchar for(uchar_ctr=0;uchar_ctruchars;uchar_ctr+) pBufuchar_ctr = SPI_RW(0); / CSN = 1; return(status);/ return nRF24L01 status uchar /* /* 函数: uint SPI_Write_Buf(uchar reg, uchar *pBuf, uchar uchars) /*功能:用于写数据:为寄存器地址,pBuf:为待写入
16、数据地址,uchars :写入数据的个数 /*/ uint SPI_Write_Buf(uchar reg, uchar *pBuf, uchar uchars) uint status,uchar_ctr; CSN = 0; /SPI 使能 status = SPI_RW(reg); for(uchar_ctr=0; uchar_ctruchars; uchar_ctr+) / SPI_RW(*pBuf+); CSN = 1; / 关闭 SPI return(status); / /* /* 函数: void SetRX_Mode(void) /* 功能:数据接收配置 /*/ void Se
17、tRX_Mode(void) CE=0; / SPI_RW_Reg(WRITE_REG + CONFIG, 0 x0f); / IRQ 收发完成中断响应, 16 位 CRC ,主接收 CE = 1; 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=
18、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 buffer revale =1; / 读取数据完成标志 SPI_RW_Reg(WRITE_REG+STATUS,sta); / 接收到数据后 RX_DR,TX_DS,MAX_P都置高为 1 通过写 1 来清楚中断标志 return revale; /* /* 函数: void nRF2
19、4L01_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, OxOe);/ IR
20、Q 收发完成中断响应,16 位 CRC 主发送 CE=1;/置高CE激发数据发送 uchar i,temp; uchar RxBuf32; inerDelay_us(1O); /* void StartUART( void ) SCON = Ox5O; TMOD = Ox2O; TH1 = OxFA; TL1 = OxFA; PCON = OxOO; TR1 = 1; /* void R_S_Byte(uchar R_Byte) SBUF = R_Byte; while( TI = O ); TI = O; /* void main(void) 串口初始化 / 波特率 48OO 通过串口将接收
21、到数据发送给PC端 / 查询法 主函数 init_NRF24LO1() ; StartUART(); Delay(6OOO); while(1) SetRX_Mode(); if(nRF24LO1_RxPacket(RxBuf) LED=O; temp+; for(i=O;i32;i+) R_S_Byte(RxBufi); Delay(600); LED=1; Delay(600); #include #include typedef unsigned char uchar; typedef unsigned char uint; NRF24L01 端口定义 sbit MISO=P1A5; s
22、bit MOSI=P1A1; sbit SCK =P1A6; sbit CE =P1A7; sbit CSN =P1A2; sbit IRQ =P1A0; /* * /* * 按键 sbitKEY1=P3A4; /* * 蜂明器 sbit LED=P3A5; /* uchar TxBuf32= 0 x01,0 x02,0 x03,0 x4,0 x05,0 x06,0 x07,0 x08, 0 x09,0 x10,0 x11,0 x12,0 x13,0 x14,0 x15,0 x16, 0 x17,0 x18,0 x19,0 x20,0 x21,0 x22,0 x23,0 x24, 0 x25,
23、0 x26,0 x27,0 x28,0 x29,0 x30,0 x31,0 x32, ; / /* * NRF24L01 * #define TX_ADR_WIDTH 5 #define RX_ADR_WIDTH 5 #define TX_PLOAD_WIDTH 32 #define RX_PLOAD_WIDTH 32 / 5 uints TX address width / 5 uints RX address width / 20 uints TX payload / 20 uints TX payload uint const TX_ADDRESSTX_ADR_WIDTH= 0 x34,
24、0 x43,0 x10,0 x10,0 x01; / 本地地址 uint const RX_ADDRESSRX_ADR_WIDTH= 0 x34,0 x43,0 x10,0 x10,0 x01; / 接收地址 /* * NRF24L01 寄存器指令 #define READ_REG 0 x00 #define WRITE_REG 0 x20 #define RD_RX_PLOAD 0 x61 #define WR_TX_PLOAD 0 xA0 #define FLUSH_TX 0 xE1 #define FLUSH_RX 0 xE2 #define REUSE_TX_PL 0 xE3 #def
25、ine NOP 0 xFF / 读寄存器指令 / 写寄存器指令 / 读取接收数据指令 / 写待发数据指令 / 冲洗发送 FIFO 指令 / 冲洗接收 FIFO 指令 / 定义重复装载数据指令 / 保留 /* * *SPI(nRF24L01) 寄存器地址 #define CONFIG 0 x00 / 配置收发状态,CRC校验模式以及收发状态响应方式 #define EN_AA 0 x01 / 自动应答功能设置 #define EN_RXADDR 0 x02 / #define SETUP_AW 0 x03 / #define SETUP_RETR 0 x04 / 可用信道设置 收发地址宽度设置
26、自动重发功能设置 工作频率设置 发射速率、功耗功能设置 状态寄存器 #define RF_CH 0 x05 / #define RF_SETUP 0 x06 / #define STATUS 0 x07 / #define OBSERVE_ TX 0 x08 / 发送监测功能 #define CD 0 x09 / 地址检测 #define RX_ADDR_ P0 0 x0A / 频道 0 接收数据地址 #define RX_ADDR_ P1 0 x0B / 频道 1 接收数据地址 #define RX_ADDR_ P2 0 x0C / 频道 2 接收数据地址 #define RX_ADDR_
27、P3 0 x0D / 频道 3 接收数据地址 #define RX_ADDR_ P4 0 x0E / 频道 4 接收数据地址 #define RX_ADDR_ P5 0 x0F / 频道 5 接收数据地址 #define TX_ADDR 0 x10 / 发送地址寄存器 #define RX_PW_P0 0 x11 / 接收频道 0 接收数据长度 #define RX_PW_P1 0 x12 / 接收频道 0 接收数据长度 #define RX_PW_P2 0 x13 / 接收频道 0 接收数据长度 #define RX_PW_P3 0 x14 / 接收频道 0 接收数据长度 #define R
28、X_PW_P4 0 x15 / 接收频道 0 接收数据长度 #define RX_PW_P5 0 x16 / 接收频道 0 接收数据长度 #define FIFO_STATUS 0 x17 / FIFO 栈入栈出状态寄存器设置 /* * *void Delay(unsigned int s); void inerDelay_us(unsigned char n); void init_NRF24L01(void); uint SPI_RW(uint uchar); uchar SPI_Read(uchar reg); void SetRX_Mode(void); uint SPI_RW_Reg
29、(uchar reg, uchar value); uint SPI_Read_Buf(uchar reg, uchar *pBuf, uchar uchars); uint SPI_Write_Buf(uchar reg, uchar *pBuf, uchar uchars); unsigned char nRF24L01_RxPacket(unsigned char* rx_buf); void nRF24L01_TxPacket(unsigned char * tx_buf); /* * 长延时 void Delay(unsigned int s) unsigned int i; for
30、(i=0; is; i+); for(i=0; i0;n-) _nop_(); /* /*NRF24L01 初始化 / /*/ void init_NRF24L01(void) inerDelay_us(100); CE=0; / chip enable CSN=1; / Spi disable SCK=0; / Spi clock line init high SPI_Write_Buf(WRITE_REG + TX_ADDR, TX_ADDRESS, TX_ADR_WIDTH); / 写本地地址 SPI_Write_Buf(WRITE_REG + RX_ADDR_P0, RX_ADDRES
31、S, RX_ADR_WIDTH); / 写接收端地址 SPI_RW_Reg(WRITE_REG + EN_AA, 0 x01); / 频道 0 自动ACKM答允许 SPI_RW_Reg(WRITE_REG + EN_RXADDR, 0 x01); / 允许接收地址只有频道 0,如果需要多频道可以 参考 Page21 SPI_RW_Reg(WRITE_REG + RF_CH, 0);/设置信道工作为 2.4GH Z 收发必须一致 SPI_RW_Reg(WRITE_REG + RX_PW_P0, RX_PLOAD_WIDTH)设置接收数据长度,本次设置为32 字节 SPI_RW_Reg(WRITE
32、_REG + RF_SETUP, 0 x07);/设置发射速率为 1MHZ发射功率为最大 值 0dB SPI_RW_Reg(WRITE_REG + CONFIG, 0 x0e);/ IRQ 收发完成中断响应,16 位 CRC 主发送 /* /* 函数: uint SPI_RW(uint uchar) /*功能:NRF24L01的SPI写时序 * uint SPI_RW(uint uchar) uint bit_ctr; for(bit_ctr=0;bit_ctr8;bit_ctr+) / output 8-bit MOSI = (uchar / output uchar, MSB to MOS
33、I uchar = (uchar 1);/ shift next bit into MSB. SCK = 1;/ Set SCK high. / capture current MISO bit / .then set SCK low again / return read uchar uchar |= MISO; SCK = 0; return(uchar); /* /* 函数: uchar SPI_Read(uchar reg) /*功能:NRF24L01的SPI时序 /*/ uchar SPI_Read(uchar reg) uchar reg_val; CSN = 0;/ CSN lo
34、w, initialize SPI communication. SPI_RW(reg); / Select register to read from. reg_val = SPI_RW(0); / .then read registervalue CSN = 1;/ CSN high, terminate SPI communication return(reg_val); / return register value /*/ /*功能:NRF24L01读写寄存器函数 /*/ uint SPI_RW_Reg(uchar reg, uchar value) uint status; CSN
35、 = 0;/ CSN low, init SPI transaction status = SPI_RW(reg); / select register SPI_RW(value);/ .and write value to it. CSN = 1;/ CSN high again return(status); / return nRF24L01 status uchar /*/ /* 函数: uint SPI_Read_Buf(uchar reg, uchar *pBuf, uchar uchars) /* 功能 : 用于读数据, reg :为寄存器地址, pBuf :为待读出数据地址,
36、uchars :读出数据的个数 /*/ uint SPI_Read_Buf(uchar reg, uchar *pBuf, uchar uchars) uint status,uchar_ctr; CSN = 0; status = SPI_RW(reg); / Set CSN low, init SPI tranaction / Select registerto write to and read status uchar for(uchar_ctr=0;uchar_ctruchars;uchar_ctr+) pBufuchar_ctr = SPI_RW(0); / CSN = 1; re
37、turn(status);/ return nRF24L01 status uchar /* /* 函数: uint SPI_Write_Buf(uchar reg, uchar *pBuf, uchar uchars) /* 功能 : 用于写数据:为寄存器地址, pBuf :为待写入数据地址, uchars :写入数据的个数 /*/ uint SPI_Write_Buf(uchar reg, uchar *pBuf, uchar uchars) uint status,uchar_ctr; CSN = 0; /SPI 使能 status = SPI_RW(reg); for(uchar_ctr=0; uchar_ctruchars; uchar_ctr+) / SPI_RW(*pBuf+); CSN = 1; / 关闭 SPI return(status); / /*/ /* 函数: void SetRX_Mode(void) /* 功能:数据接收配置 /*/ voi
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 胆囊的课件教学课件
- 医疗数据安全事件应急处置中的患者权益保障机制
- 医疗数据安全与医疗物联网设备数据安全防护策略
- 医疗数据孤岛破解:区块链协同治理模式
- 山西省2026届数学高三第一学期期末质量检测模拟试题含解析
- 胃占位CT表现课件
- 9-专题十二 世界多极化与经济全球化 十年真题
- 医疗数据区块链安全防护的关键问题
- 25:2024届江苏省苏北七市(南通三模) 学生版答案
- 山东省东营市实验中学2026届高一生物第一学期期末监测试题含解析
- 7月20日人类月球日月球起源假说月球冷知识月球重要性太空月球探索课件
- 人体形态学(山东联盟)智慧树知到期末考试答案章节答案2024年青岛滨海学院
- 《办公用房租赁合同》范本标准版可打印
- 人机环管安全管理措施
- 大庆一中、六十九中初四上学期期末质量检测物理试题
- 小学生一、二、三年级家庭奖罚制度表
- 中图版地理七年级上册知识总结
- 2022年12月华中科技大学科学技术发展院基地办招聘1名社会用工笔试参考题库含答案解析
- GB/T 5836.1-1992建筑排水用硬聚氯乙烯管材
- GB/T 23445-2009聚合物水泥防水涂料
- 美国COMPASS电磁导航产品介绍课件
评论
0/150
提交评论