【物联网无线通信技术】ZigBee从理论到实践(CC2530)

文章延续之前【物联网无线通信技术】系列文章的风格,首先对ZigBee这种在物联网发展初期出现的无线通信技术进行了相关背景概念的介绍,并横向介绍了几款时间跨度比较大的ZigBee芯片。然后以CC2530为例,从硬件到软件介绍了ZigBee这中无线通信技术的实现。相信读者通过通读本篇文章,能够对ZigBee无线通信的实现有一个直观的认识。因篇幅有限,本篇中有些概念和功能没有详细展开,读者可以通过文中的外链进行更深的探究。

目录

ZigBee概述

CC2530EM+SmartRF05

例程解析

工程代码结构

Basic RF 

Hardware Abstraction Layer

工程编译与下载


ZigBee概述

ZigBee技术是一种短距离无线通信技术,主要的特色有数据传输速率低、功耗低、实现成本低、网络容量大等,常用于智能家居,工业自动化等领域。Zigbee基于IEEE 802.15.4标准,该标准定义了用于低速无线个人局域网(LR-WPANs)的物理层和介质访问控制(MAC)层。Zigbee在此基础上提供了网络层、安全特性和各种用例的应用框架,应用层的开发可以根据用户的应用需要,对其进行灵活的组网、开发利用。常见的ZigBee的工作频段为2.4G,一共具有16个信道11 (2405 MHz) to 26 (2480 MHz),理论上通信速率可达250kbps,采用O-QPSK调制,实际的通信距离取决于发射功率和天线的效率。

下面介绍几款常见的ZigBee芯片厂商。

  • Jennic (JN5148,已停产):N5148 是一款超低功耗、高性能 MCU,结合了符合 IEEE802.15.4 标准的收发器。它面向低功耗无线网络应用,具有增强型 32 位 RISC 处理器,通过可变宽度指令、多级指令流水线和具有可编程时钟速度和各种睡眠模式的低功耗操作提供高编码效率。该器件包括 128 kB ROM、128 kB RAM 以及丰富的模拟和数字外设组合。大内存占用空间允许该器件既可以运行网络堆栈(如ZigBee PRO或恩智浦专有的JenNet网络堆栈),也可以运行嵌入式应用或协处理器模式。工作电流低于 18 mA,允许直接从纽扣电池工作。

  • Nordic(NRF52840):NRF52840是Nordic Semiconductor公司推出的一款多协议无线通信模块,其中包括对Zigbee的支持。它采用了高性能的ARM Cortex-M4处理器,集成了丰富的硬件资源和Zigbee协议栈,适用于高性能和低功耗要求的应用场景。

  • TI(CC2530)::CC2530是德州仪器(Texas Instruments)推出的一款常用的Zigbee模块。它采用了低功耗的SoC(系统级芯片)设计,集成了Zigbee通信协议栈并结合了领先的射频收发器,采用行业标准增强型 8051 MCU,提供在系统内可编程闪存、8KB大小的RAM和许多其他强大功能。CC2530模块广泛应用于家庭自动化、工业控制和传感器网络等领域。


CC2530EM+SmartRF05

射频板我们使用CC2530EM,它是使用CC2530为核心基于推荐的参考设计实现的完整射频模块。该模块配备一个32 MHz 晶振、一个32.768 kHz 晶振、射频电路上的巴伦和天线匹配滤波器等无源元件以及用于连接天线的SMA 连接器。其相关的参考原理设计可以点击此处跳转。

这里如果需要有更远的传输距离,可以选用CC2530-CC2591EM,它增加了具有高达+22dBm增益的2.4GB射频前端芯片CC2591。

底板我们使用SmartRF05,它能连接多个德州仪器(TI)低功耗射频模块。该板具有广泛的外围接口,例如:

  • 3x16字符串行LCD
  • 全速USB 2.0接口
  • UART
  • LED
  • Buttons
  • Joystick

我们在上图的底板红框处插入射频板,然后通过CC Debug连接到底板即可进行程序下载调试,点击这里跳转底板相关参考设计。


例程解析

Ti官网提供了相关例程供用户评估射频性能,点击这里跳转下载(不要私信博主要代码了,能上传的网络资源均已上传或者在文章中添加链接,具体的项目工程代码绝不会给)。

