日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

CC1310手册的射频核心介绍

發布時間:2024/3/26 编程问答 51 豆豆
生活随笔 收集整理的這篇文章主要介紹了 CC1310手册的射频核心介绍 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

最近在使用CC1310的射頻核心傳進行無線數據收發任務,由于是第一次接觸到射頻方面的知識,閱讀CC1310手冊也費了不少勁,于是想著既然看了不如做些記錄,于是有了本篇翻譯性質的文章。

閱讀到一半突然一些感言,CC1310手冊中的內容大多是建立在某些底層通信協議的基礎之上的,并不會涵蓋很多通信協議方面的知識,如果向了解某些協議,比如藍牙,zigbee原理方面的知識,閱讀本片文章并不能對該方面有半點提升,手冊中講述的內容多半是建立在通信協議之上的偏向于應用的知識,如果是向了解CC1310是如何實現系統CPU和射頻CPU通信,射頻CPU又是如何處理發送前的數據的,則可以CC1310的手冊,本篇文章難免帶有個人主觀理解,若想請配合CC1310手冊一起閱讀,或許會加快手冊內容的理解,另外如有錯誤,懇請大家即時指認,希望可以和大家一起學習一起進步,感謝~


目錄

  • 一、概述
    • 1、射頻核的基本特性
  • 二、無線電門鈴(Radio Doorbell)
    • 1、命令和狀態寄存器
    • 2、射頻核的中斷
      • 2.1 射頻命令和數據包引擎中斷
      • 2.2 射頻核硬件中斷
      • 2.3 射頻核命令響應中斷
    • 3 無線電定時器
      • 3.1 比較和捕獲模式
        • 比較模式
        • 捕獲模式
      • 3.2 RAT 輸出
      • 3.3 與RTC時鐘的同步
  • 三、射頻核的硬件抽象層HAL
    • 1 硬件支持
    • 2 固件支持
      • 2.1 命令
        • 2.1.1 命令的分類
        • 2.1.2命令在寄存器中的存儲格式
        • 2.1.3 命令的存儲位置
      • 2.2 命令狀態
        • 2.2.1 CMDSTA寄存器
        • 2.2.2 命令結果中的狀態
      • 2.3 中斷
      • 2.4 數據傳播
      • 2.5 命令調度器
        • 2.5.1 觸發
          • trigger type
          • bEnaCmd
          • trigger No
          • pastTring
        • 2.5.2 條件執行
        • 2.5.3 無線電CPU在解析命令前處理
      • 2.6 命令的數據結構
      • 2.7 數據條目的數據結構
        • 2.7.1 數據條目隊列
        • 2.7.2 數據條目
        • 2.7.3 指針條目
        • 2.7.4 提前讀取部分接收條目
      • 2.8 外部信號
    • 3 命令的定義
      • 3.1 獨立于協議的無線電操作命令
      • 3.2 各種無線電命令的介紹
    • 4 數據隊列的用法
      • 4.1 僅供內部無線電CPU操作的數據隊列操作
        • 4.1.1 PROC_ALLOCATE_TX:讀取被分配的TX條目
        • 4.1.2 PROC_FREE_DATA_ENTRY:清除已分配數據條目
        • 4.1.3 PROC_FINISH_DATA_ENTRY:從隊列中完成第一個數據條目的使用
        • 4.1.4 PROC_ALLOCATE_RX:為存儲數據分配RX緩沖區
        • 4.1.5 PROC_FINISH_RX:提交接收到的數據到RX數據條目
      • 4.2 無線電CPU使用隊列操作樣例
        • 4.2.1 接收隊列
        • 4.2.2 發送隊列


射頻核心包含一個ARM Cortex-M0處理器(連接模擬射頻和內部電路),該核心處理來自系統端的數據,并在給定的包結構中組裝信息位。

射頻核心為系統CPU (ARM?Cortex?-M3)提供了一個高級的、基于命令的應用程序接口(API)。射頻核心可以自主地按照無線電協議(802.15.4 RF4CE和ZigBee?、藍牙?低能耗等)的嚴格時序要求完成任務,從而減輕系統CPU負擔,為用戶應用程序留下更多資源。

射頻核心有一個專用的4 kb SRAM塊,幾乎完全從單獨的ROM運行。

此處對在下文中提到的一些中文釋義做出說明:

中文釋義英文原義含義
無線電Radio修飾一些器件,表明該器件是存在于射頻核內部的
武裝ARM使被配置的RAT通道可以產生中斷事件
條目Entry在數據隊列中用于存儲數據包的基本單位
條目元素Entry element一個條目元素對于著一個射頻數據包
一個條目中可以有多個條目元素

一、概述

1、射頻核的基本特性

CPU與RF Core之間的事務處理有一個通用的架構,這個架構使得RF核心必須有以下幾個特性:

射頻核心可以直接訪問系統的RAM,可以從中讀取命令或數據,也可以將接收到的數據寫入到系統RAM中。出于協議機密性和認證支持的目的,射頻核心也可以訪問安全子系統。

一般情況下,射頻核心識別來自系統CPU的復雜命令(CCA傳輸、RX自動確認等),并將其劃分為若干子命令,而無需系統CPU的進一步干預。
射頻核的概述和外部依賴如下圖所示:??
其中被框起來的是射頻核內部的基本結構,可以看到CPU和RF CPU都處于同一條總線上,并且RF CPU可以通過總線與外部的RAM, Security subsystem通信,這里只需要有個大體的認識就好

