1. 程式人生 > >基於μC/OS—III的CC1120驅動程式設計

基於μC/OS—III的CC1120驅動程式設計

摘要:本文根據實際需要,在實現無線資料傳輸系統基本功能的前提下,選用功耗較低的CC1120晶片作為無線收發單元。在分析CC1120功能特性並介紹嵌入式作業系統μC/OS—III的基礎上,闡述如何實現基於STM32F103ZE平臺的CC1120驅動程式。
關鍵詞:CC1120;嵌入式作業系統;STM32F103ZE;驅動設計

引言
    隨著頻率資源的日趨緊張,短距離無線通訊按窄帶化趨勢發展。無線數傳模組一般由微處理器和收發晶片組成,本文所設計的窄帶數傳模組的微處理器採用了STM32F103ZE晶片,收發晶片選用了TI公司新推出的CC1120,CC1120通過SPI序列匯流排協議與MCU相連線。同時,採用了可移植、可植入ROM、可裁剪、搶佔式的實時多工作業系統μC/OS—III作為軟體平臺。

1 系統硬體電路
1.1 CC1120的內部結構
   

CC1120是TI公司專為經濟高效的無線系統在低功耗和低電壓操作下,實現資料傳輸而設計的一款完全整合的單晶片無線收發器。該晶片主要應用於ISM(工業、科學和醫療)以及SRD(短程裝置)頻帶。CC1120的主要特性有:體積小,超低功耗,可配置資料速率(1.2~200kbps),可程式設計控制輸出功率(步長為0.5 dB,最高功率16 dBm),接收機靈敏度高(1.2 kbps資料速率下為123 dBm),還支援2FSK、2GFSK、4FSK、4GFSK、MSK、ASK、OOK及模擬FM多種調製方式等。

a.JPG


    CC1120的內部結構框圖如圖1所示。CC1120具有一個低功耗IF接收機,低噪聲放大器(LNA)將接收到的RF、訊號放大,並在求積分(I和Q)過程中被降壓轉換至中頻(IF)。在IF下,I/Q訊號被ADC數字化。自動增益控制(AGC)、精確通道濾波和調製解調位/資料包同步均以數字方式完成。CC1120的發射器部分基於RF頻率直接合成,頻率合成器包括一個完全片上LC VCO和一個90°相位轉換器,用來在接收模式下向降壓轉換混頻器生成I和Q本振訊號。一個4線SPI序列介面用於配置資料和緩衝區存取。數字基帶包括了對通道配置、資料包處理以及資料緩衝的支援。
1.2 CC1120的配置特性
   

配置暫存器的讀、寫操作時序如圖2所示。通過一個4線序列SPI相容介面(SI、SO、SCLK和CSn)可對CC1120進行配置,該介面還可用於讀取和寫入緩衝資料。SPI介面上的所有資料傳輸均以最高位開始。

b.JPG


    SPI介面上的所有事務均以一個報頭位元組作為開始,該位元組包含一個R/W位、一個突發存取位(B)以及一個6位地址(A5~A0),報頭位元組幀格式如圖3所示。在SPI總線上傳輸資料期間,CSn引腳必須保持低電平,否則傳輸就會被取消。拉低CSn電平時,在開始傳輸該報頭位元組以前,MCU必須等待,直到SO引腳變為低電平為止。這表明,晶片正在執行。除非晶片處在SLEEP或XOFF狀態,否則SO引腳總會在CSn變為低電平以後立即變為低電平。

d.JPG


    CC1120的暫存器空間主要作為CC1120的頻率、資料速率、中頻等大部分引數的配置。而擴充套件暫存器大部分為晶片配置輔助測試暫存器(只讀),少部分為配置暫存器(可讀寫)。指令選通用於晶片狀態切換和沖刷RX/TXFIFO。128位元組TX FIFO和128位元組RX FIFO均通過0x3F地址進行存取。當R/W位為0時,則TX FIFO被存取;當R/W位為1時,則RX FIFO被存取。其中,TXFIFO為只寫,而RX FIFO為只讀。暫存器地址對映如圖4所示。