官网的例程一共包含以下三个功能实现:

  1. Light/Switch application:这个例程用于实现无线控制LED灯,芯片需要提前刷写‘light_switch’工程 。例程需要两个节点,一个作为无线开关,一个作为无线灯控制器。具体例程的使用过程如下:
    1. 在底板摁下Button1进入应用程序菜单。
    2. 选择节点模式。通过向右或向左移动joystick来导航菜单。选择其中一个节点上的设备模式为“Switch”,另一个节点上的设备模式为“Light”。确认选项按Button1。
    3. LED开关应用示例现已准备就绪。“Light”节点上的 LED1现在可以通过向下移动“Switch”上的joystick来切换。
  2. Packet Error Rate tester application(PER测试):这个例程需要提前刷写‘per_test’工程,需要两个节点来完成数据报误码率测试,数据包误码率测试应用程序在两个节点之间建立单向射频链路。一块板子将作为发射节点运行,另一块板将作为接收节点运行。发送器节点必须配置了要使用的输出功率和作为 PER 测试的一部分要传输的数据包数(burst size)。在 PER 测试期间,接收方节点将显示接收的数据包数,即 RSSI电平(信号强度)和 PER。发射节点需要配置模式为发送,接收节点配置模式为接收,两者的通道配置需要保持一致。CC2530EM与CC2530-CC2591EM两种不同的射频板提供了不同的配置选项,CC2530-CC2591EM增加了接收增益,并提供了更高的输出功率:
    1. CC2530EM:Channel=11–26 (2405 – 2480 MHz);Operating Mode=Receiver/Transmitter;TX Output Power=-3dBm/0dBm/4dBm;Burst Size=1K/10K/100K/1M;Packet rate=100, 50, 20 or 10 packets per second。
    2. CC2530-CC2591EM:Channel=11 – 26 (2405 – 2480 MHz);Operating Mode=Receiver/Transmitter;Receiver gain=High Gain/Low Gain;TX Output Power=0 dBm/13 dBm/16 dBm/18dBm/20 dBm;Burst Size=1K, 10K, 100K, 1M;Packet rate=100, 50, 20 or 10 packets per second。
  3. Spectrum Analyzer application:此应用程序使用 SmartRF05EB上的LCD显示所有IEEE 802.15.4定义通道(11到26)的RSSI值。应用程序以条形图显示模式启动。在此模式下,只有 16 个通道的条形图显示。条形图范围为-120dBm至-10dBm。文本模式添加文本显示通道号和一个特定通道的测量值,同时仍显示所有通道的条形图,尽管分辨率有所降低。用户可以在通过向上移动joystick来显示模式。在文本模式下,通过移动joystick来选择频道向左或向右。

工程代码结构

工程代码主要由以下三个部分组成(组件):

  • Application layer:该部分包含了上述所示的三种例程实现,可访问到基本RF和HAL。
  • Basic RF:提供了一个简单的协议,用于使用双向射频链路实现传输和接收。
  • Hardware Abstraction Layer:包含访问片内外设,诸如RF、ADC、定时器等;以及板载的功能外设模块如LCD、UART、操纵杆、按钮。

工程的帮助文档位于docs文件夹中。工作区文件位于ide文件夹中。不同应用程序的代码可以在文件夹 source/Apps 中找到。组件文件夹包括应用程序使用的不同组件的源代码。HAL和基本射频
源代码组件位于组件文件夹下。 

Basic RF 

基本射频层使用双向射频链路提供简单的发射和接收协议。基本射频协议提供数据包传输和接收服务。它还通过使用CCM-64身份验证和数据包加密/解密进行通信,提供安全功能。安全功能的使能可以通过定义编译开关SECURITY_CCM来实现。该协议使用符合IEEE 802.15.4的MAC标准数据包。然而,它不提供完整的MAC层,仅提供用于两个节点之间通信的简单数据链路层。

  • Association, scanning or beacons均没有实现。
  • 没有定义coordinator/device角色(所有节点平等)。
  • 没有报重发。

数据帧如下图所示。

Basic RF的使用主要分为以下三个部分。

  1. Startup: 确保外设和RF已初始化,即调用halBoardInit()。创建一个basicRfCfg_t结构,并初始化其成员。如果使用Basic RF的安全特性,上层负责分配16字节密钥。调用basicRfInit()初始化数据包协议。
  2. Transmission:建立一个buffer用于存储要发送的数据,最大为103字节。调用basicRfSendPacket()发送。
  3. Reception:通过调用 basicRfPacketIsReady()来执行轮询,以检查是否接收到新数据包可以由上层处理。调用basicRfReceive()以接收完成数据包。调用方负责为数据包分配足够大的缓冲区,为RSSI值分配2字节缓冲区空间。