二、無線電門鈴(Radio Doorbell)

無線電門鈴模塊(RFC_DBELL)是系統CPU和無線電CPU之間的主要通信手段,也被稱為Command and Packet engine(CPE)

無線電門鈴包含一組專用的寄存器和一組到CPU和RF CPU中的中斷。

此外,射頻配置參數和傳輸數據通過系統RAM或無線電RAM傳輸。需要注意的是,如果參數或數據是存在系統RAM中的,系統CPU必須在RF工作時處于正常工作狀態,若這些參數或數據都是存在無線電RAM中的,在RF核工作時,系統CPU可以進入掉電模式。

在RF核運作期間,無線電CPU會更新存在RAM中的相關參數和傳輸數據,并引發中斷。這些中斷是可以被系統CPU屏蔽(Mask out)的,因此這保證了在無線電操作全部完成前,系統CPU可以一直處于空閑或掉電狀態。

因為系統CPU和無線電CPU共享一個公共RAM區域,所以要確保不會發生爭用或競用情況。這是通過在無線電硬件抽象層(HAL)中建立的規則在軟件中實現的。

下圖是無線電硬件抽象層的硬件支持圖:

從硬件支持圖中可以看到很多有用的信息,下面將對這些內容進行詳細介紹

1、命令和狀態寄存器

  • CMDR:射頻命令通過CMDR寄存器發送到無線電
  • CMDSTA:只讀寄存器,CMDSTA會提供從無線電執行命令后返回的狀態

CMDR寄存器只能在讀取其為0時才能被寫入,否則此次寫操作被忽略。當CMDR寄存器為0并寫入一個非零值時,無線電CPU將被通知通知,CMDSTA寄存器變為0。在此之后,從CMDR寄存器寫入的值是可讀的,直到無線電CPU處理完該命令,會再次將CMDR清零,允許下一條命令寫入。

當該命令被無線電CPU處理后,CMDSTA寄存器包含一個非零狀態,這是在CMDR寄存器返回0時提供的。同時發生RFCMDACK中斷。這個中斷也被映射到RFACKIFG寄存器,當中斷已被處理時RFACKIFG寄存器被清零。

2、射頻核的中斷