d.JPG


1.3 硬體連線關係
   
窄帶無線資料傳輸系統的STM32F103ZE與無線收發晶片的硬體連線關係如圖5所示。左側為STM32F103ZE,它是一個32位、基於ARM Cort ex—M3核心的無線收發晶片。除了正常工作模式外,還支援睡眠、待機、停機工作模式,當所有外設都處於工作模式時消耗36 mA,待機時下降到2μA。CC1120內部整合的SPI介面的傳輸速率最高可達到18 Mbps。

e.JPG


    右側為無線收發晶片CC1120。CC1120的外部控制引腳主要有復位介面、SPI序列介面以及4個通用輸出引腳GPIO0~GPIO3。其中,4個通用輸出引腳在實際應用中,可以通過配置暫存器使它們為上層實時提供同步字或資料包收發狀態等應用。在硬體平臺上,CC1120的SPI序列介面(CSn、SCLK、SI、SO)分別連線到STM32F103ZE相應的4個SPI序列通訊弓I腳(即SPI2_NSS、SPI2_SCLK、SPI2_MOSI、SPI2_ISO上)。通過這4根線,TM32F103ZE可以對CC1120進行引數配置、晶片狀態切換以及RX/TX FIFO的讀寫。由於CC1120只有SPI從模式,因此TM32F103ZE採用SPI主模式。另外,本方案還採用了1個通用數字輸出引腳GPIO0,用來實現資料包分組傳送指示。同時,TM32F103ZE可以通過控制RESET引腳,復位無線收發晶片。
    通訊方式為SPI序列通訊時,時鐘源由STM32F103ZE提供,通過配置處理器暫存器,SPI的SCLK時鐘頻率為4.5 MHz。通過TM32F103ZE內部的8位移位暫存器,實現CC1120與STM32F103ZE的序列資料交換。CSn引腳主要用來控制資料通訊的同步性,通訊期間要始終保證CSn引腳的電平為低。但是,需要注意的是CC1120的CSn引腳的時序並未完全遵照SPI時序規範,因此,STM32F103ZE的SPI2_NSS引腳需要設定成普通GPIO介面模式,並採用軟體控制方式。

2 軟體平臺
    μC/OS—III實現了一個基於優先順序排程的搶佔式核心,並在這個核心之上提供了最基本的系統服務,例如訊號量、郵箱、訊息佇列、記憶體管理、中斷管理等,但它並不提供裝置管理和檔案系統管理。

f.JPG


    訊號量用於控制共享資源的訪問,可用於中斷服務子程式與任務間、任務與任務間的同步。本設計中採用訊號量機制來管理兩個共享資源,傳送緩衝區和接收緩衝區。讀任務、中斷服務子程式和接收環形緩衝區之間的關係如圖6所示。圖中的共享資源為接收環形緩衝區,IN和OUT分別為入隊和出隊指標。當IN等於OUT時,則接收環形緩衝區為空,呼叫OSSemPend()阻塞讀任務;當IN不等於OUT時,如果讀任務被阻塞,則在中斷服務子程式中呼叫OSSemPost()喚醒讀任務。

3 CC1120驅動實現
   
本文參考了國內研究者提出的μC/OS下通用驅動框架模型,將CC1120驅動架構模型劃分成上層訪問抽象介面層、硬體裝置驅動模組層和硬體裝置介面操作層。其中,上層訪問抽象介面層通過對硬體平臺的抽象,可以在系統開發中向上層應用遮蔽硬體特徵,從而實現軟/硬體的分離;硬體裝置驅動模組層是整個驅動框架的中間封裝層,通過該層的封裝,對上一層遮蔽了SPI硬體介面;而硬體裝置介面操作層是實現對底層硬體SPI序列介面的功能操作,通過呼叫該層介面,可以實現CC1120提供的全部功能。
3.1 驅動體系結構
   