通过调用 basicRfReceiveOn(),无线电接收器将始终保持开启状态。节点能够随时接收数据包,缺点是电流消耗较高。通过调用 basicRfReceiveOff()关闭无线电接收器。

如果需要调用Basic RF层相关API,需要提前包含basic_rf.h与basic_rf_security.h。

下面是结构体与API原型代码,代码中包含API的功能说明。

typedef struct {uint16 myAddr;uint16 panId;uint8 channel;uint8 ackRequest;#ifdef SECURITY_CCMuint8* securityKey;uint8* securityNonce;#endif
} basicRfCfg_t;/***********************************************************************************
* GLOBAL FUNCTIONS
*//* Initialise basic RF datastructures. Sets channel, short address and PAN ID in the chip and configures interrupt on packet reception. The board peripherals and radio interface must be called before this function with the function halBoardInit(). */
uint8 basicRfInit(basicRfCfg_t* pRfConfig);/* Send packet to the given destination short address. Returns TRUE if packet was sent
successfully, and FAILED otherwise. If ackRequest is TRUE the return value of this function will only be TRUE if an acknowledgment is received from the destination. */
uint8 basicRfSendPacket(uint16 destAddr, uint8* pPayload, uint8 length);/* Returns TRUE if a received packet is ready to be retrieved by higher layer. */
uint8 basicRfPacketIsReady(void);/* Returns the RSSI value of the last received packet */
int8 basicRfGetRssi(void);/* Retrieve packet from basic RF layer. The caller is responsible for allocating buffer space for data and the RSSI value. */
uint8 basicRfReceive(uint8* pRxData, uint8 len, int16* pRssi);/*Turn on receiver on radio. After calling this function the radio is kept on until basicRfReceiveOff is called. */
void basicRfReceiveOn(void);/* Turn off receiver on radio, and keep it off unless for transmitting a packet with Clear Channel Assessment. */
void basicRfReceiveOff(void);

下面的时序图介绍了软件组件在初始化工作中完成的调用流程。

下面的时序图介绍了软件组件在发送工作中完成的调用流程。

 下面的时序图介绍了软件组件在接收工作中完成的调用流程。

最后再次强调以下例程中的Basic RF只是一种非常简单的IEEE 802.15.4实现,它并不完整,建议使用TIMAC或SimplicTI代替 Basic RF进行产品开发。

Hardware Abstraction Layer

要使用HAL组件中的API,需要包含hal_rf.h和hal_rf_security.h。

下面的代码包含此组件涉及的API以及对应的功能说明。

/* Powers up the radio, configures the radio with recommended register settings, enables
autoack and configures the IO on the radio. This function must be called after halBoardInit(). */
uint8 halRfInit(void);/* Set TX output power */
uint8 halRfSetTxPower(uint8 power);/* Transmit frame */
uint8 halRfTransmit(void);/* Set gain mode. This is only used if external LNA/PA is used. */
void  halRfSetGain(uint8 gainMode);     // With CC2590/91 only/* return radio chip id register */
uint8 halRfGetChipId(void);/* Return radio chip version register */
uint8 halRfGetChipVer(void);/* Return random byte. */
uint8 halRfGetRandomByte(void);/* Return RSSI offset for radio. */
uint8 halRfGetRssiOffset(void);//* Write the number of bytes given by length from the memory location pointed to by the pointer data to the radio TX buffer. */
void  halRfWriteTxBuf(uint8* pData, uint8 length);/* Read the number of bytes given by length from radio RX buffer to the memory location pointed to by the pointer data. The radio status byte is returned. */
void  halRfReadRxBuf(uint8* pData, uint8 length);/* Wait until the transceiver is ready */
void  halRfWaitTransceiverReady(void);/* Turn on receiver on radio. */
void  halRfReceiveOn(void);/* Turn off receiver on radio. */
void  halRfReceiveOff(void);/* Clear and disable RX interrupt. */
void  halRfDisableRxInterrupt(void);/* Enable RX interrupt. */
void  halRfEnableRxInterrupt(void);/* Configure RX interrupt, and setting the function to be called on interrupt. */
void  halRfRxInterruptConfig(ISR_FUNC_PTR pfISR);///
// IEEE 802.15.4 specific interface/* Set RF channel. Channel must be in the range 11-26. */
void  halRfSetChannel(uint8 channel);/* Write 16 bit short address to the radio. */
void  halRfSetShortAddr(uint16 shortAddr);/* Write 16 bit PAN ID to the radio. */
void  halRfSetPanId(uint16 PanId);

