CC1310手册的射频核心介绍
最近在使用CC1310的射頻核心傳進行無線數(shù)據(jù)收發(fā)任務(wù),由于是第一次接觸到射頻方面的知識,閱讀CC1310手冊也費了不少勁,于是想著既然看了不如做些記錄,于是有了本篇翻譯性質(zhì)的文章。
閱讀到一半突然一些感言,CC1310手冊中的內(nèi)容大多是建立在某些底層通信協(xié)議的基礎(chǔ)之上的,并不會涵蓋很多通信協(xié)議方面的知識,如果向了解某些協(xié)議,比如藍牙,zigbee原理方面的知識,閱讀本片文章并不能對該方面有半點提升,手冊中講述的內(nèi)容多半是建立在通信協(xié)議之上的偏向于應(yīng)用的知識,如果是向了解CC1310是如何實現(xiàn)系統(tǒng)CPU和射頻CPU通信,射頻CPU又是如何處理發(fā)送前的數(shù)據(jù)的,則可以CC1310的手冊,本篇文章難免帶有個人主觀理解,若想請配合CC1310手冊一起閱讀,或許會加快手冊內(nèi)容的理解,另外如有錯誤,懇請大家即時指認,希望可以和大家一起學習一起進步,感謝~
目錄
- 一、概述
- 1、射頻核的基本特性
- 二、無線電門鈴(Radio Doorbell)
- 1、命令和狀態(tài)寄存器
- 2、射頻核的中斷
- 2.1 射頻命令和數(shù)據(jù)包引擎中斷
- 2.2 射頻核硬件中斷
- 2.3 射頻核命令響應(yīng)中斷
- 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 命令狀態(tài)
- 2.2.1 CMDSTA寄存器
- 2.2.2 命令結(jié)果中的狀態(tài)
- 2.3 中斷
- 2.4 數(shù)據(jù)傳播
- 2.5 命令調(diào)度器
- 2.5.1 觸發(fā)
- trigger type
- bEnaCmd
- trigger No
- pastTring
- 2.5.2 條件執(zhí)行
- 2.5.3 無線電CPU在解析命令前處理
- 2.6 命令的數(shù)據(jù)結(jié)構(gòu)
- 2.7 數(shù)據(jù)條目的數(shù)據(jù)結(jié)構(gòu)
- 2.7.1 數(shù)據(jù)條目隊列
- 2.7.2 數(shù)據(jù)條目
- 2.7.3 指針條目
- 2.7.4 提前讀取部分接收條目
- 2.8 外部信號
- 3 命令的定義
- 3.1 獨立于協(xié)議的無線電操作命令
- 3.2 各種無線電命令的介紹
- 4 數(shù)據(jù)隊列的用法
- 4.1 僅供內(nèi)部無線電CPU操作的數(shù)據(jù)隊列操作
- 4.1.1 PROC_ALLOCATE_TX:讀取被分配的TX條目
- 4.1.2 PROC_FREE_DATA_ENTRY:清除已分配數(shù)據(jù)條目
- 4.1.3 PROC_FINISH_DATA_ENTRY:從隊列中完成第一個數(shù)據(jù)條目的使用
- 4.1.4 PROC_ALLOCATE_RX:為存儲數(shù)據(jù)分配RX緩沖區(qū)
- 4.1.5 PROC_FINISH_RX:提交接收到的數(shù)據(jù)到RX數(shù)據(jù)條目
- 4.2 無線電CPU使用隊列操作樣例
- 4.2.1 接收隊列
- 4.2.2 發(fā)送隊列
射頻核心包含一個ARM Cortex-M0處理器(連接模擬射頻和內(nèi)部電路),該核心處理來自系統(tǒng)端的數(shù)據(jù),并在給定的包結(jié)構(gòu)中組裝信息位。
射頻核心為系統(tǒng)CPU (ARM?Cortex?-M3)提供了一個高級的、基于命令的應(yīng)用程序接口(API)。射頻核心可以自主地按照無線電協(xié)議(802.15.4 RF4CE和ZigBee?、藍牙?低能耗等)的嚴格時序要求完成任務(wù),從而減輕系統(tǒng)CPU負擔,為用戶應(yīng)用程序留下更多資源。
射頻核心有一個專用的4 kb SRAM塊,幾乎完全從單獨的ROM運行。
此處對在下文中提到的一些中文釋義做出說明:
| 無線電 | Radio | 修飾一些器件,表明該器件是存在于射頻核內(nèi)部的 |
| 武裝 | ARM | 使被配置的RAT通道可以產(chǎn)生中斷事件 |
| 條目 | Entry | 在數(shù)據(jù)隊列中用于存儲數(shù)據(jù)包的基本單位 |
| 條目元素 | Entry element | 一個條目元素對于著一個射頻數(shù)據(jù)包 一個條目中可以有多個條目元素 |
一、概述
1、射頻核的基本特性
CPU與RF Core之間的事務(wù)處理有一個通用的架構(gòu),這個架構(gòu)使得RF核心必須有以下幾個特性:
射頻核心可以直接訪問系統(tǒng)的RAM,可以從中讀取命令或數(shù)據(jù),也可以將接收到的數(shù)據(jù)寫入到系統(tǒng)RAM中。出于協(xié)議機密性和認證支持的目的,射頻核心也可以訪問安全子系統(tǒng)。
一般情況下,射頻核心識別來自系統(tǒng)CPU的復(fù)雜命令(CCA傳輸、RX自動確認等),并將其劃分為若干子命令,而無需系統(tǒng)CPU的進一步干預(yù)。
射頻核的概述和外部依賴如下圖所示:??
其中被框起來的是射頻核內(nèi)部的基本結(jié)構(gòu),可以看到CPU和RF CPU都處于同一條總線上,并且RF CPU可以通過總線與外部的RAM, Security subsystem通信,這里只需要有個大體的認識就好
二、無線電門鈴(Radio Doorbell)
無線電門鈴模塊(RFC_DBELL)是系統(tǒng)CPU和無線電CPU之間的主要通信手段,也被稱為Command and Packet engine(CPE)
無線電門鈴包含一組專用的寄存器和一組到CPU和RF CPU中的中斷。
此外,射頻配置參數(shù)和傳輸數(shù)據(jù)通過系統(tǒng)RAM或無線電RAM傳輸。需要注意的是,如果參數(shù)或數(shù)據(jù)是存在系統(tǒng)RAM中的,系統(tǒng)CPU必須在RF工作時處于正常工作狀態(tài),若這些參數(shù)或數(shù)據(jù)都是存在無線電RAM中的,在RF核工作時,系統(tǒng)CPU可以進入掉電模式。
在RF核運作期間,無線電CPU會更新存在RAM中的相關(guān)參數(shù)和傳輸數(shù)據(jù),并引發(fā)中斷。這些中斷是可以被系統(tǒng)CPU屏蔽(Mask out)的,因此這保證了在無線電操作全部完成前,系統(tǒng)CPU可以一直處于空閑或掉電狀態(tài)。
因為系統(tǒng)CPU和無線電CPU共享一個公共RAM區(qū)域,所以要確保不會發(fā)生爭用或競用情況。這是通過在無線電硬件抽象層(HAL)中建立的規(guī)則在軟件中實現(xiàn)的。
下圖是無線電硬件抽象層的硬件支持圖:
從硬件支持圖中可以看到很多有用的信息,下面將對這些內(nèi)容進行詳細介紹
1、命令和狀態(tài)寄存器
- CMDR:射頻命令通過CMDR寄存器發(fā)送到無線電
- CMDSTA:只讀寄存器,CMDSTA會提供從無線電執(zhí)行命令后返回的狀態(tài)
CMDR寄存器只能在讀取其為0時才能被寫入,否則此次寫操作被忽略。當CMDR寄存器為0并寫入一個非零值時,無線電CPU將被通知通知,CMDSTA寄存器變?yōu)?。在此之后,從CMDR寄存器寫入的值是可讀的,直到無線電CPU處理完該命令,會再次將CMDR清零,允許下一條命令寫入。
當該命令被無線電CPU處理后,CMDSTA寄存器包含一個非零狀態(tài),這是在CMDR寄存器返回0時提供的。同時發(fā)生RFCMDACK中斷。這個中斷也被映射到RFACKIFG寄存器,當中斷已被處理時RFACKIFG寄存器被清零。
2、射頻核的中斷
射頻核可以產(chǎn)生的中斷主要有以下四種,這四種中斷均有無線電門鈴控制:
- RF_CPE0 (interrupt number 9
- RF_CPE1 (interrupt number 2)
- RF_HW (interrupt number 10)
- RF_CMD_ACK (interrupt number 11)
2.1 射頻命令和數(shù)據(jù)包引擎中斷
射頻命令和數(shù)據(jù)包引擎(RF Command and Packet Engine)可以產(chǎn)生許多低級中斷,這些低級中斷都可以使用RFCPEISL寄存器映射到RF_CPE0和RF_CPE1中。
此外,可以使用RFCPEIEN寄存器在系統(tǒng)級上切換中斷生成。
在觸發(fā)某個低級中斷的情況下,RFCPEIFG寄存器中的相應(yīng)位被設(shè)置為1。當RFCPEIFG中的一個位和RFCPEIEN中的相應(yīng)位都為1時,將引發(fā)在RFCPEISL中選擇的系統(tǒng)級中斷。這意味著中斷服務(wù)程序(ISR)必須清除RFCPEIFG中與已處理的低級中斷相對應(yīng)的位,即向該位寫入0。
注意:這里對RFCPEIFG寄存器的清楚操作并非常規(guī)的“讀-改-寫”操作,因為在該操作期間,隨時可能有新的中斷產(chǎn)生,這意味著可能會有中斷丟失的風險,我們不允許這種情況發(fā)生。因此,實際中清除一個中斷標志位的方法應(yīng)該是: HWREG(RFC_DBELL_BASE + RFC_DBELL_O_RFCPEIFG) = ~(1 << irq_no)?;
2.2 射頻核硬件中斷
系統(tǒng)級中斷RF_HW可以由射頻核心硬件產(chǎn)生的許多低級中斷產(chǎn)生 。
這些中斷的中斷源的開啟或關(guān)閉是由RFHWIEN控制的,開啟中斷源時中斷產(chǎn)生的必要條件。
在觸發(fā)低級中斷的事件的情況下,RFHWIFG寄存器中的相應(yīng)位被設(shè)置為1。此時RFHWIEN和RFHWIFG的相應(yīng)位都被置為1,相關(guān)的RF_HW中斷產(chǎn)生。
當該中斷被處理后,ISR需要清除掉RFHWIFG中的相應(yīng)位。
但是TI并不建議在主CPU中服務(wù)這些中斷,但可用的無線電計時器通道中斷可以通過這種方式服務(wù)。
2.3 射頻核命令響應(yīng)中斷
當RF核心命令被確認時(CMDSTA=1),系統(tǒng)級中斷RF_CMD_ACK產(chǎn)生。
當CMDSTA=1,即狀態(tài)變?yōu)榭捎脮r,RFACKIFG.ACKFLAG寄存器位被設(shè)置為1。當此位為1時,將引發(fā)RF_CMD_ACK中斷,這意味著ISR必須清除RFACKIFG.ACKFLAG位來清除RF_CMD_ACK中斷。
3 無線電定時器
無線電有自己專用的定時器——Radio timer(RAT)模塊。
RAT是一個32位的運行在4MHz上的自動運行定時器。
RAT擁有8個通道來進行比較和捕獲模式,其中前五個為無線電CPU保留,剩余的三個5、6、7是可以被系統(tǒng)CPU使用的。
RAT只能在RF核上電時工作,并且RAT必須通過CMD_START_RAT 或 CMD_SYNC_START_RAT命令開始工作。
當執(zhí)行延時啟動命令或接收\發(fā)送模式的無線電操作命令時,必須要保證RAT已經(jīng)被開啟。
當RAT運行時,定時器的當前值可以從RATCNT寄存器中讀取。
3.1 比較和捕獲模式
只有可用的通道5.6.7可以設(shè)置為比較或捕獲模式
比較模式
RAT的比較模式可以使用CMD_SET_RAT_CMP命令來設(shè)置
當RAT設(shè)置為比較模式時,計數(shù)器達到compareTime給定的值時,定時器產(chǎn)生一個中斷。中斷被映射到RFHWIFG。對于可用的RAT通道,正在使用的中斷標志位為RATCH5,RATCH6和RATCH7。
另外,當計數(shù)器達到compareTime給定的值時,也可以控制I/O引腳的動作,這個在后面再說。
當CMD_SET_RAT_CMP命令發(fā)送后,compareTime的值存在所選信道的RATCHnVAL寄存器中。
捕獲模式
捕獲模式可用于捕獲輸入引腳上的轉(zhuǎn)換,并在轉(zhuǎn)換發(fā)生時記錄RAT計數(shù)器的值。
捕獲模式可以使用CMD_SET_RAT_CPT命令來設(shè)置。
當轉(zhuǎn)換發(fā)生時,RAT的當前值被存儲在與所選通道對應(yīng)的RATCHnVAL寄存器中,同時計時器產(chǎn)生中斷,與比較模式一樣,該中斷也會被映射到RFHWIFG中,中斷標志位為RATCH5、RATCH6或RATCH7。
注意:RATCHnVAL中的值要即使取出并處理,否則很容易被下一時刻的中斷覆蓋
被比較模式或單捕獲模式命令設(shè)置的通道可以武裝或解除武裝,當發(fā)送通道設(shè)置命令時,該通道自動武裝,當有比較或捕獲事件產(chǎn)生時,通道自動解除武裝。解除武裝的通道不會產(chǎn)生任何中斷或?qū)е氯魏斡嫊r器值被捕獲,只有等到下一次配置命令產(chǎn)生時,通道才會被再次武裝。
但是無論使武裝或解除武裝,該通道的配置都不會被清除。
因此,通道可以使用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在內(nèi)部控制。
其他三個信號可以使用CMD_SET_RAT_OUTPUT命令進行配置。除了always-0和always-1配置外,不同的輸出模式?jīng)Q定了所選RAT通道發(fā)生中斷時輸出的轉(zhuǎn)換。
always-0和always-1配置立即生效,并可用于初始化。
3.3 與RTC時鐘的同步
當無線電掉電時,RAT模塊并不會計數(shù),但是為了保證某些同步協(xié)議能有一致的時間基準,可以將RAT與實時時鐘(RTC)同步。
要在RF核上電后允許同步,CMD_SYNC_STOP_RAT命令必須在RF核下電之前發(fā)送。此命令(直到下一個RTC tick)停止RAT并返回一個參數(shù)rat0,該參數(shù)應(yīng)該在重啟RAT時存儲并提供。
下一次RF核心上電和RAT啟動時,必須使用CMD_SYNC_START_RAT進行同步,其中必須提供從CMD_SYNC_STOP_RAT獲得的rat0參數(shù)。這個命令啟動RAT,等待RTC滴答,并根據(jù)RTC數(shù)據(jù)修改RAT。
根據(jù)應(yīng)用程序的不同,可能沒有必要在每次關(guān)閉無線電時運行CMD_SYNC_STOP_RAT命令;之前的rat0值可以重用。然而,在某些情況下,如果無線電已經(jīng)供電很長時間,而低頻和高頻晶體振蕩器相對于彼此有很大的誤差,這可能會引起問題。為了獲得準確的同步,重要的是,系統(tǒng)運行在高頻晶體振蕩器上,在CMD_SYNC_START_RAT命令運行之前開始,并在CMD_SYNC_STOP_RAT命令完成之后繼續(xù)運行。
三、射頻核的硬件抽象層HAL
射頻核心通過向系統(tǒng)CPU提供統(tǒng)一的HAL來隱藏無線電操作的復(fù)雜性。
注意下面的描述都不涉及射頻的底層通信原理,所以工作都是在通信協(xié)議之上的高級語言。
1 硬件支持
無線HAL由硬件支持,通過射頻核心區(qū)的無線電門鈴模塊和系統(tǒng)RAM中的命令描述符來實現(xiàn)。
2 固件支持
射頻核心支持一套高級的通信語言,它使得射頻核心與主CPU之間的通信都是建立在較高水平上的。
2.1 命令
無線電CPU允許用戶從系統(tǒng)CPU運行一組高級語言或命令。
向CMDR寄存器寫入命令后該命令就視為被系統(tǒng)CPU發(fā)布,無線電CPU會檢查該命令并決定執(zhí)行過程。
2.1.1 命令的分類
其命令類型主要有以下三種:
- Radio operation command:無線電操作命令會導(dǎo)致射頻核的硬件被訪問,這種命令可以使射頻核執(zhí)行如:數(shù)據(jù)的發(fā)送、接收,設(shè)置射頻核的硬件寄存器或執(zhí)行更復(fù)雜的、依賴某些協(xié)議的操作。
- Immediate command :即時命令是更改、請求無線電狀態(tài)或操作TX\RX隊列的命令。即時命令可以監(jiān)視命令執(zhí)行的狀態(tài),比如接收到的信號強度。即使命令可以在任何時刻被發(fā)布,但是一般情況下,我們僅在無線電操作命令執(zhí)行過程中才會使用它來監(jiān)控某種狀態(tài)。
- Direct command:直接命令是不帶參數(shù)的即時命令,或只帶有一兩個字節(jié)的參數(shù)的,并且其帶有的參數(shù)一般是執(zhí)行的命令所需要的參數(shù)。
2.1.2命令在寄存器中的存儲格式
根據(jù)命令的種類不同,被存入CMDR寄存器中的方式也不同
對于Radio operation 和 immediate 命令,CMDR包含一個指向命令結(jié)構(gòu)的指針。該指針必須是一個32位字對齊的有效指針,因此兩個最低有效位(lsb)必須為0 0,其結(jié)構(gòu)如下所示。
Direct命令通過將2個lsb設(shè)置為01并放置命令I(lǐng)D號到CMDR寄存器的16~31位,CMDR中的第8位到第15位或者第2位到第15位可以用來存放可選的字節(jié)參數(shù)。Direct命令格式如下圖所示。
2.1.3 命令的存儲位置
CMDR寄存器為Radio operation和immediate命令時,其所指向的數(shù)據(jù)結(jié)構(gòu)可以在系統(tǒng)RAM或無線電RAM中。
若使用射頻核RAM作為命令的存儲位置,系統(tǒng)CPU必須確保正在使用的內(nèi)存區(qū)域是可自由訪問的,特別是在使用無線電RAM時,其中一部分內(nèi)存是預(yù)留給無線電CPU使用的。
可用的radio RAM信息可以通過CMD_GET_FW_INFO命令獲得。
決定使用那種內(nèi)存區(qū)域存放命令一般從設(shè)備有效性和功耗兩方面考慮:
- 無線電RAM 是Radio CPU最容易訪問的地方,因此功耗也最低,但當Radio CPU掉電后,Radio RAM就會失效,因此需要考慮每次CPU掉電和上電時,必須保存的數(shù)據(jù)的轉(zhuǎn)存到消耗的功耗。
- 系統(tǒng)RAM在大多數(shù)低功耗模式下都具有數(shù)據(jù)保存能力。因此在系統(tǒng)側(cè)掉電時,無線電CPU重新上電時也可以申請對系統(tǒng)RAM的訪問。但無線電CPU訪問系統(tǒng)RAM的功耗要大于無線電RAM。
- Flash總是具有數(shù)據(jù)保存能力,但是Flash只能保存系統(tǒng)CPU寫入的參數(shù)。無線電CPU訪問Flash時必須保證系統(tǒng)CPU處于正常工做狀態(tài),且其功耗是要高于訪問系統(tǒng)RAM的。
- 通過將所有數(shù)據(jù)結(jié)構(gòu)放在無線電RAM中,并在無線電CPU運行時將系統(tǒng)側(cè)下電,可以獲得最低的峰值功耗。在某些情況下,通過將數(shù)據(jù)結(jié)構(gòu)放在系統(tǒng)RAM中,平均功耗可能會更低,因為在無線電CPU掉電時需要的復(fù)制的內(nèi)容更少,而且系統(tǒng)側(cè)仍然可以長時間斷電。
2.2 命令狀態(tài)
2.2.1 CMDSTA寄存器
當命令被發(fā)布后,CMDSTA寄存器會會在一定時間內(nèi)被無線電CPU更新,并導(dǎo)致RFCMDACK中斷返回到系統(tǒng)CPU。
這個更新發(fā)生在即時命令和直接命令完成之后或無線電操作命令被調(diào)度之后,在狀態(tài)更新之前,其他命令無法發(fā)布。
CMDSTA寄存器是一個32位寄存器,其低8位給出了命令處理結(jié)果,其余的高24位可以用在具體的命令格式要求上,它最多可以傳回三字節(jié)參數(shù),其格式如下圖所示:
其中Result的第7位表示是否有錯誤產(chǎn)生,0是沒有錯誤,1表明有錯誤。
Result的值表達的含義,可由下表查看:
值得一提的是:結(jié)果字節(jié)0x00表示等待,在命令發(fā)布時由無線電門鈴硬件自動產(chǎn)生,該狀態(tài)會將CMDSTA寄存器全部清0,這是CMDSTA在引發(fā)RF_CMD_ACK中斷前所具有的值。
2.2.2 命令結(jié)果中的狀態(tài)
每個無線電操作命令都包含一段狀態(tài)位,該狀態(tài)位的值可以在命令執(zhí)行的過程在被無線電CPU修改,并可以隨時被系統(tǒng)CPU獲取。
這段值包含以下幾種狀態(tài):
- Idle:命令還沒開始執(zhí)行
- Pending:命令已經(jīng)被解析,但還未開始觸發(fā)
- Active:命令正在被執(zhí)行
- Suspended:該命令一直處于活動狀態(tài),并且可能再次變?yōu)榛顒訝顟B(tài)。該命令僅被部分IEEE 802.15.4命令支持。
- Finished:命令已經(jīng)完成,系統(tǒng)CPU可自由修改命令結(jié)構(gòu)或釋放內(nèi)存
- Skippped:命令已經(jīng)被忽略,并且永遠不會執(zhí)行。
status狀態(tài)位的數(shù)值對應(yīng)的狀態(tài)含義可以查看手冊中的“Common Radio Operation Status Codes”表。
當系統(tǒng)CPU準備命令結(jié)構(gòu)時,需要將status字段初始化為Idle。
如果有一組命令是被循環(huán)執(zhí)行的,系統(tǒng)CPU在此過程中不能修改命令結(jié)構(gòu),直到無線電CPU變?yōu)榭臻e(即系統(tǒng)CPU收到一個LAST_COMMAND_DONE中斷)。
2.3 中斷
無線電CPU有32個軟件中斷源,它們可以在系統(tǒng)CPU中產(chǎn)生RFCPE0和RFCPE1中斷,這些中斷在RFCPEIFG寄存器的描述中列出。
中斷標志寄存器可以指示哪個軟件中斷被觸發(fā),并且中斷被單獨啟用。
此外,當CMDSTA更新時,RFCMDACK中斷會自動觸發(fā)。
一些軟件定義的中斷在所有命令中有一個共同的含義;還有一些中斷是為每個使用特定中斷的協(xié)議定義的。在使用中斷時也要注意一些中斷只在一個協(xié)議中使用,而有些中斷能在幾個協(xié)議中使用。
2.4 數(shù)據(jù)傳播
通過射頻傳播數(shù)據(jù)的基本方式有兩種:直接傳播或通過隊列傳播。
傳播數(shù)據(jù)最直接的方法是將其作為命令參數(shù)的一部分追加(直接或通過指針)。確切的格式取決于正在運行的命令。對于傳輸端而言,通常有一個長度字段和一個傳輸數(shù)據(jù)緩沖區(qū);對于接收端而言,通常有一個最大長度,接收長度(如果是可變長度),和一個接收緩沖區(qū)。
對于某些操作,無法預(yù)先知道接收或傳輸?shù)陌臄?shù)量(或者在少數(shù)包中實際傳輸?shù)氖悄膫€包)。對于這種操作,使用隊列的概念。一個操作可以使用一個或多個隊列,例如,一個RX和一個TX隊列用于組合的RX/TX操作,或者根據(jù)接收到的數(shù)據(jù)包中的信息使用多個隊列。
任何使用隊列的操作都使用一個公共系統(tǒng)來維護它們,這個在后面再說。
無線電操作命令會聲明本次命令使用的數(shù)據(jù)傳播類型。
2.5 命令調(diào)度器
射頻命令的調(diào)度也是由系統(tǒng)CPU負責。當系統(tǒng)CPU工作在低功耗模式下時,系統(tǒng)CPU會根據(jù)RTC在下一個操作命令開始前的短時間內(nèi)喚醒。
無線電操作命令可以通過延遲啟動來調(diào)度。如果命令是延遲啟動的方式,在延遲期間無線電CPU將進入空閑模式,直到命令啟動。但注意在此延遲期間內(nèi)無線電操作命令被認為正在運行狀態(tài),除該命令首先被中止或停止,否則不能調(diào)度其他無線電操作命令。
系統(tǒng)CPU可以通過任意無線電操作命令中的下一個操作指針位來調(diào)度該指針指向的命令,通過這種方法,可以執(zhí)行復(fù)雜的操作。當調(diào)用指向的下一個命令時發(fā)生了某些意外情況(例如錯誤或計時器過期),下一個命令不會啟動,相反該操作可能會結(jié)束或者跳過一些命令。如果一個新命令在另一個命令運行時被調(diào)度,系統(tǒng)CPU必須等待前一個命令或命令鏈完成。
當一個無線電操作命令完成時,無線電CPU向系統(tǒng)CPU拋出一個COMMAND_DONE中斷。如果像前面解釋的那樣鏈接了許多命令,則在每個命令之后引發(fā)COMMAND_DONE中斷,而在鏈中的最后一個命令之后引發(fā)LAST_COMMAND_DONE中斷。對于一個非鏈式命令,LAST_COMMAND_DONE中斷也會在該命令之后引發(fā)。當引發(fā)LAST_COMMAND_DONE時,COMMAND_DONE總是同時被引發(fā)。在引發(fā)COMMAND_DONE中斷之前,無線電CPU會將命令結(jié)構(gòu)中的狀態(tài)位(status)也更新為命令完成狀態(tài)。
在啟動COMMAND_DONE中斷后,無線電CPU不訪問命令結(jié)構(gòu)。
2.5.1 觸發(fā)
觸發(fā)可以規(guī)定命令被系統(tǒng)CPU發(fā)布的條件和時間,或用于特定無線電操作命令中的其他特定目的。
觸發(fā)器的數(shù)據(jù)結(jié)構(gòu)如下圖所示:
下面將對觸發(fā)器的結(jié)構(gòu)進行介紹。
trigger type
射頻操作命令支持多種觸發(fā)類型,通過設(shè)置不同的觸發(fā)類型,可以規(guī)定不同的命令發(fā)布的條件。
無線電操作命令支持的觸發(fā)類型如下所示:
除了TRIG_NOW和TRIG_NEVER之外,所有觸發(fā)器都使用32位的時間參數(shù)。
絕對定時使用32位的RAT值。相對計時使用RAT滴答的數(shù)量。外部觸發(fā)器使用source和edge標識符。
相對計時可以相對于提交命令鏈的時間、命令的開始、前一個或第一個命令的開始,或者相對于命令中觀察到的事件,這些事件將為每個命令定義。
需要注意的是:相對時間的用法比較特殊,相對計時可以相對于提交命令鏈的時間、命令的開始、前一個或第一個命令的開始,或者相對于命令中觀察到的事件,其具體要求如下:
- 對于鏈中的第一個命令,如果開始觸發(fā)器是類型5到9中的任何一個,則立即開始。如果鏈中第一個命令引用的另一個觸發(fā)器是類型5到9中的任何一個,則觸發(fā)器時間相對于這些命令提交的時間。
- 如果命令的啟動觸發(fā)器是TRIG_REL_START,則會產(chǎn)生錯誤,該類型不能用于啟動觸發(fā)。
- 如果命令的起始觸發(fā)器為TRIG_NEVER,且bEnaCmd為0,則會產(chǎn)生錯誤,該命令不會被觸發(fā)。
對于外部觸發(fā)器,無線電CPU將RAT設(shè)置為使用選定的輸入事件作為一個捕獲觸發(fā)器;然后,無線電CPU使用這個捕獲中斷來觸發(fā)動作。
bEnaCmd
如果bEnaCmd為1,則動作也可能由命令觸發(fā)(CMD_TRIGGER命令)。
trigger No
triggerNo參數(shù)標識該命令的觸發(fā)號。
pastTring
如果觸發(fā)器在計算時發(fā)生在過去,則行為取決于pastTrig位。如果該位為0,則觸發(fā)器不發(fā)生,或者對于啟動觸發(fā)器,將產(chǎn)生一個錯誤。如果pastTrig位為1,則觸發(fā)器會盡快發(fā)生。
注意如果過去的觸發(fā)被觸發(fā),則相對于命令開始的計時相對于程序開始運行的時間,而不是實際的開始時間。
對于外部觸發(fā)器,如果事件發(fā)生在設(shè)置發(fā)生之前,則不捕獲該事件,并忽略pastTrig位。
2.5.2 條件執(zhí)行
當前命令是否被執(zhí)行的執(zhí)行可能取決于前一個命令的執(zhí)行結(jié)果。
對于每個命令,可能有三種結(jié)果:
- TURE
- FALSE
- ABORT
每個命令都定義了判斷。如果沒有定義,則結(jié)果為TRUE,除非命令以錯誤結(jié)束,在這種情況下,結(jié)果為ABORT。
每一個命令結(jié)構(gòu)都包含一字節(jié)條件來運行下一條命令。該條件字節(jié)的結(jié)構(gòu)如下圖所示:
其中RULE規(guī)定了下一條命令的執(zhí)行條件,主要有以下幾種:
如果執(zhí)行被停止,無線電CPU將回到空閑狀態(tài),并且在通過CMDR寄存器輸入新命令之前不會運行進一步的命令。LAST_COMMAND_DONE中斷被拋出。
如果該規(guī)則為COND_SKIP_ON_FALSE或COND_SKIP_ON_TRUE,則在nSkip字段中顯示需要跳過的命令數(shù)量。如果跳過次數(shù)為0,則重新運行相同的命令。如果跳數(shù)為1,則在鏈中執(zhí)行下一個命令。如果跳過次數(shù)是2,則運行下一個命令之后的命令,以此類推。
如果命令以中止結(jié)果結(jié)束,則無論條件如何,執(zhí)行都將結(jié)束。會引發(fā)LAST_COMMAND_DONE中斷。中止結(jié)果的一個條件示例是發(fā)出一個CMD_ABORT命令。
2.5.3 無線電CPU在解析命令前處理
對于所有的無線電操作命令,在解析命令的其余部分之前,先檢查啟動觸發(fā)器和條件代碼。如果啟動觸發(fā)器具有非法的觸發(fā)類型(包括啟動觸發(fā)器不允許的TRIG_REL_START,以及與沒有命令觸發(fā)器組合的TRIG_NEVER),無線電CPU將status字段設(shè)置為ERROR_START_TRIG。如果condition字段有一個非法的值,無線電CPU會將status字段設(shè)置為ERROR_CONDITION。如果start觸發(fā)器發(fā)生在過去,并且startTrigger。pastTrig為0,無線電CPU設(shè)置status字段為ERROR_PAST_START。
2.6 命令的數(shù)據(jù)結(jié)構(gòu)
經(jīng)過上面的介紹,我們可以得知在一個無線電操作命令中,會存在命令狀態(tài)位、下一個命令指針位、啟動事件位、啟動觸發(fā)類型位和執(zhí)行條件位。
因此我們可以得到無線電操作命令的數(shù)據(jù)結(jié)構(gòu)格式:
可以看到,前面講到的有關(guān)命令調(diào)度的信息都存在于該數(shù)據(jù)結(jié)構(gòu)中
需要說明的是,該數(shù)據(jù)結(jié)構(gòu)中,字節(jié)索引是指向該結(jié)構(gòu)的指針的偏移量。多字節(jié)字段是小端序的,需要根據(jù)字段大小進行16位半字或32位字對齊。對于位編號,0是LSB。
需要注意的是命令的數(shù)據(jù)結(jié)構(gòu)是由系統(tǒng)CPU產(chǎn)生的,因此R/W類型也都是針對系統(tǒng)CPU而言的
因此R/W列的用法可表示如下:
- R:系統(tǒng)CPU可以讀回返回結(jié)果;無線電CPU不讀取該字段。
- W:系統(tǒng)CPU寫入一個值,無線電CPU只讀取它,不修改它。
- R/W:系統(tǒng)CPU寫入一個初始值,無線電CPU可以修改它。
我們還知道,這些不同的數(shù)據(jù)位也使用了子數(shù)據(jù)結(jié)構(gòu)來表示,對于該數(shù)據(jù)結(jié)構(gòu)的專用子數(shù)據(jù)結(jié)構(gòu),來自父結(jié)構(gòu)的字段不會重復(fù),但是字節(jié)索引列反映了它們的存在。
所有命令的唯一必選字段是命令I(lǐng)D號,這是一個16位的數(shù)字,作為命令結(jié)構(gòu)的前兩個字節(jié)發(fā)送。
一些即時命令有附加字段,這些字段是為每個命令定義的。此外無線電操作命令也有附加的必填字段。
所有標記為“Reserved”的命令字段都應(yīng)該被寫入0。
2.7 數(shù)據(jù)條目的數(shù)據(jù)結(jié)構(gòu)
數(shù)據(jù)條目(Data Entry)是必須存入一個射頻隊列中。
隊列是作為無線電操作命令的命令結(jié)構(gòu)的一部分設(shè)置的。
關(guān)于以命令的形式操作隊列將在后面專門介紹,目前我們先來認識這個數(shù)據(jù)條目的數(shù)據(jù)結(jié)構(gòu)。
2.7.1 數(shù)據(jù)條目隊列
數(shù)據(jù)條目隊列的結(jié)構(gòu)如下圖所示:
其中包含一個32位的隊頭指針,和一個32位的對尾指針。該隊列的頭指針一直指向當前無線電CPU正在處理的數(shù)據(jù)條目。
任何使用隊列的命令都包含一個指向數(shù)據(jù)條目隊列的數(shù)據(jù)結(jié)構(gòu)的指針,該指針在系統(tǒng)CPU分配并初始化這個隊列結(jié)構(gòu)是被放入。
2.7.2 數(shù)據(jù)條目
數(shù)據(jù)條目隊列中包含的數(shù)據(jù)條目結(jié)構(gòu)如下圖所示。
這些條目被組織在一個鏈表中。隊列的第一個數(shù)據(jù)條目由隊列結(jié)構(gòu)的pCurrEntry字段指向。在數(shù)據(jù)條目中的pNextEntry字段存著指向下一個數(shù)據(jù)條目的指針,隊列結(jié)構(gòu)的pLastEntry字段指向隊列中的最后一個條目,通過這種方式構(gòu)成一個數(shù)據(jù)鏈表。
每個數(shù)據(jù)條目在某一時刻下一定處于以下幾個狀態(tài)中:
- Pending:表示該條目未被無線電CPU使用。這是在提交條目之前系統(tǒng)CPU寫入的狀態(tài)。
- Active:該條目是隊列中當前打開的供無線電CPU寫入(RX)或讀取(TX)的條目。
- Busy:正在寫或讀一個未完成的包。當條目處于這種狀態(tài)時,某些操作是不允許的。
- Finished:無線電CPU已完成將數(shù)據(jù)寫入此條目,并可供系統(tǒng)CPU重用或釋放內(nèi)存(如果動態(tài)分配)。
對于數(shù)據(jù)條目,系統(tǒng)CPU在系統(tǒng)RAM或無線電RAM的可用部分中設(shè)置所需的數(shù)據(jù)結(jié)構(gòu)。如果數(shù)據(jù)結(jié)構(gòu)是動態(tài)分配的,系統(tǒng)CPU使用后會釋放內(nèi)存。
在用于接收數(shù)據(jù)的條目中,無線電CPU可以使用LenSz來表示條目元素的長度。如果config.LenSz為00,表示此指標未使用。除非當接收到的數(shù)據(jù)包的長度可以通過其他方法確定,否則LenSz位不能設(shè)置為00,必須被用來記錄接收數(shù)據(jù)的長度。
length表示的是存儲數(shù)據(jù)條目元素的緩沖區(qū)的大小,表示這個數(shù)據(jù)條目中可接收的所有條目元素的大小,如果是指針條目類型,則length表示所指向的數(shù)據(jù)緩沖區(qū)的大小。
2.7.3 指針條目
使用指針條目(Pointer Entry)是表明數(shù)據(jù)不包含在條目結(jié)構(gòu)中,但在條目原本存放數(shù)據(jù)的位置包含了一個指向其他緩沖區(qū)的指針,該指針指向存儲數(shù)據(jù)的內(nèi)存地址,該地址由系統(tǒng)CPU分配并寫入,由無線電CPU來讀取。
通過設(shè)置config.type = 2來配置數(shù)據(jù)條目成為一個指針條目。指針替換數(shù)據(jù)字段,其結(jié)構(gòu)如下圖所示:
數(shù)據(jù)從pData提供的緩沖區(qū)中讀取或存儲,這個緩沖區(qū)的大小由length決定,此時config.lenSz可以設(shè)置為00。
2.7.4 提前讀取部分接收條目
專有模式支持一中RX條目,其中數(shù)據(jù)可以在通過射頻接收整個數(shù)據(jù)包之前被讀取,它可以用于以下目的:
- 在接收到整個數(shù)據(jù)包之前必須讀取數(shù)據(jù)
- 當包的長度在包的開始是未知的
- 當包的長度太長,以致于整個有效負載不能同時保存在內(nèi)存中
為了支持這一點,對普通數(shù)據(jù)條目的結(jié)構(gòu)做了一個特殊變體。作為多元素條目,同一條目中可以包含多個條目元素。每個條目元素對應(yīng)于通過射頻接收的一個數(shù)據(jù)包,或者僅代表數(shù)據(jù)包的一部分。元素還可以包含其他字段。該類型通過設(shè)置config.type = 3。在多元素條目中,數(shù)據(jù)字段的組成如圖所示:
該條目更新如下:
- 當新的字節(jié)被寫入緩沖區(qū)時,nextIndex字段被更新。
- 接收報文時,射頻CPU設(shè)置pktStatus.bEntryOpen =1。
當一個條目元素結(jié)束時,要么是因為包結(jié)束了,要么是因為元素到達了條目pktStatus的末尾。pktStatus.bEntryOpen被射頻CPU設(shè)置為0。pktStatus.numElements遞增。如果報文繼續(xù)進入下一個條目,無線電CPU設(shè)置pktStatus.bLastCont =1,同是無線電CPU會將下一個條目的pktStatus.bFirstCont位也設(shè)置為1。如果沒有下一項可用,狀態(tài)設(shè)置為Unfinished,否則設(shè)置為Finished。
由于在條目元素開頭指定的長度字段(取決于config.lenSz)指定的是條目中數(shù)據(jù)的長度,而不是整個數(shù)據(jù)包的長度。如果在打開表項時不知道長度(一個表項無法存滿整個數(shù)據(jù)包),則length字段被寫入數(shù)據(jù)的剩余長度,并在數(shù)據(jù)結(jié)束前由無線電CPU更新。
2.8 外部信號
無線電CPU控制4個CPEGPOx信號,可用于外部信號,例如控制外部PAs和LNAs或調(diào)試。
- 內(nèi)部LNA使能時,CPEGPO0為高電平,
- 內(nèi)部PA使能時,CPEGPO1為高電平,
- 合成器校準時,CPEGPO2為高電平。
RAT的兩個輸出信號具有自動配置,可用于觀察。當數(shù)據(jù)包開始傳輸時,信號RATGPO0為高,當傳輸結(jié)束時為低。觀察RATGPO0可以得到數(shù)據(jù)包傳輸?shù)木_時間,因為內(nèi)部使用的是相同的信號。RATGPO0與CPEGPO1非常相似,但它比CPEGPO1提前了一些微秒,而且與調(diào)制解調(diào)器發(fā)出的第一個傳輸符號相比,計時更準確。
默認情況下,射頻CPU在啟動時將CPEGPO0映射為RFC_GPO0信號,CPEGPO1映射為RFC_GPO1信號,CPEGPO2映射為RFC_GPO2信號,RATGPO0映射為RFC_GPO3信號。這個映射可以通過寫入rfc_bell:SYSGPOCTL寄存器來修改。
RFC_GPOx信號可以通過系統(tǒng)I/O控制器映射到輸出管腳。
3 命令的定義
下面將介紹一組獨立于使用的射頻協(xié)議的命令。這些命令與無線電的低級操作有關(guān)。
3.1 獨立于協(xié)議的無線電操作命令
首先對于接下里要介紹的無線電操作命令,造成操作結(jié)束的原因被列在下面表中,或者這些原因被添加到命令的額外參數(shù)中。
這些操作結(jié)束的原因?qū)⒈挥涗浽诿罱Y(jié)構(gòu)體的status字段中,這個命令結(jié)束的結(jié)果是TRUE、Flash或者ABORT,將被status中的rule字段表示出來(具體見2.5.2),這個結(jié)果將表明下一個命令是會繼續(xù)執(zhí)行,還是會返回空閑狀態(tài)。
3.2 各種無線電命令的介紹
有關(guān)各種無線電命令的介紹,可以直接查閱CC1310技術(shù)參考手冊的23.3.4和23.3.4兩章節(jié),在此再一一介紹
4 數(shù)據(jù)隊列的用法
該章節(jié)將介紹無線電CPU是如何使用數(shù)據(jù)隊列的
4.1 僅供內(nèi)部無線電CPU操作的數(shù)據(jù)隊列操作
在CC1310的技術(shù)參考手冊中的23.3.4章節(jié)列出了用于數(shù)據(jù)隊列操作的各種命令,那些命令都是由無線電CPU產(chǎn)生的針對于內(nèi)部無線電數(shù)據(jù)隊列的立即命令。但是除了那些用于維護數(shù)據(jù)隊列的命令外,無線電CPU還可以實現(xiàn)一些內(nèi)部操作。
4.1.1 PROC_ALLOCATE_TX:讀取被分配的TX條目
該操作用于讀取TX隊列的當前條目
該操作需要指定當前操作的隊列指針(提供pQueue),在執(zhí)行成功后返回被讀取的數(shù)據(jù)條目的指針(pEntry)。
如果指定的隊列為空,或者隊列的第一個條目已經(jīng)忙,該過程將返回錯誤。否則,執(zhí)行以下操作:
Set pQueue->pCurrEntry->status = Busy Set pEntry = pQueue->pCurrEntry首先將操作的隊列的當前條目的狀態(tài)設(shè)置為BUSY,表明TX隊列的當前條目正在被讀取,之后讀取當前條目的信息。
4.1.2 PROC_FREE_DATA_ENTRY:清除已分配數(shù)據(jù)條目
該操作會激活隊列的當前條目,來開始寫入或讀取當前條目的信息
該操作需要指定當前操作的隊列指針(提供pQueue),在執(zhí)行成功后返回被清除的數(shù)據(jù)條目的指針(pEntry)。
如果指定的隊列為空,該過程將返回錯誤。否則,執(zhí)行以下操作
Set pQueue->pCurrEntry->status = Active通過將當前條目的狀態(tài)設(shè)為Active,表明該隊列的當前條目可以讀取或?qū)懭胄碌臄?shù)據(jù)。
4.1.3 PROC_FINISH_DATA_ENTRY:從隊列中完成第一個數(shù)據(jù)條目的使用
該操作實質(zhì)是將處于Pending狀態(tài)的下一個條目的信息更新到到當前條目中
該操作需要指定當前操作的隊列(提供pQueue),在執(zhí)行成功后返回下一個要被分配的數(shù)據(jù)條目的指針(pEntry)。
如果指定的隊列為空,該過程將返回錯誤。否則,執(zhí)行以下操作:
Set pTemp = pQueue->pCurrEntry Set pQueue->pCurrEntry = pTemp->pNextEntry Set pTemp->status = Finished Set pEntry = pQueue->pCurrEntry將當前條目中存儲的下一個條目信息賦值給當前條目,并返回即將被操作的條目的信息
4.1.4 PROC_ALLOCATE_RX:為存儲數(shù)據(jù)分配RX緩沖區(qū)
該操作需要指定當前操作的隊列指針(pQueue)和需要存儲的條目元素(數(shù)據(jù)包)的大小(size),在執(zhí)行成功后返回存儲數(shù)據(jù)的數(shù)據(jù)條目的指針pEntry和指向已完成的數(shù)據(jù)條目的指針(pFinishEntery),若未執(zhí)行成功,則只返回存儲數(shù)據(jù)的數(shù)據(jù)條目的指針(pEntry)。
如果隊列的第一個條目已經(jīng)繁忙,該過程將返回錯誤。如果沒有空間容納指定大小的條目元素,包括隊列為空的情況,則返回" no space "錯誤。否則,執(zhí)行以下操作:
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 end4.1.5 PROC_FINISH_RX:提交接收到的數(shù)據(jù)到RX數(shù)據(jù)條目
該操作需要指定當前操作的隊列指針(pQueue)和已存儲的條目元素的大小(size),在執(zhí)行成功后返回存儲數(shù)據(jù)的數(shù)據(jù)條目的指針pEntry和指向已完成的數(shù)據(jù)條目的指針(pFinishEntery),若未執(zhí)行成功,則只返回存儲數(shù)據(jù)的數(shù)據(jù)條目的指針(pEntry)。
如果隊列為空或沒有空間容納指定大小的條目元素,該過程將返回錯誤。否則,執(zhí)行以下操作:
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注意:這個操作是在執(zhí)行PROC_ALLOCATE_RX操作并寫入緩沖區(qū)中的正確位置完成后執(zhí)行的,其輸入?yún)?shù)sIze必須與PROC_ALLOCATE_RX相同。
4.2 無線電CPU使用隊列操作樣例
4.2.1 接收隊列
當無線電CPU收到一個數(shù)據(jù)包時,它通過調(diào)用PROC_ALLOCATE_RX準備一個緩沖區(qū)來讀取。如果這是成功的,分配的緩沖區(qū)將用于存儲為每個協(xié)議定義的傳入數(shù)據(jù)包。如果發(fā)生無空間錯誤,則接收到的數(shù)據(jù)無法存儲,并且為每個協(xié)議定義了處理。
在接收到數(shù)據(jù)包之后,根據(jù)為每個協(xié)議定義的規(guī)則,它可以被保留或丟棄。為了保存數(shù)據(jù)包,無線電CPU調(diào)用PROC_FINISH_RX。這使得接收到的數(shù)據(jù)對系統(tǒng)CPU可用。為了丟棄報文,無線電CPU調(diào)用PROC_FREE_DATA_ENTRY,這意味著下一個報文可能會覆蓋上一個報文接收到的數(shù)據(jù)。
4.2.2 發(fā)送隊列
當無線電CPU準備從TX隊列傳輸一個數(shù)據(jù)包時,它調(diào)用PROC_ALLOCATE_TX來獲得一個指向要傳輸?shù)臄?shù)據(jù)的指針。報文傳輸時,無線電CPU調(diào)用PROC_FINISH_DATA_ENTRY或PROC_FREE_DATA_ENTRY。
如果調(diào)用PROC_FINISH_DATA_ENTRY,則通知系統(tǒng)CPU,當前條目的數(shù)據(jù)已經(jīng)完成發(fā)送,當前條目可以被重新使用。如果無法選擇重傳數(shù)據(jù)包,則必須使用此調(diào)用過程。
如果調(diào)用PROC_FREE_DATA_ENTRY,傳輸?shù)臈l目將保持在隊列中的第一個,以便它可以被傳輸,這在期待收到一個確認信息時使用。
如果在傳輸?shù)臄?shù)據(jù)包上收到一個確認,然后無線電CPU調(diào)用PROC_FREE_DATA_ENTRY,無線電CPU調(diào)用PROC_ALLOCATE_TX,然后PROC_FINISH_DATA_ENTRY(這相當于CMD_REMOVE_DATA_ENTRY,參見技術(shù)手冊的23.3.3.2節(jié))。這個調(diào)用進程導(dǎo)致隊列中的下一個條目被傳輸。如果沒有收到確認,則重傳最后一個傳輸?shù)臄?shù)據(jù)包。
總結(jié)
以上是生活随笔為你收集整理的CC1310手册的射频核心介绍的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 京东云宙斯上传单张图片php,单张图片上
- 下一篇: Altium Designer PCB界