CC1120的驅動體系結構如圖7所示。上層訪問抽象介面層是驅動體系中的最高層,該模組主要實現了資料包傳送與接收功能,並對無線收發晶片的狀態進行控制和獲取RSSI值。其中,perCC1120Init()介面主要完成CC1120的初始化、啟動並配置晶片等功能;perCC1120Read()實現資料包的接收,以及對讀緩衝區的管理;perCC1120Wrire()實現資料包的傳送,以及對寫緩衝區的管理;perCC1120Ioctl()實現了CC11 20的各個工作狀態的切換(包括休眠和喚醒)和獲取RSSI值。

g.JPG


    硬體裝置驅動模組層實現對上層訪問抽象介面層操作,遮蔽了硬體SPI介面,提供了對CC1120的暫存器和FIFO的讀寫操作。其中,CC1120 SpiWriteReg()和CC1120SpiReadReg()分別提供了暫存器的寫和讀操作功能,遮蔽了8位和16位暫存器的區別;CC1120SpiWriteTxFifo()和CC1 120SpiReadRxFifo()提供了FIFO的連續寫和讀操作功能。
    硬體裝置介面操作層是對CC1120的硬體SPI介面的直接操作和軟體表達,該層為整個驅動模組提供了SPI同步序列通訊機制。其中,trx8 BitRegAccess()實現了8位暫存器的存取功能;trx16BitRegAccess()實現了16位暫存器的存取功能;trxSpiCmdStrobe()實現了晶片的指令選通功能,用於晶片工作狀態切換。
    本文結合CC1120驅動體系結構,簡要介紹其主要功能,即資料包的收發。
    應用層傳送資料包之前,先呼叫perCC1120Ioctl()獲取通道的RSSI值,當RSSI值低於通道忙碌的門限值時,則呼叫perCC1120Write()將需要傳送的資料傳送出去。perCC1120Write()的工作流程圖如圖8所示。本文使用了CC1120的通用GPIO0引腳,通過適當配置,該引腳電平會在傳送或者接收完一個數據包時產生一個下降沿跳變。當上一包資料包傳送完畢之後,GPIO0觸發中斷,STM32F103ZE進入中斷處理程式,將會發送寫緩衝區中的下一包資料包,直至傳送緩衝區為空,再把CC1120置於空閒或休眠狀態。

h.JPG


    當上層不處於傳送狀態時,CC1120都將置於接收狀態或增強型無線電喚醒狀態,當接收到一個數據包時,GPIO0引腳產生一個下降沿中斷,STM32F103ZE進入中斷處理程式,呼叫CC1120SpiReadRxFifo(),從接收緩衝RXFIFO中讀取資料包,並將其放入接收環形緩衝區中。如果接收環形緩衝區滿時,將放棄當前接收到的資料包。上層通過呼叫perCC1120Read()介面讀取接收到的資料包,當接收緩衝區為空時,將阻塞上層的讀取程序。perCC1120Read()的工作流程圖如圖9所示。

i.JPG


3.2 CC1120的配置要點
   
(1)暫存器配置軟體
    針對CC1120的暫存器配置,TI公司提供了SmartRFStudio 7軟體。通過這個軟體可以對CC1120進行配置,以獲得最佳暫存器設定以及效能和功能評估。配置軟體根據使用者輸入的發射頻率、晶振頻率、符號速率等引數,生成相應的暫存器配置資訊。
    (2)資料包處理的硬體支援
    CC1120內部支援的資料包處理方式有前導碼、同步字、地址過濾、CRC、資料白化、狀態位元組、位元組倒置等,同時,資料包長度型別支援固定長、可變長、無限長3種模式,可以通過手動配置PKT_CFG0~PKT_CFG2來實現。
    (3)增強型無線電喚醒
    在程式的實現過程中,當CC1120長時間沒有接收到資料時,則開啟增強型無線電喚醒功能(暫存器WOR_CFG0.RC_PD=0),併發送SWOR指令選通命令,將晶片工作狀態切換到睡眠狀態。CC1120將在MCU不干涉的前提下,週期性地從睡眠狀態中喚醒並監聽資料包的到來,從而降低系統的整體功耗。
    (4)接收的訊號強度指示
    CC1120在接收狀態下,能連續地從RSSI狀態暫存器(RSSI0、RSSI1)中讀取到RSSI值,直到檢測到一個有效的同步字,其後RSSI讀取值將被凍結。通過設定暫存器AGC_CFG1.AGC_SYNC_BEHAVIOR,可以解除RSSI值被凍結的狀態。
    (5)通用數字輸出引腳(GPIO0~GPIO3)
    在實際應用中,可以通過暫存器(IOCFG0~IOCFG3)配置,為上層實時提供通道或資料包狀態等資訊。本設計將暫存器IOCFG0的值設定為0x06,即利用了GPIO0引腳的電平跳變特點。當CC1120傳送完或接收到一包資料包,觸發MCU埠產生中斷,並在中斷服務程式中進行寫入或讀取緩衝區TX/RX FIFO等操作,使STM32F103ZE有更多時間處理其他事務或處於休眠狀態,達到降低整個系統功耗的目的。

