文章延續(xù)之前【物聯網無線通信技術】系列文章的風格,首先對ZigBee這種在物聯網發(fā)展初期出現的無線通信技術進行了相關背景概念的介紹,并橫向介紹了幾款時間跨度比較大的ZigBee芯片。然后以CC2530為例,從硬件到軟件介紹了ZigBee這中無線通信技術的實現。相信讀者通過通讀本篇文章,能夠對ZigBee無線通信的實現有一個直觀的認識。因篇幅有限,本篇中有些概念和功能沒有詳細展開,讀者可以通過文中的外鏈進行更深的探究。
目錄
ZigBee概述
CC2530EM+SmartRF05
例程解析
工程代碼結構
Basic RF?
Hardware Abstraction Layer
工程編譯與下載
ZigBee概述
ZigBee技術是一種短距離無線通信技術,主要的特色有數據傳輸速率低、功耗低、實現成本低、網絡容量大等,常用于智能家居,工業(yè)自動化等領域。Zigbee基于IEEE 802.15.4標準,該標準定義了用于低速無線個人局域網(LR-WPANs)的物理層和介質訪問控制(MAC)層。Zigbee在此基礎上提供了網絡層、安全特性和各種用例的應用框架,應用層的開發(fā)可以根據用戶的應用需要,對其進行靈活的組網、開發(fā)利用。常見的ZigBee的工作頻段為2.4G,一共具有16個信道11 (2405 MHz) to 26 (2480 MHz),理論上通信速率可達250kbps,采用O-QPSK調制,實際的通信距離取決于發(fā)射功率和天線的效率。
下面介紹幾款常見的ZigBee芯片廠商。
-
Jennic (JN5148,已停產):N5148 是一款超低功耗、高性能 MCU,結合了符合 IEEE802.15.4 標準的收發(fā)器。它面向低功耗無線網絡應用,具有增強型 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通信協議棧并結合了領先的射頻收發(fā)器,采用行業(yè)標準增強型 8051 MCU,提供在系統內可編程閃存、8KB大小的RAM和許多其他強大功能。CC2530模塊廣泛應用于家庭自動化、工業(yè)控制和傳感器網絡等領域。
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官網提供了相關例程供用戶評估射頻性能,點擊這里跳轉下載(不要私信博主要代碼了,能上傳的網絡資源均已上傳或者在文章中添加鏈接,具體的項目工程代碼絕不會給)。
官網的例程一共包含以下三個功能實現:
-
Light/Switch application:這個例程用于實現無線控制LED燈,芯片需要提前刷寫‘light_switch’工程 。例程需要兩個節(jié)點,一個作為無線開關,一個作為無線燈控制器。具體例程的使用過程如下:
- 在底板摁下Button1進入應用程序菜單。
- 選擇節(jié)點模式。通過向右或向左移動joystick來導航菜單。選擇其中一個節(jié)點上的設備模式為“Switch”,另一個節(jié)點上的設備模式為“Light”。確認選項按Button1。
- LED開關應用示例現已準備就緒?!癓ight”節(jié)點上的 LED1現在可以通過向下移動“Switch”上的joystick來切換。
-
Packet Error Rate tester application(PER測試):這個例程需要提前刷寫‘per_test’工程,需要兩個節(jié)點來完成數據報誤碼率測試,數據包誤碼率測試應用程序在兩個節(jié)點之間建立單向射頻鏈路。一塊板子將作為發(fā)射節(jié)點運行,另一塊板將作為接收節(jié)點運行。發(fā)送器節(jié)點必須配置了要使用的輸出功率和作為 PER 測試的一部分要傳輸的數據包數(burst size)。在 PER 測試期間,接收方節(jié)點將顯示接收的數據包數,即 RSSI電平(信號強度)和 PER。發(fā)射節(jié)點需要配置模式為發(fā)送,接收節(jié)點配置模式為接收,兩者的通道配置需要保持一致。CC2530EM與CC2530-CC2591EM兩種不同的射頻板提供了不同的配置選項,CC2530-CC2591EM增加了接收增益,并提供了更高的輸出功率:
- 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。
- 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。
- 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文件夾中。工作區(qū)文件位于ide文件夾中。不同應用程序的代碼可以在文件夾 source/Apps 中找到。組件文件夾包括應用程序使用的不同組件的源代碼。HAL和基本射頻
源代碼組件位于組件文件夾下。?
Basic RF?
基本射頻層使用雙向射頻鏈路提供簡單的發(fā)射和接收協議?;旧漕l協議提供數據包傳輸和接收服務。它還通過使用CCM-64身份驗證和數據包加密/解密進行通信,提供安全功能。安全功能的使能可以通過定義編譯開關SECURITY_CCM來實現。該協議使用符合IEEE 802.15.4的MAC標準數據包。然而,它不提供完整的MAC層,僅提供用于兩個節(jié)點之間通信的簡單數據鏈路層。
- Association, scanning or beacons均沒有實現。
- 沒有定義coordinator/device角色(所有節(jié)點平等)。
- 沒有報重發(fā)。
數據幀如下圖所示。
Basic RF的使用主要分為以下三個部分。
- Startup:?確保外設和RF已初始化,即調用halBoardInit()。創(chuàng)建一個basicRfCfg_t結構,并初始化其成員。如果使用Basic RF的安全特性,上層負責分配16字節(jié)密鑰。調用basicRfInit()初始化數據包協議。
- Transmission:建立一個buffer用于存儲要發(fā)送的數據,最大為103字節(jié)。調用basicRfSendPacket()發(fā)送。
- Reception:通過調用 basicRfPacketIsReady()來執(zhí)行輪詢,以檢查是否接收到新數據包可以由上層處理。調用basicRfReceive()以接收完成數據包。調用方負責為數據包分配足夠大的緩沖區(qū),為RSSI值分配2字節(jié)緩沖區(qū)空間。
通過調用 basicRfReceiveOn(),無線電接收器將始終保持開啟狀態(tài)。節(jié)點能夠隨時接收數據包,缺點是電流消耗較高。通過調用 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_CCM
uint8* 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);
下面的時序圖介紹了軟件組件在初始化工作中完成的調用流程。
下面的時序圖介紹了軟件組件在發(fā)送工作中完成的調用流程。
?下面的時序圖介紹了軟件組件在接收工作中完成的調用流程。
最后再次強調以下例程中的Basic RF只是一種非常簡單的IEEE 802.15.4實現,它并不完整,建議使用TIMAC或SimplicTI代替 Basic RF進行產品開發(fā)。
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);
工程編譯與下載
首先,連接好底板和主板,并將開發(fā)板與電腦通過USB線連接。
首先確保EM選擇開關(SmartRF05EB上的P19)位于SoC/TRX位置,使用IAR打開CC2530_SW_examples.eww??梢钥吹较聢D有針對三種不同例程的工程。選擇對應工程,然后選擇Project->Rebuild All進行代碼編譯。
此時可以直接通過IAR進行在線仿真調試,也可以通過通過Ti提供Flash Programmer進行hex程序燒寫。
十六宿舍 原創(chuàng)作品,轉載必須標注原文鏈接。
?2023 Yang Li. All rights reserved.文章來源:http://www.zghlxwxcb.cn/news/detail-767259.html
歡迎關注?『十六宿舍』,大家喜歡的話,給個??,更多關于嵌入式相關技術的內容持續(xù)更新中。文章來源地址http://www.zghlxwxcb.cn/news/detail-767259.html
到了這里,關于【物聯網無線通信技術】ZigBee從理論到實踐(CC2530)的文章就介紹完了。如果您還想了解更多內容,請在右上角搜索TOY模板網以前的文章或繼續(xù)瀏覽下面的相關文章,希望大家以后多多支持TOY模板網!