工程编译与下载

首先,连接好底板和主板,并将开发板与电脑通过USB线连接。

首先确保EM选择开关(SmartRF05EB上的P19)位于SoC/TRX位置,使用IAR打开CC2530_SW_examples.eww。可以看到下图有针对三种不同例程的工程。选择对应工程,然后选择Project->Rebuild All进行代码编译。

此时可以直接通过IAR进行在线仿真调试,也可以通过通过Ti提供Flash Programmer进行hex程序烧写。


十六宿舍 原创作品,转载必须标注原文链接。

©2023 Yang Li. All rights reserved.

欢迎关注 『十六宿舍』,大家喜欢的话,给个👍,更多关于嵌入式相关技术的内容持续更新中。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/192461.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

java+springboot校园一卡通学生卡管理系统+jsp

利用校园卡实现了学生在学校的身份认证,对学生在学校的各种消费提供了方便的途径。对于学校图书馆,将自动存储学生图书借阅情况,记录处罚情况.对于任课教师可以及时、准确、方便的了解学生出勤、作业等情况。是凭借发达的网络技术&#xff0c…

Could NOT find resource [logback-test.xml]

修改 之后就可以正常启动了

训练自己的YOLOv8姿态估计模型

在不断发展的计算机视觉领域,姿态估计作为一项关键创新脱颖而出,改变了我们理解视觉数据以及与视觉数据交互的方式。 Ultralytics YOLOv8 处于这一转变的最前沿,提供了一个强大的工具来捕捉图像中物体方向和运动的微妙之处。 NSDT工具推荐&am…

考虑极端天气线路脆弱性的配电网分布式电源配置优化模型_IEEE33节点(附带Matlab代码)

随着新能源技术及智能电网的发展,越来越多的分布式电源加入配电网中,不仅改变了配电网结构及供电方式,而且提升了配电网的供电质量。但是在全球气候变暖的背景下,极端天气发生的频率也越来越高,一旦发生必将对配电网系…

系统清理软件CCleaner pro mac功能亮点

CCleaner pro for mac是一款mac系统清理软件。CCleaner pro 主要用来清除mac系统不再使用的垃圾文件,以腾出更多硬盘空间。CCleaner pro下载的另一大功能是清除使用者的上网记录。CCleaner的体积小,运行速度极快,可以对临时文件夹、历史记录、…

Spring Cloud Gateway与spring-cloud-circuitbreaker集成与理解

官方文档地址 本文以 spring-cloud2021版本为例子 spring-cloud-gateway文档地址: https://spring.io/projects/spring-cloud-gateway#overview spring-cloud-circuitbreaker文档地址: https://spring.io/projects/spring-cloud-circuitbreaker 两者…

Gradio库的安装和使用教程

目录 一、Gradio库的安装 二、Gradio的使用 1、导入Gradio库 2、创建Gradio接口 3、添加接口到Gradio应用 4、处理用户输入和模型输出 5、关闭Gradio应用界面 三、Gradio的高级用法 1、多语言支持 2、自定义输入和输出格式 3、模型版本控制 4、集成第三方库和API …

C# WPF上位机开发(绘图软件)

【 声明:版权所有,欢迎转载,请勿用于商业用途。 联系信箱:feixiaoxing 163.com】 本身c# wpf可以看成是生产力工具,它的意义在于可以快速根据业务的情况,把产品模型搭建出来。这一点不像c/c,需要…

实时流式计算 kafkaStream

文章目录 实时流式计算Kafka StreamKafka Streams 的关键概念KStreamKafka Stream入门案例编写SpringBoot 集成 Kafka Stream 实时流式计算 一般流式计算会与批量计算相比较 流式计算就相当于上图的右侧扶梯,是可以源源不断的产生数据,源源不断的接收数…

SVN下载使用和说明

