《nRFL学习经验.pdf》由会员分享,可在线阅读,更多相关《nRFL学习经验.pdf(5页珍藏版)》请在金锄头文库上搜索。
1、nRF24L01 nRF24L01 这个无线收发模块目前已经大致学习完毕 实现的功能以及各项参数 1 32 字节数据的无线传输 5m 的有效收发距离 1m 的无遗漏收发距离 距离在5m 内和 5m 外 转变时 超出距离数据传输会自动中断 进入范围自动继续 实验中数据不丢失 无错误 可用于短距离的数据传输和交互 在通信模块的学习中 主要分为以下3 个部分 1 通过 SPI 配置 nRF24L01 的寄存器 因为 nRF24L01 的寄存器配置只支持SPI 总线 从无线板与MCU 的连线情况看 单片 机自带的SPI 总线接口与无线板接口不匹配 所以要模拟一个SPI 总线来进行控制 查找了 一些 S
2、PI 的总线描述 感觉SPI 较 I2C 的时序更为简单 模拟SPI 的过程中 遇到过一个问 题 将所需要的函数全都写好 感觉时序也没有任何问题 可是寄存器就是写不进去 这个 问题困扰了很久 感觉是时序的问题 但是函数中却找不出来 后来发现是模拟时钟的高低 电平写反了 Void SCK H void PORTB Void SCK L void PORTB 1 SCK 这个问题导致时序错误而无法写入 而且纠错中不容易发现 SPI 的读写过程如下 读一个字节 写一个字节等就不贴出了 void write reg unsignedchar address unsignedchar temp unsi
3、gnedchar status 0 PORTB 使能 SPI status spi rw address 前 8 位写入地址跟读取状态寄存器 write temp 写入一个字节 PORTB BIT CSN unsignedchar read reg unsignedchar address unsignedchar dat 0 unsignedchar status 0 PORTB 使能 SPI status spi rw address 前 8 位写入地址跟读取状态寄存器 dat read 读取一个字节 PORTB BIT CSN return dat SPI 调通之后配置寄存器就只需要了解
4、寄存器的作用就行了 24L01 的寄存器也不算多 配置过程也就是理解寄存器作用的过程了 2 分别建立无线发送和接收的程序框架 这个关键就在于对无线通信的理解了 开始的时候会让人无从下手 整个过程有点似懂 非懂 找不到切入点 将data sheet中的发送和接收流程和网上的类似代码流程相比较 理 解会比较容易一点 发送部分 void TX config void write buf TX ADDR W REG TX address 5 写发送地址 write buf RX ADDR P0 W REG TX address 5 为应答准备接收地址 write reg EN AA W REG 0 x
5、01 通道 0 使能 允许自动应答 write reg EN RXADDR W REG 0 x01 使能接收通道0 write reg SETUP RETR W REG 0 x1A 自动重发10 次 间隔586us write reg SETUP AW W REG 0 x03 设置 5 字节地址宽度 write reg RF CH W REG 0 x40 设置工作通道频率0 x40 write reg RF SETUP W REG 0 x07 1M 0dBm 低噪音放大 void TX send void write byte W RX PAYLOAD number 32 写入数据包到FIFO
6、 write reg CONFIG REG W REG 0 x0E 16位 CRC使能 上电 发射模式 delay nus 2000 掉电模式进入发射延时1 5ms以上 PORTB BIT CE delay nus 20 设置 CE 为高启动发射 持续时间大于10us PORTB 接收部分 void RX config void write buf RX ADDR P0 W REG RX address 5 写接收地址 write buf RX ADDR P0 W REG RX address 5 数据通道0 接收地址 write buf W RX PAYLOAD RX data 32 写入数
7、据包到FIFO write reg EN AA W REG 0 x01 通道 0 使能 允许自动应答 write reg EN RXADDR W REG 0 x01 使能接收通道0 write reg SETUP AW W REG 0 x03 设置 5 字节地址宽度 write reg RF CH W REG 0 x40 设置工作通道频率0 x40 write reg RF SETUP W REG 0 x07 1M 0dBm 低噪音放大 write reg RX PW P0 W REG 0 x20 设置 32 位有效数据宽度 void RX receive void unsignedchar
8、status unsignedchar m 0 write reg CONFIG REG W REG 0 x0F 16位 CRC使能 上电 接收模式 PORTB BIT CE delay nus 150 大于 130us以后 nRF24L01开始检测空中的信息 3 对无线通信的调试 24L01 是收发双方都需要编程的器件 在建立好框架之后这就对调试方法产生了一定的 要求 如果两块一起调 那么通讯不成功 根本不知道是发的问题还是收的问题 在两边徘 徊 相互怀疑无法有效率得调试 比较好的调试方法应该是先调试发送方 能保证发送正确 再去调接收 这样就可以有针对性的解决问题 我们想单独调试发送 完全抛
9、开接收 这样就要去配置一些参数来取消自动应答 取消 自动重发 让发送方达到发出数据就算成功的目的 write reg W REG EN AA 0 x00 失能通道0 自动应答 write reg W REG EN RXADDR 0 x00 失能接收通道0 write reg W REG SETUP RETR 0 x00 失能自动重发 有了以上这三个配置 发送方的流程就变成了发送 触发中断 这样就抛开了接收方 可以专心去调试发送 检测是否成功只需要查看STATUS 寄存器 为0 x46 即是发送成功 接收方面思想也是类似 在初始化配置寄存器的时候要和发送方保持一致 比较重要的 是要失能自动应答
10、使能通道0接收 write reg W REG EN AA 0 x00 失能通道0 自动应答 write reg W REG EN RXADDR 0 x01 接收要使能接收通道0 接收方就可以进入接收模式去接收数据了 这次的调试就会灵活一些 因为是接收数据 可以在接收方添加一个显示设备把数据直观的显示出来 去对照看是否正确 在接收的时候也遇到一直接收不到的问题 改了半天程序 毫无进展 还是一次将收发 单片机内程序对调之后才发现另一块无线板既可以发送又可以接收 那就不是程序的问题 了 重新焊了一块电路板之后问题解决 4 对传输距离 以及传输数据的实验测试 首先测试的是传输数据的正确性 发送一个字
11、节 初始为 0 通过定时器设定0 2s自加 1 通过 LCD 显示观察接收端的数据变化 多次实验中并无发现数据的异常 可确定24L01 的数据准确性还是有保障的 然后距离方面 程序中参数已经调到最大功率 发现当我把接收端拿开1m 之后 数据 就无法接收了 上网查找之后发现正常距离应该在20m 左右 还有就是当我把接收端重新 拿回 1m 之内 数据并不更新 那首先要解决这个问题 然后发现状态寄存器中 最大重发 中断必须手动写入1 清除 在发送之前写1 清除一下就可以了 同理发送完成中断也需要这 样处理 不然如果发送1 20 如果 1 5 是在 1m 之内 6 20 在 1 5m 之间 那观察的时
12、候 数字可能就从5 直接变为8 等其而跳过了一些其他数字 清除这 2 个中断标志位的话就可以 实现 5m 内有效数据传输 总结 在整个nRF24L01 无线通信模块的学习中 我觉得最重要的就是搞清楚要写的东西的 作用和实现方法 做所有的东西都是这样 不一定要了解细节 但是大体框架一定要在头脑 中形成一个具象的物体 这样才不会无思绪乱转 另外spi 中出现的问题会提醒我 最不起 眼的地方出的错误往往最难找 仔细写那些几行之内的函数 避免细节出错会让程序调试简 单很多 还有就是硬件的正确性也很重要 因为当无法确定硬件正确的前提下 当程序达不 到预期效果时往往会怀疑硬件的正确性 这样就扩大了问题的范围 也会花费更多的时间 在先怀疑程序的基础上 也不能过分相信硬件的正确性 芯片部分模块功能是好的 不代表 所有的都是好的 找不到突破点的话 换一个硬件是可以考虑的选择 从现在实现的功能来看 首先数据的正确性还是有保障的 但是在距离方面 5m 的传 输距离 相对于0dBm 的功率有点短 关于这个我觉得可能是射频电感等元器件或者PCB 的材料不行 或者是天线的布局不够好 应该是硬件不够好导致的 如果以后的应用要求距 离大于 5m 的话 那应该可以通过添加一个功率放大器增加发射功率或者采用适合24L01 的 元器件来实现