射頻核可以產生的中斷主要有以下四種,這四種中斷均有無線電門鈴控制:

  • RF_CPE0 (interrupt number 9
  • RF_CPE1 (interrupt number 2)
  • RF_HW (interrupt number 10)
  • RF_CMD_ACK (interrupt number 11)

2.1 射頻命令和數據包引擎中斷

射頻命令和數據包引擎(RF Command and Packet Engine)可以產生許多低級中斷,這些低級中斷都可以使用RFCPEISL寄存器映射到RF_CPE0和RF_CPE1中。
此外,可以使用RFCPEIEN寄存器在系統級上切換中斷生成。

在觸發某個低級中斷的情況下,RFCPEIFG寄存器中的相應位被設置為1。當RFCPEIFG中的一個位和RFCPEIEN中的相應位都為1時,將引發在RFCPEISL中選擇的系統級中斷。這意味著中斷服務程序(ISR)必須清除RFCPEIFG中與已處理的低級中斷相對應的位,即向該位寫入0。

注意:這里對RFCPEIFG寄存器的清楚操作并非常規的“讀-改-寫”操作,因為在該操作期間,隨時可能有新的中斷產生,這意味著可能會有中斷丟失的風險,我們不允許這種情況發生。因此,實際中清除一個中斷標志位的方法應該是: HWREG(RFC_DBELL_BASE + RFC_DBELL_O_RFCPEIFG) = ~(1 << irq_no)?;

2.2 射頻核硬件中斷

系統級中斷RF_HW可以由射頻核心硬件產生的許多低級中斷產生 。

這些中斷的中斷源的開啟或關閉是由RFHWIEN控制的,開啟中斷源時中斷產生的必要條件。

在觸發低級中斷的事件的情況下,RFHWIFG寄存器中的相應位被設置為1。此時RFHWIEN和RFHWIFG的相應位都被置為1,相關的RF_HW中斷產生。
當該中斷被處理后,ISR需要清除掉RFHWIFG中的相應位。

但是TI并不建議在主CPU中服務這些中斷,但可用的無線電計時器通道中斷可以通過這種方式服務。

2.3 射頻核命令響應中斷

當RF核心命令被確認時(CMDSTA=1),系統級中斷RF_CMD_ACK產生。

當CMDSTA=1,即狀態變為可用時,RFACKIFG.ACKFLAG寄存器位被設置為1。當此位為1時,將引發RF_CMD_ACK中斷,這意味著ISR必須清除RFACKIFG.ACKFLAG位來清除RF_CMD_ACK中斷。

3 無線電定時器

無線電有自己專用的定時器——Radio timer(RAT)模塊。
RAT是一個32位的運行在4MHz上的自動運行定時器。
RAT擁有8個通道來進行比較和捕獲模式,其中前五個為無線電CPU保留,剩余的三個5、6、7是可以被系統CPU使用的。

RAT只能在RF核上電時工作,并且RAT必須通過CMD_START_RAT 或 CMD_SYNC_START_RAT命令開始工作。
當執行延時啟動命令或接收\發送模式的無線電操作命令時,必須要保證RAT已經被開啟。

當RAT運行時,定時器的當前值可以從RATCNT寄存器中讀取。

3.1 比較和捕獲模式

只有可用的通道5.6.7可以設置為比較或捕獲模式

比較模式

RAT的比較模式可以使用CMD_SET_RAT_CMP命令來設置

當RAT設置為比較模式時,計數器達到compareTime給定的值時,定時器產生一個中斷。中斷被映射到RFHWIFG。對于可用的RAT通道,正在使用的中斷標志位為RATCH5,RATCH6和RATCH7。

另外,當計數器達到compareTime給定的值時,也可以控制I/O引腳的動作,這個在后面再說。

當CMD_SET_RAT_CMP命令發送后,compareTime的值存在所選信道的RATCHnVAL寄存器中。

捕獲模式

捕獲模式可用于捕獲輸入引腳上的轉換,并在轉換發生時記錄RAT計數器的值。
捕獲模式可以使用CMD_SET_RAT_CPT命令來設置。
當轉換發生時,RAT的當前值被存儲在與所選通道對應的RATCHnVAL寄存器中,同時計時器產生中斷,與比較模式一樣,該中斷也會被映射到RFHWIFG中,中斷標志位為RATCH5、RATCH6或RATCH7。

注意:RATCHnVAL中的值要即使取出并處理,否則很容易被下一時刻的中斷覆蓋

被比較模式或單捕獲模式命令設置的通道可以武裝或解除武裝,當發送通道設置命令時,該通道自動武裝,當有比較或捕獲事件產生時,通道自動解除武裝。解除武裝的通道不會產生任何中斷或導致任何計時器值被捕獲,只有等到下一次配置命令產生時,通道才會被再次武裝。

但是無論使武裝或解除武裝,該通道的配置都不會被清除。
因此,通道可以使用CMD_ARM_RAT_CH或CMD_DISARM_RAT_CH(見23.3.3.2.14到)來武裝或解除。上述命令會使的之前對該通道的配置有效或失效。

3.2 RAT 輸出

RAT模塊有四種可控制的輸出模式——RAT_GPO0~RAT_GPO3。
這些輸出信號可以被某一個RAT通道控制,并通過SYSGPOCTL寄存器映射到I/O控制器(IOC)中。
RAT_GPO0被保存用于啟動傳輸模式,由無線電CPU在內部控制。
其他三個信號可以使用CMD_SET_RAT_OUTPUT命令進行配置。除了always-0和always-1配置外,不同的輸出模式決定了所選RAT通道發生中斷時輸出的轉換。
always-0和always-1配置立即生效,并可用于初始化。

3.3 與RTC時鐘的同步

當無線電掉電時,RAT模塊并不會計數,但是為了保證某些同步協議能有一致的時間基準,可以將RAT與實時時鐘(RTC)同步。
要在RF核上電后允許同步,CMD_SYNC_STOP_RAT命令必須在RF核下電之前發送。此命令(直到下一個RTC tick)停止RAT并返回一個參數rat0,該參數應該在重啟RAT時存儲并提供。
下一次RF核心上電和RAT啟動時,必須使用CMD_SYNC_START_RAT進行同步,其中必須提供從CMD_SYNC_STOP_RAT獲得的rat0參數。這個命令啟動RAT,等待RTC滴答,并根據RTC數據修改RAT。
根據應用程序的不同,可能沒有必要在每次關閉無線電時運行CMD_SYNC_STOP_RAT命令;之前的rat0值可以重用。然而,在某些情況下,如果無線電已經供電很長時間,而低頻和高頻晶體振蕩器相對于彼此有很大的誤差,這可能會引起問題。為了獲得準確的同步,重要的是,系統運行在高頻晶體振蕩器上,在CMD_SYNC_START_RAT命令運行之前開始,并在CMD_SYNC_STOP_RAT命令完成之后繼續運行。

三、射頻核的硬件抽象層HAL

射頻核心通過向系統CPU提供統一的HAL來隱藏無線電操作的復雜性。
注意下面的描述都不涉及射頻的底層通信原理,所以工作都是在通信協議之上的高級語言。

1 硬件支持

無線HAL由硬件支持,通過射頻核心區的無線電門鈴模塊和系統RAM中的命令描述符來實現。

2 固件支持

射頻核心支持一套高級的通信語言,它使得射頻核心與主CPU之間的通信都是建立在較高水平上的。

2.1 命令

無線電CPU允許用戶從系統CPU運行一組高級語言或命令。
向CMDR寄存器寫入命令后該命令就視為被系統CPU發布,無線電CPU會檢查該命令并決定執行過程。

2.1.1 命令的分類

其命令類型主要有以下三種:

  • Radio operation command:無線電操作命令會導致射頻核的硬件被訪問,這種命令可以使射頻核執行如:數據的發送、接收,設置射頻核的硬件寄存器或執行更復雜的、依賴某些協議的操作。
  • Immediate command :即時命令是更改、請求無線電狀態或操作TX\RX隊列的命令。即時命令可以監視命令執行的狀態,比如接收到的信號強度。即使命令可以在任何時刻被發布,但是一般情況下,我們僅在無線電操作命令執行過程中才會使用它來監控某種狀態。
  • Direct command:直接命令是不帶參數的即時命令,或只帶有一兩個字節的參數的,并且其帶有的參數一般是執行的命令所需要的參數。

2.1.2命令在寄存器中的存儲格式

根據命令的種類不同,被存入CMDR寄存器中的方式也不同
對于Radio operation 和 immediate 命令,CMDR包含一個指向命令結構的指針。該指針必須是一個32位字對齊的有效指針,因此兩個最低有效位(lsb)必須為0 0,其結構如下所示。

Direct命令通過將2個lsb設置為01并放置命令ID號到CMDR寄存器的16~31位,CMDR中的第8位到第15位或者第2位到第15位可以用來存放可選的字節參數。Direct命令格式如下圖所示。

2.1.3 命令的存儲位置

CMDR寄存器為Radio operation和immediate命令時,其所指向的數據結構可以在系統RAM或無線電RAM中。

若使用射頻核RAM作為命令的存儲位置,系統CPU必須確保正在使用的內存區域是可自由訪問的,特別是在使用無線電RAM時,其中一部分內存是預留給無線電CPU使用的。
可用的radio RAM信息可以通過CMD_GET_FW_INFO命令獲得。

決定使用那種內存區域存放命令一般從設備有效性和功耗兩方面考慮:

  • 無線電RAM 是Radio CPU最容易訪問的地方,因此功耗也最低,但當Radio CPU掉電后,Radio RAM就會失效,因此需要考慮每次CPU掉電和上電時,必須保存的數據的轉存到消耗的功耗。
  • 系統RAM在大多數低功耗模式下都具有數據保存能力。因此在系統側掉電時,無線電CPU重新上電時也可以申請對系統RAM的訪問。但無線電CPU訪問系統RAM的功耗要大于無線電RAM。
  • Flash總是具有數據保存能力,但是Flash只能保存系統CPU寫入的參數。無線電CPU訪問Flash時必須保證系統CPU處于正常工做狀態,且其功耗是要高于訪問系統RAM的。
  • 通過將所有數據結構放在無線電RAM中,并在無線電CPU運行時將系統側下電,可以獲得最低的峰值功耗。在某些情況下,通過將數據結構放在系統RAM中,平均功耗可能會更低,因為在無線電CPU掉電時需要的復制的內容更少,而且系統側仍然可以長時間斷電。

2.2 命令狀態

2.2.1 CMDSTA寄存器

當命令被發布后,CMDSTA寄存器會會在一定時間內被無線電CPU更新,并導致RFCMDACK中斷返回到系統CPU。

這個更新發生在即時命令和直接命令完成之后或無線電操作命令被調度之后,在狀態更新之前,其他命令無法發布。

CMDSTA寄存器是一個32位寄存器,其低8位給出了命令處理結果,其余的高24位可以用在具體的命令格式要求上,它最多可以傳回三字節參數,其格式如下圖所示:

其中Result的第7位表示是否有錯誤產生,0是沒有錯誤,1表明有錯誤。
Result的值表達的含義,可由下表查看:

值得一提的是:結果字節0x00表示等待,在命令發布時由無線電門鈴硬件自動產生,該狀態會將CMDSTA寄存器全部清0,這是CMDSTA在引發RF_CMD_ACK中斷前所具有的值。

2.2.2 命令結果中的狀態

每個無線電操作命令都包含一段狀態位,該狀態位的值可以在命令執行的過程在被無線電CPU修改,并可以隨時被系統CPU獲取。
這段值包含以下幾種狀態:

  • Idle:命令還沒開始執行
  • Pending:命令已經被解析,但還未開始觸發
  • Active:命令正在被執行
  • Suspended:該命令一直處于活動狀態,并且可能再次變為活動狀態。該命令僅被部分IEEE 802.15.4命令支持。
  • Finished:命令已經完成,系統CPU可自由修改命令結構或釋放內存
  • Skippped:命令已經被忽略,并且永遠不會執行。

status狀態位的數值對應的狀態含義可以查看手冊中的“Common Radio Operation Status Codes”表。

當系統CPU準備命令結構時,需要將status字段初始化為Idle。
如果有一組命令是被循環執行的,系統CPU在此過程中不能修改命令結構,直到無線電CPU變為空閑(即系統CPU收到一個LAST_COMMAND_DONE中斷)。

2.3 中斷

無線電CPU有32個軟件中斷源,它們可以在系統CPU中產生RFCPE0和RFCPE1中斷,這些中斷在RFCPEIFG寄存器的描述中列出。
中斷標志寄存器可以指示哪個軟件中斷被觸發,并且中斷被單獨啟用。
此外,當CMDSTA更新時,RFCMDACK中斷會自動觸發。

一些軟件定義的中斷在所有命令中有一個共同的含義;還有一些中斷是為每個使用特定中斷的協議定義的。在使用中斷時也要注意一些中斷只在一個協議中使用,而有些中斷能在幾個協議中使用。

2.4 數據傳播

通過射頻傳播數據的基本方式有兩種:直接傳播或通過隊列傳播。

傳播數據最直接的方法是將其作為命令參數的一部分追加(直接或通過指針)。確切的格式取決于正在運行的命令。對于傳輸端而言,通常有一個長度字段和一個傳輸數據緩沖區;對于接收端而言,通常有一個最大長度,接收長度(如果是可變長度),和一個接收緩沖區。

對于某些操作,無法預先知道接收或傳輸的包的數量(或者在少數包中實際傳輸的是哪個包)。對于這種操作,使用隊列的概念。一個操作可以使用一個或多個隊列,例如,一個RX和一個TX隊列用于組合的RX/TX操作,或者根據接收到的數據包中的信息使用多個隊列。
任何使用隊列的操作都使用一個公共系統來維護它們,這個在后面再說。

無線電操作命令會聲明本次命令使用的數據傳播類型。

2.5 命令調度器

射頻命令的調度也是由系統CPU負責。當系統CPU工作在低功耗模式下時,系統CPU會根據RTC在下一個操作命令開始前的短時間內喚醒。

無線電操作命令可以通過延遲啟動來調度。如果命令是延遲啟動的方式,在延遲期間無線電CPU將進入空閑模式,直到命令啟動。但注意在此延遲期間內無線電操作命令被認為正在運行狀態,除該命令首先被中止或停止,否則不能調度其他無線電操作命令。

系統CPU可以通過任意無線電操作命令中的下一個操作指針位來調度該指針指向的命令,通過這種方法,可以執行復雜的操作。當調用指向的下一個命令時發生了某些意外情況(例如錯誤或計時器過期),下一個命令不會啟動,相反該操作可能會結束或者跳過一些命令。如果一個新命令在另一個命令運行時被調度,系統CPU必須等待前一個命令或命令鏈完成。

當一個無線電操作命令完成時,無線電CPU向系統CPU拋出一個COMMAND_DONE中斷。如果像前面解釋的那樣鏈接了許多命令,則在每個命令之后引發COMMAND_DONE中斷,而在鏈中的最后一個命令之后引發LAST_COMMAND_DONE中斷。對于一個非鏈式命令,LAST_COMMAND_DONE中斷也會在該命令之后引發。當引發LAST_COMMAND_DONE時,COMMAND_DONE總是同時被引發。在引發COMMAND_DONE中斷之前,無線電CPU會將命令結構中的狀態位(status)也更新為命令完成狀態。
在啟動COMMAND_DONE中斷后,無線電CPU不訪問命令結構。

2.5.1 觸發

觸發可以規定命令被系統CPU發布的條件和時間,或用于特定無線電操作命令中的其他特定目的。
觸發器的數據結構如下圖所示:

下面將對觸發器的結構進行介紹。

trigger type

射頻操作命令支持多種觸發類型,通過設置不同的觸發類型,可以規定不同的命令發布的條件。
無線電操作命令支持的觸發類型如下所示:

除了TRIG_NOW和TRIG_NEVER之外,所有觸發器都使用32位的時間參數。
絕對定時使用32位的RAT值。相對計時使用RAT滴答的數量。外部觸發器使用source和edge標識符。
相對計時可以相對于提交命令鏈的時間、命令的開始、前一個或第一個命令的開始,或者相對于命令中觀察到的事件,這些事件將為每個命令定義。
需要注意的是:相對時間的用法比較特殊,相對計時可以相對于提交命令鏈的時間、命令的開始、前一個或第一個命令的開始,或者相對于命令中觀察到的事件,其具體要求如下:

  • 對于鏈中的第一個命令,如果開始觸發器是類型5到9中的任何一個,則立即開始。如果鏈中第一個命令引用的另一個觸發器是類型5到9中的任何一個,則觸發器時間相對于這些命令提交的時間。
  • 如果命令的啟動觸發器是TRIG_REL_START,則會產生錯誤,該類型不能用于啟動觸發。
  • 如果命令的起始觸發器為TRIG_NEVER,且bEnaCmd為0,則會產生錯誤,該命令不會被觸發。

對于外部觸發器,無線電CPU將RAT設置為使用選定的輸入事件作為一個捕獲觸發器;然后,無線電CPU使用這個捕獲中斷來觸發動作。

bEnaCmd

如果bEnaCmd為1,則動作也可能由命令觸發(CMD_TRIGGER命令)。

trigger No

triggerNo參數標識該命令的觸發號。

pastTring

如果觸發器在計算時發生在過去,則行為取決于pastTrig位。如果該位為0,則觸發器不發生,或者對于啟動觸發器,將產生一個錯誤。如果pastTrig位為1,則觸發器會盡快發生。
注意如果過去的觸發被觸發,則相對于命令開始的計時相對于程序開始運行的時間,而不是實際的開始時間。

對于外部觸發器,如果事件發生在設置發生之前,則不捕獲該事件,并忽略pastTrig位。

2.5.2 條件執行

當前命令是否被執行的執行可能取決于前一個命令的執行結果。
對于每個命令,可能有三種結果:

  • TURE
  • FALSE
  • ABORT
    每個命令都定義了判斷。如果沒有定義,則結果為TRUE,除非命令以錯誤結束,在這種情況下,結果為ABORT。

每一個命令結構都包含一字節條件來運行下一條命令。該條件字節的結構如下圖所示:

其中RULE規定了下一條命令的執行條件,主要有以下幾種:

如果執行被停止,無線電CPU將回到空閑狀態,并且在通過CMDR寄存器輸入新命令之前不會運行進一步的命令。LAST_COMMAND_DONE中斷被拋出。

如果該規則為COND_SKIP_ON_FALSE或COND_SKIP_ON_TRUE,則在nSkip字段中顯示需要跳過的命令數量。如果跳過次數為0,則重新運行相同的命令。如果跳數為1,則在鏈中執行下一個命令。如果跳過次數是2,則運行下一個命令之后的命令,以此類推。

如果命令以中止結果結束,則無論條件如何,執行都將結束。會引發LAST_COMMAND_DONE中斷。中止結果的一個條件示例是發出一個CMD_ABORT命令。

2.5.3 無線電CPU在解析命令前處理

對于所有的無線電操作命令,在解析命令的其余部分之前,先檢查啟動觸發器和條件代碼。如果啟動觸發器具有非法的觸發類型(包括啟動觸發器不允許的TRIG_REL_START,以及與沒有命令觸發器組合的TRIG_NEVER),無線電CPU將status字段設置為ERROR_START_TRIG。如果condition字段有一個非法的值,無線電CPU會將status字段設置為ERROR_CONDITION。如果start觸發器發生在過去,并且startTrigger。pastTrig為0,無線電CPU設置status字段為ERROR_PAST_START。

2.6 命令的數據結構

經過上面的介紹,我們可以得知在一個無線電操作命令中,會存在命令狀態位、下一個命令指針位、啟動事件位、啟動觸發類型位和執行條件位。
因此我們可以得到無線電操作命令的數據結構格式:

可以看到,前面講到的有關命令調度的信息都存在于該數據結構中
需要說明的是,該數據結構中,字節索引是指向該結構的指針的偏移量。多字節字段是小端序的,需要根據字段大小進行16位半字或32位字對齊。對于位編號,0是LSB。
需要注意的是命令的數據結構是由系統CPU產生的,因此R/W類型也都是針對系統CPU而言的
因此R/W列的用法可表示如下:

  • R:系統CPU可以讀回返回結果;無線電CPU不讀取該字段。
  • W:系統CPU寫入一個值,無線電CPU只讀取它,不修改它。
  • R/W:系統CPU寫入一個初始值,無線電CPU可以修改它。

我們還知道,這些不同的數據位也使用了子數據結構來表示,對于該數據結構的專用子數據結構,來自父結構的字段不會重復,但是字節索引列反映了它們的存在。

所有命令的唯一必選字段是命令ID號,這是一個16位的數字,作為命令結構的前兩個字節發送。

一些即時命令有附加字段,這些字段是為每個命令定義的。此外無線電操作命令也有附加的必填字段。

所有標記為“Reserved”的命令字段都應該被寫入0。

2.7 數據條目的數據結構

數據條目(Data Entry)是必須存入一個射頻隊列中。
隊列是作為無線電操作命令的命令結構的一部分設置的。
關于以命令的形式操作隊列將在后面專門介紹,目前我們先來認識這個數據條目的數據結構。

2.7.1 數據條目隊列

數據條目隊列的結構如下圖所示:

其中包含一個32位的隊頭指針,和一個32位的對尾指針。該隊列的頭指針一直指向當前無線電CPU正在處理的數據條目。

任何使用隊列的命令都包含一個指向數據條目隊列的數據結構的指針,該指針在系統CPU分配并初始化這個隊列結構是被放入。

2.7.2 數據條目

數據條目隊列中包含的數據條目結構如下圖所示。

這些條目被組織在一個鏈表中。隊列的第一個數據條目由隊列結構的pCurrEntry字段指向。在數據條目中的pNextEntry字段存著指向下一個數據條目的指針,隊列結構的pLastEntry字段指向隊列中的最后一個條目,通過這種方式構成一個數據鏈表。

每個數據條目在某一時刻下一定處于以下幾個狀態中:

  • Pending:表示該條目未被無線電CPU使用。這是在提交條目之前系統CPU寫入的狀態。
  • Active:該條目是隊列中當前打開的供無線電CPU寫入(RX)或讀取(TX)的條目。
  • Busy:正在寫或讀一個未完成的包。當條目處于這種狀態時,某些操作是不允許的。
  • Finished:無線電CPU已完成將數據寫入此條目,并可供系統CPU重用或釋放內存(如果動態分配)。

對于數據條目,系統CPU在系統RAM或無線電RAM的可用部分中設置所需的數據結構。如果數據結構是動態分配的,系統CPU使用后會釋放內存。

在用于接收數據的條目中,無線電CPU可以使用LenSz來表示條目元素的長度。如果config.LenSz為00,表示此指標未使用。除非當接收到的數據包的長度可以通過其他方法確定,否則LenSz位不能設置為00,必須被用來記錄接收數據的長度。

length表示的是存儲數據條目元素的緩沖區的大小,表示這個數據條目中可接收的所有條目元素的大小,如果是指針條目類型,則length表示所指向的數據緩沖區的大小。

2.7.3 指針條目

使用指針條目(Pointer Entry)是表明數據不包含在條目結構中,但在條目原本存放數據的位置包含了一個指向其他緩沖區的指針,該指針指向存儲數據的內存地址,該地址由系統CPU分配并寫入,由無線電CPU來讀取。
通過設置config.type = 2來配置數據條目成為一個指針條目。指針替換數據字段,其結構如下圖所示:

數據從pData提供的緩沖區中讀取或存儲,這個緩沖區的大小由length決定,此時config.lenSz可以設置為00。

2.7.4 提前讀取部分接收條目

專有模式支持一中RX條目,其中數據可以在通過射頻接收整個數據包之前被讀取,它可以用于以下目的:

  • 在接收到整個數據包之前必須讀取數據
  • 當包的長度在包的開始是未知的
  • 當包的長度太長,以致于整個有效負載不能同時保存在內存中

為了支持這一點,對普通數據條目的結構做了一個特殊變體。作為多元素條目,同一條目中可以包含多個條目元素。每個條目元素對應于通過射頻接收的一個數據包,或者僅代表數據包的一部分。元素還可以包含其他字段。該類型通過設置config.type = 3。在多元素條目中,數據字段的組成如圖所示:

該條目更新如下:

  • 當新的字節被寫入緩沖區時,nextIndex字段被更新。
  • 接收報文時,射頻CPU設置pktStatus.bEntryOpen =1。

當一個條目元素結束時,要么是因為包結束了,要么是因為元素到達了條目pktStatus的末尾。pktStatus.bEntryOpen被射頻CPU設置為0。pktStatus.numElements遞增。如果報文繼續進入下一個條目,無線電CPU設置pktStatus.bLastCont =1,同是無線電CPU會將下一個條目的pktStatus.bFirstCont位也設置為1。如果沒有下一項可用,狀態設置為Unfinished,否則設置為Finished。

由于在條目元素開頭指定的長度字段(取決于config.lenSz)指定的是條目中數據的長度,而不是整個數據包的長度。如果在打開表項時不知道長度(一個表項無法存滿整個數據包),則length字段被寫入數據的剩余長度,并在數據結束前由無線電CPU更新。

2.8 外部信號

無線電CPU控制4個CPEGPOx信號,可用于外部信號,例如控制外部PAs和LNAs或調試。

  • 內部LNA使能時,CPEGPO0為高電平,
  • 內部PA使能時,CPEGPO1為高電平,
  • 合成器校準時,CPEGPO2為高電平。

RAT的兩個輸出信號具有自動配置,可用于觀察。當數據包開始傳輸時,信號RATGPO0為高,當傳輸結束時為低。觀察RATGPO0可以得到數據包傳輸的精確時間,因為內部使用的是相同的信號。RATGPO0與CPEGPO1非常相似,但它比CPEGPO1提前了一些微秒,而且與調制解調器發出的第一個傳輸符號相比,計時更準確。

默認情況下,射頻CPU在啟動時將CPEGPO0映射為RFC_GPO0信號,CPEGPO1映射為RFC_GPO1信號,CPEGPO2映射為RFC_GPO2信號,RATGPO0映射為RFC_GPO3信號。這個映射可以通過寫入rfc_bell:SYSGPOCTL寄存器來修改。

RFC_GPOx信號可以通過系統I/O控制器映射到輸出管腳。

3 命令的定義

下面將介紹一組獨立于使用的射頻協議的命令。這些命令與無線電的低級操作有關。

3.1 獨立于協議的無線電操作命令

首先對于接下里要介紹的無線電操作命令,造成操作結束的原因被列在下面表中,或者這些原因被添加到命令的額外參數中。

這些操作結束的原因將被記錄在命令結構體的status字段中,這個命令結束的結果是TRUE、Flash或者ABORT,將被status中的rule字段表示出來(具體見2.5.2),這個結果將表明下一個命令是會繼續執行,還是會返回空閑狀態。

3.2 各種無線電命令的介紹

有關各種無線電命令的介紹,可以直接查閱CC1310技術參考手冊的23.3.4和23.3.4兩章節,在此再一一介紹

4 數據隊列的用法

該章節將介紹無線電CPU是如何使用數據隊列的

4.1 僅供內部無線電CPU操作的數據隊列操作

在CC1310的技術參考手冊中的23.3.4章節列出了用于數據隊列操作的各種命令,那些命令都是由無線電CPU產生的針對于內部無線電數據隊列的立即命令。但是除了那些用于維護數據隊列的命令外,無線電CPU還可以實現一些內部操作。

4.1.1 PROC_ALLOCATE_TX:讀取被分配的TX條目

該操作用于讀取TX隊列的當前條目
該操作需要指定當前操作的隊列指針(提供pQueue),在執行成功后返回被讀取的數據條目的指針(pEntry)。

如果指定的隊列為空,或者隊列的第一個條目已經忙,該過程將返回錯誤。否則,執行以下操作:

Set pQueue->pCurrEntry->status = Busy Set pEntry = pQueue->pCurrEntry

首先將操作的隊列的當前條目的狀態設置為BUSY,表明TX隊列的當前條目正在被讀取,之后讀取當前條目的信息。

4.1.2 PROC_FREE_DATA_ENTRY:清除已分配數據條目

該操作會激活隊列的當前條目,來開始寫入或讀取當前條目的信息
該操作需要指定當前操作的隊列指針(提供pQueue),在執行成功后返回被清除的數據條目的指針(pEntry)。

如果指定的隊列為空,該過程將返回錯誤。否則,執行以下操作

Set pQueue->pCurrEntry->status = Active

通過將當前條目的狀態設為Active,表明該隊列的當前條目可以讀取或寫入新的數據。

4.1.3 PROC_FINISH_DATA_ENTRY:從隊列中完成第一個數據條目的使用

該操作實質是將處于Pending狀態的下一個條目的信息更新到到當前條目中
該操作需要指定當前操作的隊列(提供pQueue),在執行成功后返回下一個要被分配的數據條目的指針(pEntry)。

如果指定的隊列為空,該過程將返回錯誤。否則,執行以下操作:

Set pTemp = pQueue->pCurrEntry Set pQueue->pCurrEntry = pTemp->pNextEntry Set pTemp->status = Finished Set pEntry = pQueue->pCurrEntry

將當前條目中存儲的下一個條目信息賦值給當前條目,并返回即將被操作的條目的信息

4.1.4 PROC_ALLOCATE_RX:為存儲數據分配RX緩沖區

該操作需要指定當前操作的隊列指針(pQueue)和需要存儲的條目元素(數據包)的大小(size),在執行成功后返回存儲數據的數據條目的指針pEntry和指向已完成的數據條目的指針(pFinishEntery),若未執行成功,則只返回存儲數據的數據條目的指針(pEntry)。

如果隊列的第一個條目已經繁忙,該過程將返回錯誤。如果沒有空間容納指定大小的條目元素,包括隊列為空的情況,則返回" no space "錯誤。否則,執行以下操作:

If pQueue->pCurrEntry->type != 1 then Set pTemp = pQueue->pCurrEntry Set pQueue->pCurrEntry = pTemp->pNextEntry Set pTemp->status = Finished else Increase pQueue->pCurrEntry->nextIndex by size Increment pQueue->pCurrEntry->numElements by 1 If pQueue->pCurrEntry->nextIndex + 2 == pQueue->pCurrEntry- >length then Set pTemp = pQueue->pCurrEntry Set pQueue->pCurrEntry = pTemp->pNextEntry Set pTemp->status = Finished Set pFinishedEntry == pTemp else Set pQueue->pCurrEntry->status = Active Set pFinishedEntry == NULL end if end

4.1.5 PROC_FINISH_RX:提交接收到的數據到RX數據條目

該操作需要指定當前操作的隊列指針(pQueue)和已存儲的條目元素的大小(size),在執行成功后返回存儲數據的數據條目的指針pEntry和指向已完成的數據條目的指針(pFinishEntery),若未執行成功,則只返回存儲數據的數據條目的指針(pEntry)。

如果隊列為空或沒有空間容納指定大小的條目元素,該過程將返回錯誤。否則,執行以下操作:

If pQueue->pCurrEntry->type != 1 then Set pTemp = pQueue->pCurrEntry Set pQueue->pCurrEntry = pTemp->pNextEntry Set pTemp->status = Finished else Increase pQueue->pCurrEntry->nextIndex by size Increment pQueue->pCurrEntry->numElements by 1 If pQueue->pCurrEntry->nextIndex + 2 == pQueue->pCurrEntry- >length then Set pTemp = pQueue->pCurrEntry Set pQueue->pCurrEntry = pTemp->pNextEntry Set pTemp->status = Finished Set pFinishedEntry == pTemp else Set pQueue->pCurrEntry->status = Active Set pFinishedEntry == NULL end if end

注意:這個操作是在執行PROC_ALLOCATE_RX操作并寫入緩沖區中的正確位置完成后執行的,其輸入參數sIze必須與PROC_ALLOCATE_RX相同。

4.2 無線電CPU使用隊列操作樣例

4.2.1 接收隊列

當無線電CPU收到一個數據包時,它通過調用PROC_ALLOCATE_RX準備一個緩沖區來讀取。如果這是成功的,分配的緩沖區將用于存儲為每個協議定義的傳入數據包。如果發生無空間錯誤,則接收到的數據無法存儲,并且為每個協議定義了處理。

在接收到數據包之后,根據為每個協議定義的規則,它可以被保留或丟棄。為了保存數據包,無線電CPU調用PROC_FINISH_RX。這使得接收到的數據對系統CPU可用。為了丟棄報文,無線電CPU調用PROC_FREE_DATA_ENTRY,這意味著下一個報文可能會覆蓋上一個報文接收到的數據。

4.2.2 發送隊列

當無線電CPU準備從TX隊列傳輸一個數據包時,它調用PROC_ALLOCATE_TX來獲得一個指向要傳輸的數據的指針。報文傳輸時,無線電CPU調用PROC_FINISH_DATA_ENTRY或PROC_FREE_DATA_ENTRY。

如果調用PROC_FINISH_DATA_ENTRY,則通知系統CPU,當前條目的數據已經完成發送,當前條目可以被重新使用。如果無法選擇重傳數據包,則必須使用此調用過程。
如果調用PROC_FREE_DATA_ENTRY,傳輸的條目將保持在隊列中的第一個,以便它可以被傳輸,這在期待收到一個確認信息時使用。

如果在傳輸的數據包上收到一個確認,然后無線電CPU調用PROC_FREE_DATA_ENTRY,無線電CPU調用PROC_ALLOCATE_TX,然后PROC_FINISH_DATA_ENTRY(這相當于CMD_REMOVE_DATA_ENTRY,參見技術手冊的23.3.3.2節)。這個調用進程導致隊列中的下一個條目被傳輸。如果沒有收到確認,則重傳最后一個傳輸的數據包。

總結

以上是生活随笔為你收集整理的CC1310手册的射频核心介绍的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。