結語
   
基於μC/OS—III和CC1120的短距離窄帶無線數傳系統方案,可以實現低功耗、近距離、可靠的無線資料傳輸,具有成本低、可擴充套件性強、操作靈活簡單的特點。通過對CC1120和STM32F103ZE進行適當的配置,硬體能在無資料收發的狀態下,自動進入低功耗的睡眠或待機狀態,可以大大降低硬體系統的整體功耗。大量測試結果表明,該窄帶無線資料傳輸系統資料收發正常,整個系統執行穩定,具備RSSI檢測、休眠喚醒等相關功能。

相關推薦

基於μCOS—III的CC1120驅動程式設計

摘要:本文根據實際需要,在實現無線資料傳輸系統基本功能的前提下,選用功耗較低的CC1120晶片作為無線收發單元。在分析CC1120功能特性並介紹嵌入式作業系統μC/OS—III的基礎上,闡述如何實現基於STM32F103ZE平臺的CC1120驅動程式。 關鍵詞:CC1120;嵌入式作業系統;STM32F

[原始碼和文件分享]基於C語言的Linux環境下socket程式設計

一 需求分析 柏克萊套接字,又稱為BSD 套接字是一種應用程式介面,用於網際插座與Unix域套接字,包括了一個用C語言寫成的應用程式開發庫,主要用於實現程序間通訊,在計算機網路通訊方面被廣泛使用。 使用Berkeley套接字的系統有很多,本系統是在Ubuntu下用C語言進行socket程式設

基於C語言的編碼器(光耦)程式設計C程式碼解析(二)

程式碼需要一個.c文件和一個.h文件。 .h文件主要配置編碼器相關引數 #define OptoKnobNumber 2 /* 旋鈕個數配置 */ #define _01_SH

Linux C基於C/S的多執行緒網路程式設計 2 (多客戶端)

客戶端: #include<stdio.h> #include<stdlib.h> #include<string.h> #include<sys/type

基於tcp的cs模型的一個簡單的socket實現

程式設計壞境是linux或者mac下。我是在mac下寫的,不過也是通過gcc編譯的。 通訊的業務模型在之前部落格裡面講得比較清楚了,函式功能之前部落格也有。現在附上鍊接。 http://blog.csdn.net/zxcvbnm0014/article/details/

CC++學習筆記第一天:MAC OS下搭建GCC和Sublime Text環境

本科的時候倒是學習了C/C++/Java 這一路搞研究,基本上就是網路模擬,也不太需要太多的程式設計,多半是演算法模擬,所以程式設計感覺越來越差。 人生總是那麼陰差陽錯,本科畢業的時候本來是計算機/金融雙學位,打算不再搞什麼計算機了,投身銀行算了。不料未及大四校園招聘,便被

Mac OS X核心程式設計,MAC驅動開發資源彙總

一.Mac  OS  X核心程式設計開發官方文件: I/O Kit Fundamentals: I/O Kit基礎 - Mac OS X系統核心程式設計 Threading Programming Guide:MAC OS X 執行緒程式設計指南 - Mac OS

網路程式設計專案:linux下基於C/S架構的聊天室