一、SVN <1>SVN的简介 1、svn是什么&#xff1f; 2、作用 3、基本操作 <2>服务器端的软件下载和安装 1、下载 2、查看环境变量 3、验证安装是否成功 <3>创建项目版本库 1、创建项目版本库&#xff08;svn reponsitory&#xff09; 2、svn版本控制文件说明…

TCP显式编码报文长度发送与接收

报文格式最重要的是如何确定报文的边界。常见的报文格式有两种方法&#xff0c;一种是发送端把要发送的报文长度预先通过报文告知给接收端&#xff1b;另一种是通过一些特殊的字符来进行边界的划分。 这篇文章中讲的是发送报文长度的方法。报文类型如下&#xff1a; 第一部分…

document

原贴连接 1.在整个文档范围内查询元素节点 功能API返回值根据id值查询document.getElementById(“id值”)一个具体的元素节根据标签名查询document.getElementsByTagName(“标签名”)元素节点数组根据name属性值查询document.getElementsByName(“name值”)元素节点数组根据类…

禁止谷歌浏览器自动更新

禁止谷歌浏览器自动更新 在使用Python包selenium的时候浏览器版版本发生变化后产生很多问题如&#xff1a; 1、直接版本不对应无法运行 2、版本不一致导致debug启动浏览器超级慢 这里是已谷歌浏览器为代表的。 禁止自动更新的方法如下&#xff1a; 1、WinR调出运行&#x…

竞赛选题 题目:基于深度学习的手势识别实现

文章目录 1 前言2 项目背景3 任务描述4 环境搭配5 项目实现5.1 准备数据5.2 构建网络5.3 开始训练5.4 模型评估 6 识别效果7 最后 1 前言 &#x1f525; 优质竞赛项目系列&#xff0c;今天要分享的是 基于深度学习的手势识别实现 该项目较为新颖&#xff0c;适合作为竞赛课题…

springboot+java电脑硬件库存管理系统+jsp

现如今&#xff0c;信息种类变得越来越多&#xff0c;信息的容量也变得越来越大&#xff0c;这就是信息时代的标志。近些年&#xff0c;计算机科学发展得也越来越快&#xff0c;而且软件开发技术也越来越成熟&#xff0c;因此&#xff0c;在生活中的各个领域&#xff0c;只要存…

SQL自学通之查询--SELECT语句的使用

一、前言 1、目标 在今天你将学习到以下内容&#xff1a; l 如何写SQL的查询 l 将表中所有的行选择和列出 l 选择和列出表中的选定列 l 选择和列出多个表中的选定列 2、背景 在上篇中我们简要地介绍了关系型数据库系统所具有的强大功能 在对 SQL 进行了 简要的介绍中我们…

[UnityWebGL]修改webgl启动模板

首先了解什么是WEBGGL启动模板&#xff0c;如下图&#xff1a; 其次&#xff0c;启动模板在哪里设置&#xff0c;如下图&#xff1a; 最后&#xff0c;怎么改启动模板里面的内容&#xff08;提供最简单的方式&#xff0c;直接改官方的&#xff09;&#xff1a; 1、首先在Asset…

TypeScript编程语言学习,为学习HarmonyOS开发做准备

1. 编程语言 ArkTS是HarmonyOS优选的应用开发语言&#xff0c;它在TypeScript&#xff08;TS&#xff09;的基础上&#xff0c;匹配ArkUI扩展&#xff0c;扩展了声明式UI、状态管理等相应的能力。 JavaScript&#xff08;JS&#xff09;&#xff0c;使用在Web应用开发&#xf…

RHCSA学习笔记(RHEL8) - Part2.RH134

Chapter Ⅰ 提高命令行生产率 SHELL脚本 #/bin/bash声明使用的shell翻译器 for循环 for VAR in LIST doCOMMAND1COMMAND2 done实验1&#xff1a;显示host1-5 #! /bin/bash for host in host{1..5} doecho $host done实验2&#xff1a;显示包含kernel的软件包安装时间 #! /…

CAN总线学习(STM32的CAN寄存器使用)(笔记二)

CAN总线基础基础知识的文章&#xff1a;CAN总线学习&#xff08;CAN总线基础知识&#xff09;&#xff08;笔记一&#xff09;-CSDN博客 在前面CAN总线基础知识和报文中介绍的是报文内容是比较全面的&#xff0c;STM32在CAN协议的基础上做了一些简单的简化&#xff0c;例如下图…