【導讀】隨著(zhù)技術(shù)的進(jìn)步,低功耗物聯(lián)網(wǎng)(IoT)和邊緣/云計算需要更精確的數據傳輸。圖1展示的無(wú)線(xiàn)監測系統是一個(gè)帶有24位模數轉換器(ADC)的高精度數據采集系統。在此我們通常會(huì )遇到這樣一個(gè)問(wèn)題,即微控制單元(MCU)能否為數據轉換器提供高速的串行接口。
本文描述了設計MCU和ADC之間的高速串行外設接口(SPI)關(guān)于數據事務(wù)處理驅動(dòng)程序的流程,并簡(jiǎn)要介紹了優(yōu)化SPI驅動(dòng)程序的不同方法及其ADC與MCU配置。本文還詳細介紹了SPI和直接存儲器訪(fǎng)問(wèn)(DMA)關(guān)于數據事務(wù)處理的示例代碼。最后,本文演示了在不同MCU(ADuCM4050、MAX32660)中使用相同驅動(dòng)程序時(shí)ADC的吞吐率。
圖1. 狀態(tài)監控。
引言
通用SPI驅動(dòng)程序簡(jiǎn)介
通常,MCU廠(chǎng)商會(huì )在例程代碼中提供通用的SPI驅動(dòng)程序/API。通用SPI驅動(dòng)程序/API通??梢院w大多數用戶(hù)的應用,這些代碼可能包含許多配置或判斷語(yǔ)句。但在某些特定情況下,比如ADC數據采集,通用的SPI驅動(dòng)程序可能無(wú)法滿(mǎn)足ADC數據的全速的吞吐速率需求,因為通用的驅動(dòng)程序中有過(guò)多的配置,而未使用的配置會(huì )產(chǎn)生額外的開(kāi)銷(xiāo)并導致時(shí)間延遲。
圖2. 通用API的配置。
設計思路與實(shí)踐框架
我們通常會(huì )選擇低功耗高性能的MCU作為主機通過(guò)SPI提取ADC的輸出數據。但是,由于A(yíng)DI的SPI驅動(dòng)程序的數據事務(wù)處理命令存在冗余,因此數據輸出速率可能被顯著(zhù)降低。為了充分釋放ADC的潛在速率,本文使用ADuCM4050和 AD7768-1 進(jìn)行實(shí)驗并嘗試可能的解決方案。盡管在使用默認濾波器的情況下,ADuCM4050的最大數據輸出速率可達256 kHz,但在當前情況下,其速率被限制在8 kHz。提高輸出速率的潛在解決方案包括刪除不必要的命令以及激活DMA控制器。本文將在以下小節中介紹這些思路。
圖3. 不同ODR以及DRDY與SCLK之間的關(guān)系。
以MCU作為主機
ADuCM4050 MCU是一款主時(shí)鐘速率為26 MHz的超低功耗微控制器,內核為ARM? Cortex?-M4F處理器。ADuCM4050配有三個(gè)SPI,每個(gè)SPI都有兩個(gè)DMA通道(接收和發(fā)射通道)可與DMA控制器連接。DMA控制器和DMA通道可實(shí)現存儲器與外設之間的數據傳輸。這是一種高效的數據分配方法,可將內核釋放以處理其他任務(wù)。
以ADC作為從機
AD7768-1是一款24位低功耗、高性能的Σ-Δ ADC。其數據輸出速率(ODR)和功耗模式均可根據用戶(hù)的要求進(jìn)行配置。ODR由抽取系數和功耗模式共同決定,如表1中所示。
表1. 數據輸出速率的功耗模式配置
AD7768-1的連續讀取模式也是該產(chǎn)品的一個(gè)重要特性。ADC的輸出數據存儲在寄存器0x6C中。一般而言,每次讀/寫(xiě)操作之前,ADC寄存器中的數據都需要地址才可以訪(fǎng)問(wèn),但是連續讀取模式則支持在收到每個(gè)數據就緒信號后直接從0x6C寄存器提取數據。ADC的輸出數據為24位的數字信號,對應的電壓如表2所示。
表2. 數字輸出碼和模擬輸入電壓
引腳連接示意圖
ADuCM4050和AD7768-1組成的數據事務(wù)處理示例模型的引腳連接如圖4所示。
ADC的復位信號引腳RST_1連接至MCU的GPIO28,而數據就緒信號引腳DRDY_1則連接至MCU的GPIO27。其余引腳則根據通用的SPI配置標準進(jìn)行連接,其中MCU為主機,而ADC為從機。SDI_1接收MCU發(fā)送的ADC寄存器讀/寫(xiě)命令,而DOUT_1則將ADC的輸出數據發(fā)送至MCU。
圖4. AD7768-1和ADuCM4050的接口引腳連接。
數據事務(wù)處理的實(shí)現
中斷數據事務(wù)處理
為實(shí)現連續數據事務(wù)處理,本文將MCU的GPIO27引腳(連接至ADC的DRDY_1引腳)用作中斷觸發(fā)引腳。ADC將數據就緒信號發(fā)送至GPIO27時(shí)會(huì )觸發(fā)MCU包含數據事務(wù)處理命令的中斷回調函數。如圖5所示,數據采集必須在中斷A和中斷B之間的時(shí)間間隔內進(jìn)行。
利用ADI的SPI驅動(dòng)程序可以在A(yíng)DC和MCU之間輕松實(shí)現數據事務(wù)處理。但是,由于驅動(dòng)程序內存在冗余命令,ADC的ODR會(huì )被限制在8 kHz。本文盡可能地精簡(jiǎn)了代碼以加快ODR,將介紹實(shí)現DMA數據事務(wù)處理的兩種方法:基本模式的DMA事務(wù)處理和乒乓模式的DMA事務(wù)處理。
圖5. 兩次中斷的時(shí)間間隔。
基本模式的DMA事務(wù)處理
在實(shí)現每個(gè)DMA事務(wù)處理之前需要對SPI和DMA進(jìn)行配置(參見(jiàn)圖6中的示例代碼)。SPI_CTL為SPI配置,其值為0x280f,源于A(yíng)DI的SPI驅動(dòng)程序的設定值。SPI_CNT為傳輸字節數。由于每個(gè)DMA事務(wù)處理只能發(fā)送固定的16位數據,因此SPI_CNT必須是2的倍數。本例設置SPI_CNT為4,以滿(mǎn)足ADC的24位的輸出數據要求。SPI_DMA寄存器為SPI的DMA使能寄存器,設定其值為0x5以使能DMA接收請求。命令pADI_DMA0->EN_SET=(1<<5)使能第五個(gè)通道的DMA,即SPI0 RX。
表3. DMA結構寄存器
每個(gè)DMA通道都有一個(gè)DMA結構寄存器,如表3中所示。需要指出的是,這里的數據來(lái)源地址的結尾(即SPI0 Rx,亦即來(lái)源端指針SRC_END_PTR)在整個(gè)操作期間無(wú)需增加,因為Rx FIFO會(huì )自動(dòng)將寄存器中的數據推送出去。另一方面,數據目標地址的結尾(即目標端指針DST_END_PTR)根據ADI的SPI驅動(dòng)程序的使用函數計算得出,即目標地址+ SPI_CNT -2。
當前地址為內部數組緩沖區的地址。DMA控制數據配置CHNL_CFG包括來(lái)源數據大小、來(lái)源地址增量、目標地址增量、剩余傳輸次數和DMA控制模式等設置,其值0x4D000011按照表4中所述的設置配置。
表4. 控制數據配置0x4D00011的DMA配置
SCLK時(shí)鐘通過(guò)偽讀取命令SPI_SPI0 -> RX啟動(dòng),輸出數據通過(guò)MISO從ADC傳至MCU。MOSI上其它的數據傳輸可以忽略不計。一旦完成Rx的FIFO填充,DMA請求就會(huì )生成從而激活DMA控制器,以將數據從DMA來(lái)源地址(即SPI0 Rx FIFO)傳輸至DMA目標地址(即內部數組的緩沖區)。值得注意的是,SPI_DMA=0x3時(shí)會(huì )生成Tc請求。
最后,通過(guò)將當前目標地址加4的方式將目標地址用于下一個(gè)4字節的傳輸。
請注意,SPI0 DMA通道的pADI_DMA0->DSTADDR_CLR和pADI_DMA0->RMSK_CLR必須在首次中斷觸發(fā)之前在主函數中設置。前一個(gè)為DMA通道目標地址減量使能清零寄存器,用于在增量模式下設置每次DMA傳輸后的目標地址移位(目標地址計算函數僅在增量模式下有效)。后一個(gè)為DMA通道請求屏蔽清零寄存器,用于將通道的DMA請求狀態(tài)清零。
基本模式的DMA事務(wù)處理時(shí)間圖如圖7a所示。圖中三個(gè)時(shí)隙分別代表DRDY信號、SPI/DMA設置和DMA數據事務(wù)處理。在該模式中,CPU的空閑時(shí)間較多,因此希望DMA控制器在處理數據傳輸時(shí)能將任務(wù)分配給CPU。
圖6. 基本DMA事務(wù)處理模式的代碼。
乒乓模式的DMA事務(wù)處理
在執行偽讀取命令后,DMA控制器會(huì )開(kāi)始數據事務(wù)處理,從而使得MCU的CPU處于空閑狀態(tài)而不處理任何任務(wù)。如果能夠讓CPU和DMA控制器同時(shí)工作,那么任務(wù)處理就從串行模式轉變?yōu)椴⑿心J?。這樣,就可以同時(shí)進(jìn)行DMA配置(通過(guò)CPU)以及DMA數據事務(wù)處理(通過(guò)DMA控制器)。為實(shí)現這一思路,需要設置DMA控制器處于乒乓模式。乒乓模式將兩組DMA結構進(jìn)行了整合:主結構和備用結構。每次DMA請求時(shí),DMA控制器會(huì )在兩組結構之間自動(dòng)切換。變量p的初始設置為0,其值表示是主DMA結構(p = 0)還是備用DMA結構(p = 1)負責數據事務(wù)處理。如果p = 0,則在收到偽讀取命令時(shí)啟動(dòng)主DMA結構進(jìn)行數據事務(wù)處理,同時(shí)會(huì )為備用DMA結構分配值,使其在下一個(gè)中斷周期內負責數據事務(wù)處理。如果p = 1,則主結構和備用結構的作用互換。當僅有主結構處于基本DMA模式時(shí),在DMA事務(wù)處理期間對DMA結構的修改會(huì )失敗。乒乓模式使得CPU能夠訪(fǎng)問(wèn)和寫(xiě)入備用DMA結構,而DMA控制器可以讀取主結構,反之亦然。如圖7b所示,由于DMA的結構配置是在最后一個(gè)周期內完成的,因此在DRDY信號從ADC傳送至MCU后DMA數據事務(wù)處理可以被立即執行,使得CPU和DMA同時(shí)工作而無(wú)需等待?,F在,ADC的ODR得到了提升空間,因為總的工作時(shí)間已大大縮短。
圖7. (a)基本模式DMA和(b)乒乓模式的時(shí)間圖。
中斷處理程序的優(yōu)化
兩次DRDY信號之間的時(shí)間間隔不僅包括了中斷回調函數的命令執行時(shí)間,還包括了ADI的GPIO中斷處理函數的命令執行時(shí)間。
當MCU啟動(dòng)時(shí),CPU會(huì )運行啟動(dòng)文件(即startup.s)。所有事件的處理函數均在該文件中定義,包括GPIO中斷處理函數。一旦觸發(fā)GPIO中斷,CPU就會(huì )執行中斷處理函數(即ADI的GPIO驅動(dòng)程序中的GPIO_A_INT_HANDLER和GPIO_B_INT_HANDLER)。通用的中斷處理函數會(huì )在所有的GPIO引腳中搜索觸發(fā)中斷的引腳并清零其中斷狀態(tài)、運行回調函數。由于DRDY是本文應用的唯一中斷信號,因此可以對函數進(jìn)行簡(jiǎn)化以加快進(jìn)程??蛇x的解決方案包括(1)在啟動(dòng)文件中重新定位目標,以及(2)修改原始的中斷處理函數。重新定位目標意味著(zhù)自定義中斷處理函數,并替換啟動(dòng)文件中的原始的中斷處理函數。
而修改原始的中斷處理函數只需要添加一個(gè)自定義的GPIO驅動(dòng)程序。本文采用第二種方案修改原始的中斷處理函數,如圖8所示。該方案只將連接至DRDY的GPIO的引腳中斷狀態(tài)清零,并直接轉到回調函數。請注意,這里需要通過(guò)取消選擇build target中關(guān)于原始GPIO驅動(dòng)函數的勾選框內容來(lái)隔離原始的GPIO驅動(dòng)程序。
圖8. 嵌套矢量中斷控制器(NVIC)。
結果
速率性能
假定現在需要讀取200個(gè)24位的ADC輸出數據,并且SPI位速率設置為13 MHz。將DRDY信號和SCLK信號的引腳連接至示波器,可以通過(guò)觀(guān)察DRDY信號與SPI數據事務(wù)處理(亦即DMA事務(wù)處理)啟動(dòng)之間的時(shí)間間隔的方法可以量化本文所述的每種方法對速率的改善程度。這里將DRDY信號至SCLK信號開(kāi)始的時(shí)間間隔記為?t,那么對于13 MHz的SPI速率,測量得出的?t為:
(a)基本模式DMA Δt = 3.754 μs
(b)乒乓模式DMA Δt = 2.8433 μs
(c)乒乓模式DMA(使用優(yōu)化的中斷處理函數)Δt = 1.694 μs
方法(a)和(b)可支持64 kHz的ODR,而方法(c)可支持128 kHz的ODR。這是因為方法(c)的?t最短,從而使得SCLK信號能夠更早結束。如果SCLK信號(即數據事務(wù)處理)能在T/2之前完成(T為當前ADC的數據輸出周期),則ODR可實(shí)現翻倍。這較之于原始的ADISPI驅動(dòng)程序可以達到的8 kHz的ODR性能是一次巨大的進(jìn)步。
圖9. (a)基本模式DMA、(b)乒乓模式以及(c)乒乓模式(使用優(yōu)化的中斷處理函數)的Δt。
使用MAX32660控制AD7768-1
使用主時(shí)鐘速率為96 MHz的MCU MAX32660控制AD7768-1)時(shí)的結果如何?在該情況下,使用優(yōu)化的中斷處理函數的中斷設置,可在不使用DMA函數的情況下實(shí)現256 kHz的數據輸出速率。參見(jiàn)圖10。
圖10. 不使用DMA時(shí)MAX32660的ODR。
結論
本文利用選定的ADC(AD7768-1)和MCU(ADuCM4050或MAX32660)通過(guò)SPI實(shí)現了高速的數據事務(wù)處理。為實(shí)現速率優(yōu)化的目標,本文簡(jiǎn)化了ADI的SPI驅動(dòng)程序執行數據事務(wù)處理。此外本文提出,激活DMA控制器釋放內核也可以加快連續數據事務(wù)處理的流程。在DMA的乒乓模式下,DMA的配置時(shí)間可通過(guò)適當的調度來(lái)節省。在此基礎上,還可以通過(guò)直接指定中斷引腳的方式優(yōu)化中斷處理函數。在13 MHz的SPI位速率下,本文提出的方案的最佳性能可達到128 kSPS的ADC ODR。
表5. 使用ADuCM405和MAX32660實(shí)現的高速SPI連接
致謝
在編寫(xiě)本文的過(guò)程中,我們獲得了許多支持和幫助。
首先我們要感謝Charles Lee為我們提供了寶貴的硬件設計經(jīng)驗、軟件支持以及調試技巧等專(zhuān)業(yè)知識。
我們還要感謝我們的導師William Chen給予我們的技術(shù)支持。
最后,我們要感謝Frank Chang與我們分享了自身職業(yè)生涯中的許多技術(shù)經(jīng)驗。
免責聲明:本文為轉載文章,轉載此文目的在于傳遞更多信息,版權歸原作者所有。本文所用視頻、圖片、文字如涉及作品版權問(wèn)題,請聯(lián)系小編進(jìn)行處理。
推薦閱讀: