




已阅读5页,还剩4页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
/NRF24L01调试程序,全双工双向通信,即两个模块兼具收发功能,自动高速切换收发模式。/使用本程序的前提条件是:硬件没问题。如果能正确运行本程序,也能说明你的硬件电路没问题。/大家根据实际情况,更改 NRF24L01 各引脚、LED 和 KEY 的宏定义。/LED灯的状态由RxBuf0来决定,RxBuf0 = 0,LED输出0;RxBuf0 = 1,LED输出1;你也可以自行更改规则。/KEY可以改变TxBuf0的值,从而改变另一起模块RxBuf0的值,进而改变LED的状态。/此程序未用到外部中断,即不响应IRQ 因此IRQ引脚可以接任意I/O口,不必接到外部中断引脚,不过建议接到外部中断引脚。/若注释部分为乱码:设置keil:EditConfigurationEditorEncoding 选择chinese2312。/以下程序经过多次复制,粘贴到keil,没有错误,如出现错误,请下载文档后再复制。/粘贴到word后排布可能会变得不整齐,请自行排布。/全双工应用实例:/v_show/id_XNzM4MDYwNzY0.html#include#include#define uchar unsigned char #define uint unsigned intsbit P00 = P00;sbit P01 = P01;sbit P02 = P02;sbit P03 = P03;sbit P04 = P04;sbit P05 = P05;sbit P06 = P06;sbit P07 = P07;sbit P10 = P10;sbit P11 = P11;sbit P12 = P12;sbit P13 = P13;sbit P14 = P14;sbit P15 = P15;sbit P16 = P16;sbit P17 = P17;sbit P20 = P20;sbit P21 = P21;sbit P22 = P22;sbit P23 = P23;sbit P24 = P24;sbit P25 = P25;sbit P26 = P26;sbit P27 = P27;sbit P30 = P30;sbit P31 = P31;sbit P32 = P32;sbit P33 = P33;sbit P34 = P34;sbit P35 = P35;sbit P36 = P36;sbit P37 = P37;#define LEDP36#define KEY P20/*延时函数*/void delayus(uint us)for(;us 0;us-)_nop_();/*void delayms(uint ms)/延时?个 ms uchar a,b,c;while(ms-) for(c=1;c0;c-) for(b=142;b0;b-) for(a=2;a0;a-);*/*NRF24L01 IO端口定义*/#define CE P10#define SCK P11#defineMISO P12#define CSN P16#define MOSI P17#define IRQ P32/*NRF24L01的接收和发送地址*/#define TX_ADR_WIDTH 5 / 5个字节的TX地址长度#define RX_ADR_WIDTH 5 / 5个字节的RX地址长度#define TX_PLOAD_WIDTH 16 / ?个字节的TX数据长度#define RX_PLOAD_WIDTH 16 / ?个字节的RX数据长度uchar 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 init_NRF24L01();uchar SPI_RW(uchar num);uchar SPI_Read(uchar reg);void SetRX_Mode();void SetTx_Mode();uchar SPI_RW_Reg(uchar reg, uchar value);uchar SPI_Read_Buf(uchar reg, uchar *pBuf, uchar uchars);uchar SPI_Write_Buf(uchar reg, uchar *pBuf, uchar uchars);void nRF24L01_RxPacket(uchar *rx_buf);void nRF24L01_TxPacket(uchar *tx_buf);/*状态标志*/uchar bdata sta;sbitRX_DR=sta6;sbitTX_DS=sta5;sbitMAX_RT=sta4; /*NRF24L01初始化*/void init_NRF24L01() delayus(100); CE=0; / 片选使能 CSN=1; / SPI使能 SCK=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自动应答 SPI_RW_Reg(WRITE_REG + EN_RXADDR, 0x01); /允许接收地址频道0 SPI_RW_Reg(WRITE_REG + RF_CH, 0x32); /设置信道工作频率,收发必须一致SPI_RW_Reg(WRITE_REG + RX_PW_P0, RX_PLOAD_WIDTH); /设置接收数据长度SPI_RW_Reg(WRITE_REG + RF_SETUP, 0x0f); /设置发射速率为2MHZ,发射功率为最大值0dBSPI_RW_Reg(WRITE_REG + CONFIG, 0x7c); /IRQ引脚不显示中断 掉电模式 116CRC校验/*/*函数:uint SPI_RW(uint uchar)/*功能:NRF24L01的SPI写时序/*/uchar SPI_RW(uchar num)uchar bit_ctr; for(bit_ctr=0;bit_ctr8;bit_ctr+) / output 8-bit MOSI = (num & 0x80); / output uchar, MSB to MOSInum = (num 1); / shift next bit into MSB.SCK = 1; / Set SCK high.num |= MISO; / capture current MISO bitSCK = 0; / .then set SCK low again return(num); / 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 registervalueCSN = 1; / CSN high, terminate SPI communicationreturn(reg_val); / return register value/*/*功能:NRF24L01读写寄存器函数/*/uchar SPI_RW_Reg(uchar reg, uchar value)uchar status;CSN = 0; / CSN low, init SPI transactionstatus = SPI_RW(reg); / select registerSPI_RW(value); / .and write value to it.CSN = 1; / CSN high againreturn(status); / return nRF24L01 status uchar/*/uchar SPI_Read_Buf(uchar reg, uchar *pBuf, uchar bytes)uchar status,byte_ctr;CSN = 0; / Set CSN low, init SPI tranactionstatus = SPI_RW(reg); / Select register to write to and read status bytefor(byte_ctr=0;byte_ctrbytes;byte_ctr+)pBufbyte_ctr = SPI_RW(0); / Perform SPI_RW to read byte from nRF24L01CSN = 1; / Set CSN high againreturn(status); / return nRF24L01 status byte/*/*函数:uint SPI_Write_Buf(uchar reg, uchar *pBuf, uchar uchars)/*功能: 用于写数据:为寄存器地址,pBuf:为待写入数据地址,uchars:写入数据的个数/*/uchar SPI_Write_Buf(uchar reg, uchar *pBuf, uchar uchars)uchar status,uchar_ctr;CSN = 0; /SPI使能 status = SPI_RW(reg); for(uchar_ctr=0; uchar_ctruchars; uchar_ctr+) /SPI_RW(*pBuf+);CSN = 1; /关闭SPIreturn(status); / /* nrf收发程序 *void nrf_RxTx(uchar mod_nrf,uchar *buff) /NRF24L01收发程序static uchar mod_nrf_b;/static 地址不释放/*进入发射模式*if(mod_nrf = t)if(mod_nrf_b != t)mod_nrf_b = t;CE = 0; SPI_RW_Reg(WRITE_REG+STATUS,0xff); /清除中断标志SPI_RW_Reg(FLUSH_TX,0x00);/清除TX_FIFO寄存器 SPI_RW_Reg(WRITE_REG + CONFIG,0x7e);/IRQ引脚不显示中断 上电 发射模式 116CRC校验CE = 1;delayus(130);/从CE = 0 到 CE = 1;即待机模式到收发模式,需要最大130us /*发送数据*CE = 0;/StandBy I模式SPI_Write_Buf(WRITE_REG + RX_ADDR_P0, TX_ADDRESS, TX_ADR_WIDTH); / 装载接收端地址SPI_Write_Buf(WR_TX_PLOAD,buff,TX_PLOAD_WIDTH); / 装载数据CE = 1; /置高CE激发数据发送delayus(130);/从CE = 0 到 CE = 1;即待机模式到收发模式,需要最大130usdelayus(100); /给发送数据一点时间 比发送速度较快 延时可以比接收少sta = SPI_Read(STATUS);/读取状态寄存器的值SPI_RW_Reg(WRITE_REG+STATUS,sta);/清除对应的中断if(TX_DS = 1)/发送成功再清除tx fifo寄存器CE = 0;SPI_RW_Reg(FLUSH_TX,0x00); /清除tx fifo寄存器/*重要*CE = 1; /*进入接收模式*else if(mod_nrf = r)/接收模式if(mod_nrf_b != r)mod_nrf_b = r;CE = 0; SPI_RW_Reg(WRITE_REG+STATUS,0xff);/清除中断标志SPI_RW_Reg(FLUSH_RX,0x00); /清除RX_FIFO寄存器SPI_RW_Reg(WRITE_REG + CONFIG, 0x7f);/IRQ引脚不显示中断 上电 接收模式 116CRC校验 CE = 1; delayus(130);/从CE = 0 到 CE = 1;即待机模式到收发模式,需要
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 六一戏曲活动方案
- 六一机关活动方案
- 六一活动拉花活动方案
- 六一活动活动策划方案
- 六一相亲活动方案
- 六一积分活动方案
- 六一美食节活动方案
- 六一食堂活动方案
- 六味斋公司策划方案
- 安全生产法考试题及答案A1
- TCCIAT 0043-2022 建筑工程渗漏治理技术规程
- 检验检测服务公司合作战略方案
- DB53∕T 1034-2021 公路隧道隐蔽工程无损检测技术规程
- DB37T 2906-2019 运动场地合成材料面层 验收要求
- DB34∕T 451-2017 地理标志产品 舒城小兰花
- 《卓有成效的管理者》Word电子版电子版本
- 锆石基本特征及地质应用
- 丝网除沫器小计算
- 制钵机的设计(机械CAD图纸)
- 三年级下册美术课件-第15课色彩拼贴画|湘美版(共11张PPT)
- 水稻病虫统防统治工作总结
评论
0/150
提交评论