一种无线通信芯片驱动设计
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
一种无线通信芯片驱动设计
0 引言
现今国外普遍的划分方法将物联网划分为三部分,即感知、网络以及应用[4]。传感对象感知所处的环境,通过ID 标识自己,向互联网络传递自己感知,连接到互联网的应用获取这些感知,最终完成有意义的功能。但是国内普遍对于物联网的认识停留在为每个要纳入到物联网的对象分配一个RFID,通过传感设备读取RFID 信息,从互联网上查询与该对象绑定的信息这个范围上。也就是说,侧重于解决如何标识对象,对于如何让传感对象主动发送数据、数据如何传输到Internet 这些问题都没有涉及。这些问题的第一个要解决的就是如何让数据从传感对象发送出去。
任何研究的第一步总是最困难的。物联网对于传感对象端的要求极为苛刻,这就限制了传感对象如何将数据发送到汇集节点,从而最终将数据发送到互联网上去。本文目的就是为第一步做基础,论述物联网对于无线通信或者说是对于传感对象的苛刻要求,以及在满足这些要求的情况下如何构建一个可以使用的驱动程序。
本文在经过诸多考虑之后选用nRF24L01 完成2.4GHz 通信,使用ATMega16 单片机芯片完成整个控制过程。
1 物联网传输限制
物联网对通信技术提出了苛刻的要求。在应用场景上,物联网要求能够部署在各种应用场景下,物联网的想法就是能够容纳所有的物体;在能源消耗上,要求必须能够做到极低能源消耗,最好能够自己“寻找”能源,例如使用太阳能;运行时间上,要保证可以运行超长时间,用户不可能因为某个固件BUG 而去重启数以万计的感知对象;大量节点的限制,要求物联网感知节点必须能够足够便宜、足够小巧,同时也就限制了只能通过无线方式传输数据。
等等这些,仅仅是物联网区别与传统网络的特点的一部分,换句话说,物联网通信环境与传统网络通信环境差别非常之大,需要研究人员重新设计通信基础设施,才能满足要求。
2 传感对象
一般的传感网络,传感器可以使用的硬件有很多种,可以使用预装了操作系统的设备来完成信息的采集。但是对于物联网传感节点来说,以现在的技术条件,是很难做到的。物联网传感节点只有有限的电力,同时为了控制成本,通常只有有限的存储、计算能力,尺寸而且必须要小,这些都限制了控制软件和硬件[6]。传感对象通常使用的是单片机作为主控芯片,在其上搭建一个小型的管理固件程序,读取传感器件数据,操纵无线收发单元传输数据[5]。无线收发单元一般不使用复杂的通信技术,而且也不占用固定的频率,常使用的是2.4GHz开放频率短距离通信,最后由一个电力供应充足、计算存储能力强大的收集单元传输到互联网中去。本文主要的讨论对象使用了ATMega 16 单片机作为主控芯片,使用
是nRF24L012.4GHz 通信芯片进行数据收发,这两个芯片的突出特点是功耗低、价格便宜而且功能丰富。
2.1 ATMega 16 芯片特性
ATMega 16 是基于增强的AVR RISC 结构的低功耗8 位CMOS 微控制器[2]。
该款芯片功耗极低。ATMega16 在省电模式下,异步定时器继续运行,允许用户保持一个时间基准,而其余功能模块处于休眠状态;Standby 模式下只有晶体或谐振振荡器运行,其余功能模块处于休眠状态,使得器件只消耗极少的电流,同时具有快速启动能力[3];同时,该芯片不需要添加AD 转换外围电路,即可以对传感模拟数据进行高精度采样。
ATmeag 16 在ADC 噪声抑制模式时终止CPU 和除异步定时器与ADC 以外所有I/O 模块的工作,以降低ADC 转换时的开关噪声;除此之外,该芯片较为常用,编程方式简便,易于使用,是作为物联网基础实验平台的理想选择。
2.2 nRF24L01 芯片特性
nRF24L01 是Nordic 公司最新推出的融合高速、低功耗、低成本的无线收发芯片。nRF24L01 是全功能的2.4GHz 无线收发芯片,内置地址解码器、FIFO(First In First Out,先进先出)堆栈区、解调处理器、时钟处理器、GFSK 滤波器、频率合成器、LNA(Low NoiseAmplifier,低噪放大器)、功率放大器等,所需外围元件很少,因此使用起来非常方便[1]。
该芯片抗干扰能力突出,适合于物联网对传感对象部署的复杂环境。具有片内稳压器,可在1.9 to 3.6V 低电压工作,最大可能减少噪声。包含有载波监测功能,可以用于在WLAN环境下的可靠通信。高速率和独特的切换时间减少了与跳频系统如蓝牙出现碰撞的可能。
3 具体实现
ATMega 16 与nRF24L01 进行数据交换,nRF24L01 将这些数据在无线信道上收发。而这之间的数据交换使用的是SPI 四线串行数据传输方式。
3.1 SPI 传输
SPI 以主从方式工作进行通信,一个主设备对应一个或多个从设备,使用4 根线完成全双工通信,或者3 根线实现半双工通信。
标准 SPI 包括四种信号线[2]:
1. MOSI,主设备数据输出,从设备数据输入信号线;
2. MISO,主设备数据输入,从设备数据输出信号线;
3. SCLK,主设备产生的时钟同步信号线;
4. SS,由主设备产生的从设备使能信号线,主设备想与某个从设备通信,就将该从设备的SS 拉低或者拉高(可配置)。
SS 片选信号是控制从设备的启用状态,只有片选信号为预先规定的使能信号时(高电位或低电位),对此从设备的操作才有效。这就允许SPI 主设备在同一总线上连接多个SPI设备。SPI 传输方式与普通的串行通讯不同,允许数据按位的传送,允许暂停,因为SCK时钟同步线由主控设备控制,当没有时钟跳变时,从设备不采集或传送数据。SPI 存在独立的输入输出线(MOSI 以及MISO),因此支持全双工通信。
ATMega 16 SPI 发送寄存器为八位,而且数据传输为全双工,所以在ATMega16 上实现了如下的函数,完成了nRF24L01 与ATMega16 的数据交换:
uint8_t spi_exchange(uint8_t byte);每次在执行一个传输命令是,是不能够被中断暂停的。当出现传输意外终止时,另一端仍然会等待终止端发过来的数据,下次恢复传输时,本端一般不会先禁止SS,然后再启动,这样就导致了数据传输的混乱。因此在向nRF24L01 传输数据时,需要关闭中断:
uint8_t nRF_rd_cmd(uint8_t cmd, void* buf, uint8_t size){uint8_t status;ATOMIC_BLOCK(ATOMIC_RESTORESTATE) { //关闭中断,保存当前中断状态SPI_TRANSACTION_BEGIN;status = spi_exchange(cmd);for (uint8_t i = 0; i < size; i++)(*(uint8_t*) buf++) =
spi_exchange(SPI_NULL);SPI_TRANSACTION_FINISH;} //恢复之前保存的中断状态return status;}
使用这样的方式可以定义好常用的工具函数,就可以与nRF24L01 传输命令,读取其寄存器,进行数据收发。具体的工具函数如下:
uint8_t nRF_wt_reg(uint16_t reg_desc, uint8_t* reg_buf);uint8_t nRF_rd_reg(uint16_t reg_desc, uint8_t* reg_buf);uint8_t nRF_wt_cmd(uint8_t cmd, void* buf, uint8_t size);uint8_t nRF_rd_cmd(uint8_t cmd, void* buf, uint8_t size);
3.2 数据无线信道传输
数据在无线信道上传输,使用这样的数据格式:
struct buf_cell{uint8_t buf[32]; //用来发送/接收数据的缓存uint8_t pkg_len; //数据的实际长度uint8_t* addr; //目的地址/源地址uint8_t addr_len; //地址的长度};这里的地址是一个5 个字节长值,Nordic 保留了一部分地址作为测试使用,但是剩下的地址空间足够大量传感对象编址,至于如何编址,不属于本文的范围。