一、專案要求: 1. 採用 Client/Server 架構  2. Client A 登陸聊天伺服器前,需要註冊自己的 ID 和密碼  3. 註冊成功後,Client A 就可以通過自己的 ID 和密碼登陸聊天伺服器  4. 多個 Client X 可以同時登陸聊天伺服器

數據結構與算法 基於c語言篇

相互 線性 內存 例子 c語言 基於 數據結構 align 四種 學習數據結構與算法走向深藍之路 第一章:數據結構與算法概念型 數據結構:數據之間的相互關系,即是數據的組織形式. 基本組成:{ 數據:信息的載體 數據元素:數據基本單位: } 其結構形式有四種: 1,集合結構

基於C#實現的自動化測試框架:發布自動觸發自動化回歸測試

exc 時間流 測試用例 出現 服務器 text types filter txt 接口自動化測試用例完成以後,以前都是發布以後手動運行測試用例。雖然手動運行下腳本也就是一個F5的事情,但是離自動化測試的標準差得很遠。這兩天有了個大膽的想法,想要實現以下發布時直接觸發自動化

基於C++的多態性動態判斷函數

ios int std highlight 分析 end 一段 father names 這裏先有一個問題: 問題描述:函數int getVertexCount(Shape * b)計算b的頂點數目,若b指向Shape類型,返回值為0;若b指向Triangle類型,返回值為

基於C#解決OJ刷題之輸入輸出問題的總結(AKOJ1064-1071A+B問題匯總)

-s har article not edit stat sig nbsp rgs 聲明:題目部分為akoj題目,代碼為本人AC代碼。 因為本人學校的oj支持各種環境,非常正常的當中就包括了C#。然暑假在家較為空暇,本著學習C#和復習算法的態度

基於C#的超市收銀管理系統

sqlserve 兼容性 腳本 asc 正是 work 銷售 的人 身邊 基於C#的超市收銀管理系統 前序 一直在忙學習Qt有關的知識,非常有幸這學期學習了C#。讓我也感覺到了一絲欣慰,欣慰的是感覺好上手啊,學了幾天頓時懂了。好多控

ODB——基於c++的ORM映射框架嘗試(使用)

連接數據庫 代碼 pen c++代碼 /tmp acc void count() lan 摘要: 2、使用 首先,需要定義一個對象,用來和數據庫字段對應: [cce lang=”cpp”] #ifndef VOLUME_H #define VOLUM

基於C語言EOF與getchar的使用詳解

shp fct ongl jdb sys sgi utf lba egg %E8%AF%B7%E6%95%99%E9%AB%98%E6%89%8B%E5%A4%9A%E7%BA%BF%E7%A8%8B%E9%87%8C%E6%80%8E%E4%B9%88%E4%BD%BF%

基於C#的UDP協議的異步實現

connect sleep ack bind 服務器 endpoint length ddr blog 一、摘要   總結UDP傳輸協議的異步實現。 二、實驗平臺   visual studio 2010 三、實驗實例   服務器端代碼:

基於c編寫的關於隨機生成四則運算的小程序

合規 log 加減乘除 rand sys fail swe math.h str 基於http://www.cnblogs.com/HAOZHE/p/5276763.html改編寫的關於隨機生成四則運算的小程序 github源碼和工程文件地址:https://github.

C# 封裝winio.dll 驅動級按鍵鼠標操作模擬

middle lag gen escape exe get prior use sta using System;using System.Collections.Generic;using System.Text;using System.Runtime.InteropS

基於C語言的Wordcount

class lower 程序 == sta http for 數字 自己 該程序引用了LNZ001的博客筆記,鏈接地址:http://blog.csdn.net/LNZ001/article/details/54851551。 由於自己基礎比較薄弱,所以就引用了網

基於C#實現的多生產者多消費者同步問題實例

ado text current 消費 加鎖 time 字符 msl ins 本文實例講述了基於C#實現的多生產者多消費者同步問題,分享給大家供大家參考之用。具體代碼如下:// 多個生產者和多個消費者,能生產n個產品的情況 using System; using Syst