




已阅读5页,还剩5页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
一共三个文件Main.c文件#include nRF24L01.h/*函数:main()描述: 主函数/*/void main(void) EX0=1;IT0=1;EA=1;init_io(); / 初始化IOStartUART();Init_24L01();R_S_Byte(2);TX_Mode(TX_BUF);/ 把nRF24L01设置为发送模式并发送数据Check_ACK(1); / 等待发送完毕,清除TX FIFOdelay_ms(250);delay_ms(250);RX_Mode(); / 设置为接收模式while(1)CheckButtons(); / 按键扫描nRF24L01.c文件#includenRF24L01.huchar code TX_ADDRESSTX_ADR_WIDTH = 0xb1,0xb2,0xb3,0xb4,0x01;/0x34,0x43,0x10,0x10,0x01; / 路由节点地址uchar code RX_ADDRESS1TX_ADR_WIDTH = 0xb0,0xb2,0xb3,0xb4,0x01;/写地址寄存器是先写低字节,因此后面几个字节相同uchar code RX_ADDRESS21 = 0xb1;uchar code RX_ADDRESS31 = 0xb2;uchar code RX_ADDRESS41 = 0xb3;uchar code RX_ADDRESS51 = 0xb4;uchar RX_BUFTX_PLOAD_WIDTH;uchar TX_BUFTX_PLOAD_WIDTH=0x01,0x02,0x03,0x4,0x05,0x06,0x07,0x08,0x09,0x10,0x11,0x12,0x13,0x14,0x15,0x16,0x17,0x18,0x19,0x20,0x21,0x22,0x23,0x24,0x25,0x26,0x27,0x28,0x29,0x30,0x31,0x32,;uchar flag,status;uchar DATA = 0x01;uchar bdata sta;sbit RX_DR = sta6;sbit TX_DS = sta5;sbit MAX_RT = sta4;/*/*函数: init_io()描述: 初始化IO/*/void init_io(void)CE = 0; / 待机CSN = 1; / SPI禁止SCK = 0; / SPI时钟置低IRQ = 1; / 中断复位LED = 0x00;/ 关闭指示灯/*/*函数:delay_ms()描述: 延迟x毫秒/*/void delay_ms(uchar x) uchar i, j; i = 0; for(i=0; i0;n-)_nop_();/*函数:SPI_RW()描述: 根据SPI协议,写一字节数据到nRF24L01,同时从nRF24L01读出一字节/*/uchar SPI_RW(uchar byte)uchar i; for(i=0; i8; i+) / 循环8次 MOSI = (byte & 0x80); / byte最高位输出到MOSI byte = 1; / 低一位移位到最高位 SCK = 1; / 拉高SCK,nRF24L01从MOSI读入1位数据,同时从MISO输出1位数据 byte |= MISO; / 读MISO到byte最低位 SCK = 0; / SCK置低 return(byte); / 返回读出的一字节/*/*函数:SPI_RW_Reg()描述: 写数据value到reg寄存器/*/uchar SPI_RW_Reg(uchar reg, uchar value)uchar status; CSN = 0; / CSN置低,开始传输数据 status = SPI_RW(reg); / 选择寄存器,同时返回状态字 SPI_RW(value); / 然后写数据到该寄存器 CSN = 1; / CSN拉高,结束数据传输 return(status); / 返回状态寄存器/*/*函数:SPI_Read()描述: 从reg寄存器读一字节/*/uchar SPI_Read(uchar reg)uchar reg_val; CSN = 0; / CSN置低,开始传输数据 SPI_RW(reg); / 选择寄存器 reg_val = SPI_RW(0); / 然后从该寄存器读数据 CSN = 1; / CSN拉高,结束数据传输 return(reg_val); / 返回寄存器数据/*/*函数:SPI_Read_Buf()描述: 从reg寄存器读出bytes个字节,通常用来读取接收通道数据或接收/发送地址/*/uchar SPI_Read_Buf(uchar reg, uchar * pBuf, uchar bytes)uchar status, i; CSN = 0; / CSN置低,开始传输数据 status = SPI_RW(reg); / 选择寄存器,同时返回状态字 for(i=0; ibytes; i+) pBufi = SPI_RW(0); / 逐个字节从nRF24L01读出 CSN = 1; / CSN拉高,结束数据传输 return(status); / 返回状态寄存器/*/*函数:SPI_Write_Buf()描述: 把pBuf缓存中的数据写入到nRF24L01,通常用来写入发射通道数据或接收/发送地址/*/uchar SPI_Write_Buf(uchar reg, uchar * pBuf, uchar bytes)uchar status, i; CSN = 0; / CSN置低,开始传输数据 status = SPI_RW(reg); / 选择寄存器,同时返回状态字 for(i=0; ibytes; i+) SPI_RW(pBufi); / 逐个字节写入nRF24L01 CSN = 1; / CSN拉高,结束数据传输 return(status); / 返回状态寄存器/*/*函数:RX_Mode()描述: 这个函数设置nRF24L01为接收模式,等待接收发送设备的数据包/*/void RX_Mode(void)CE = 0; SPI_RW_Reg(WRITE_REG + CONFIG, 0x0f); / CRC使能,16位CRC校验,上电,接收模式 CE = 1; / 拉高CE启动接收设备inerDelay_us(130);/*/*函数:TX_Mode()描述: 这个函数设置nRF24L01为发送模式,(CE=1持续至少10us),130us后启动发射,数据发送结束后,发送模块自动转入接收模式等待应答信号。/*/void TX_Mode(uchar * BUF)CE = 0; SPI_Write_Buf(WRITE_REG + TX_ADDR, TX_ADDRESS, TX_ADR_WIDTH); / 写入发送地址 SPI_Write_Buf(WR_TX_PLOAD, BUF, TX_PLOAD_WIDTH); / 写数据包到TX FIFOCE = 1;inerDelay_us(10);/*/*函数:Check_ACK()描述: 检查接收设备有无接收到数据包,设定没有收到应答信号是否重发/*/uchar Check_ACK(bit clear)while(IRQ);sta = SPI_RW(NOP); / 返回状态寄存器if(MAX_RT)if(clear) / 是否清除TX FIFO,没有清除在复位MAX_RT中断标志后重发SPI_RW(FLUSH_TX);SPI_RW_Reg(WRITE_REG + STATUS, sta); / 清除TX_DS或MAX_RT中断标志IRQ = 1;if(TX_DS)return(0x00);elsereturn(0xff);/*/*函数:CheckButtons()描述: 检查按键是否按下,按下则发送一字节数据/*/void CheckButtons()uchar i=0;if(flag) / 接受完成flag = 0; / 清标志R_S_Byte(N);R_S_Byte(status);for(i=0;i=1;SPI_Read_Buf(RD_RX_PLOAD, RX_BUF, TX_PLOAD_WIDTH); / 从RX FIFO读出数据flag = 1;SPI_RW_Reg(WRITE_REG + STATUS, sta); / 清除RX_DS中断标志/*/ nRF24L01初始化/*/void Init_24L01()CE=0;SPI_Write_Buf(WRITE_REG + RX_ADDR_P0, TX_ADDRESS, TX_ADR_WIDTH);/写接收通道0的接收地址,与发送地址相同SPI_Write_Buf(WRITE_REG + RX_ADDR_P1, RX_ADDRESS1, TX_ADR_WIDTH); /写接收通道1的接收地址SPI_Write_Buf(WRITE_REG + RX_ADDR_P2, RX_ADDRESS2, 1);/写接收通道2的接收地址SPI_Write_Buf(WRITE_REG + RX_ADDR_P3, RX_ADDRESS3, 1);/写接收通道3的接收地址SPI_Write_Buf(WRITE_REG + RX_ADDR_P4, RX_ADDRESS4, 1);/写接收通道4的接收地址SPI_Write_Buf(WRITE_REG + RX_ADDR_P5, RX_ADDRESS5, 1);/写接收通道5的接收地址SPI_RW_Reg(WRITE_REG + RX_PW_P0, TX_PLOAD_WIDTH); / 接收通道0选择和发送通道相同有效数据宽度,32字节长度 SPI_RW_Reg(WRITE_REG + RX_PW_P1, TX_PLOAD_WIDTH);/32字节长度 SPI_RW_Reg(WRITE_REG + RX_PW_P2, TX_PLOAD_WIDTH);/32字节长度 SPI_RW_Reg(WRITE_REG + RX_PW_P3, TX_PLOAD_WIDTH);/32字节长度 SPI_RW_Reg(WRITE_REG + RX_PW_P4, TX_PLOAD_WIDTH);/32字节长度 SPI_RW_Reg(WRITE_REG + RX_PW_P5, TX_PLOAD_WIDTH);/32字节长度 SPI_RW_Reg(WRITE_REG + EN_AA, 0x3f); / 使能所有接收通道自动应答 SPI_RW_Reg(WRITE_REG + EN_RXADDR, 0x3f); / 使能所有接收通道SPI_RW_Reg(WRITE_REG + RF_CH, 40); / 选择射频通道0x40SPI_RW_Reg(WRITE_REG + RF_SETUP, 0x07); / 数据传输率1Mbps,发射功率0dBm,低噪声放大器增益SPI_RW_Reg(WRITE_REG + CONFIG, 0x0e); / CRC使能,16位CRC校验,上电SPI_RW_Reg(WRITE_REG + SETUP_RETR, 0x0a); / 自动重发延时等待250us+86us,自动重发10次CE=1;nRF24L01.h文件#ifndef _API_DEF_#define _API_DEF_#include #include #define uchar unsigned char/*/#define TX_ADR_WIDTH 5 / 5字节宽度的发送/接收地址#define TX_PLOAD_WIDTH 32 / 数据通道有效数据宽度#define LED P1extern uchar RX_BUFTX_PLOAD_WIDTH;extern uchar TX_BUFTX_PLOAD_WIDTH;/*/ Define SPI pinssbit CE = P20; / Chip Enable pin signal (output)sbit CSN = P21; / Slave Select pin, (output to CSN, nRF24L01)sbit IRQ = P32; / Interrupt signal, from nRF24L01 (input)sbit MISO = P24; / Master In, Slave Out pin (input)sbit MOSI = P25; / Serial Clock pin, (output)sbit SCK = P27; / Master Out, Slave In pin (output)/ SPI(nRF24L01) commands#define READ_REG 0x00 / Define read command to register#define WRITE_REG 0x20 / Define write command to register#define RD_RX_PLOAD 0x61 / Define RX payload register address#define WR_TX_PLOAD 0xA0 / Define TX payload register address#define FLUSH_TX 0xE1 / Define flush TX register command#define FLUSH_RX 0xE2 / Define flush RX register command#define REUSE_TX_PL 0xE3 / Define reuse TX payload register command#define NOP 0xFF / Define No Operation, might be used to read status register/ SPI(nRF24L01) registers(addresses)#define CONFIG 0x00 / Config register address#define EN_AA 0x01 / Enable Auto Acknowledgment register address#define EN_RXADDR 0x02 / Enabled RX addresses register address#define SETUP_AW 0x03 / Setup address width register address#define SETUP_RETR 0x04 / Setup Auto. Retrans register address#define RF_CH 0x05 / RF channel register address#define RF_SETUP 0x06 / RF setup register address#define STATUS 0x07 / Status register address#define OBSERVE_TX 0x08 / Observe TX register address#define CD 0x09 / Carrier Detect register address#define RX_ADDR_P0 0x0A / 频道0接收数据地址#define RX_ADDR_P1 0x0B / RX address pipe1 register address#define RX_ADDR_P2 0x0C / RX address pipe2 register address#define RX_ADDR_P3 0x0D / RX address pipe3 register address#define RX_ADDR_P4 0x0E / RX address pipe4 register address#define RX_ADDR_P5 0x0F / RX address pipe5 register address#define TX_ADDR 0x10 / TX address register address#define RX_PW_P0 0x11 / 接收频道0接收数据长度#define RX_PW_P1 0x12 / RX payload width, pipe1 register address#define RX_PW_P2 0x13 / RX payload width, pipe2 register address#define RX_PW_P3 0x14 / RX paylo
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025年度光伏发电项目移交及绿色能源供应综合服务合同
- 2025年农村电商扶持贷款项目合同范本
- 2025年绿色船舶港口消毒作业专业承包合同
- 2025年农业种植与特色农产品品牌培育营销合同
- 2025年农业废弃物资源化利用与绿色植保技术合作协议
- 清廉知识题库及答案
- 法制试题库及答案
- 2025年智能物流仓储基地建设项目投资合同
- 2025年度智能办公设备供应及全面维护解决方案合同
- 第四章飞机的稳定性和操纵性
- 2025至2030年中国特种设备检验检测行业市场发展调研及竞争格局预测报告
- 意大利足协协议书
- 以物抵债方案(3篇)
- 秋季预防常见传染病课件
- 2025年中国商用开水器市场调查研究报告
- 中国绿色食品市场深度调查研究报告2025-2028版
- 2025年苏教版小学数学小升初模拟考试测试卷及答案(共五套)
- 基于赋能理论的老年COPD稳定期患者慢病管理方案的构建及应用
- 公司员工特殊岗位补贴政策
- 2025会计基础工作规范
- 《人工智能基础与应用-(AIGC实战 慕课版)》全套教学课件
评论
0/150
提交评论