本文描述設計MCU和ADC之間的高速串列周邊介面(SPI)關於數據交易處理驅動程式的流程,並介紹優化SPI驅動程式的不同方法及其ADC與MCU配置等,以及展示在不同MCU中使用相同驅動程式時ADC的吞吐率。
隨著技術的進步,低功耗物聯網(IoT)和邊緣/雲端運算需要更精準的數據傳輸。圖1展示的無線監測系統是一個具有24位元類比數位轉換器(ADC)的高精度數據擷取系統。在此我們通常會遇到的問題,即微控制單元(MCU)能否為數據轉換器提供高速的序列介面。
本文描述了設計MCU和ADC之間的高速串列周邊介面(SPI)關於數據交易處理驅動程式的流程,並介紹優化SPI驅動程式的不同方法及其ADC與MCU配置,以及SPI和直接記憶體存取(DMA)關於數據交易處理的示例代碼,最後展示在不同MCU中使用相同驅動程式時ADC的吞吐率。
|
通用SPI驅動程式簡介
通常,MCU廠商會在常式代碼中提供通用的SPI驅動程式/API。通用SPI驅動程式/API通常可以涵蓋大多數用戶的應用,這些代碼可能包含許多配置或判斷語句。
然而在某些特定情況下,例如ADC資料擷取,通用的SPI驅動程式可能無法滿足ADC數據的全速的吞吐率需求,因為通用的驅動程式中有過多的配置,而未使用的配置會產生額外的開銷並導致時間延遲。
|
設計思路與實踐架構
我們通常會選擇低功耗高性能的MCU作為主機透過SPI擷取ADC的輸出數據。但是,由於ADI的SPI驅動程式的數據交易處理命令存在冗餘,因此數據輸出速率可能被明顯降低。
為了充分釋放ADC的潛在速率,本文使用ADuCM4050和AD7768-1進行實驗並嘗試可能的解決方案。儘管在使用預設濾波器的情況下,ADuCM4050的最大數據輸出速率可達256 kHz,但在目前的情況下,其速率被限制在8 kHz。提高輸出速率的潛在解決方案包括刪除不必要的命令以及啟動DMA控制器。以下將介紹這些思路。
|
以MCU作為主機
ADuCM4050 MCU為一款主時脈速率為26 MHz的超低功耗微控制器,核心為ARMR CortexR-M4F處理器。ADuCM4050配有三個SPI,每個SPI都有兩個DMA通道(接收和發射通道)可與DMA控制器連接。DMA控制器和DMA通道可實現記憶體與周邊之間的數據傳輸。這是一種高效的數據分配方法,可將核心釋放以處理其他任務。
以ADC作為從機
AD7768-1為一款24位元低功耗、高性能的Σ-Δ ADC。其數據輸出速率(ODR)和功耗模式均可根據使用者的要求進行配置。ODR由抽取係數和功耗模式共同決定,如表1中所示。
|
功耗模式 |
抽取係數 |
OOR |
|
快速功耗(MCLK/2) |
×32 |
256 kHz |
|
快速功耗(MCLK/2) |
×64 |
128 kHz |
|
中速功耗(MCLK/4) |
×32 |
128 kHz |
|
中速功耗(MCLK/4) |
×64 |
64 kHz |
|
低速功耗(MCLK/16) |
×32 |
32 kHz |
|
低速功耗(MCLK/16) |
×64 |
16 kHz |
|
說明 |
類比輸出電壓 |
數位輸出碼 |
|
+全擺幅–1 LSB |
+4.095999512 V |
0x7FFFFF |
|
中間位準+1 LSB |
+488 nV |
0x000001 |
|
中間位準 |
0 V |
0x000000 |
|
中間位準-1 LSB |
–488 nV |
0xFFFFFF |
|
-全擺幅–1 LSB |
–4.095999512 V |
0x800001 |
|
-全擺幅 |
+4.096 V |
0x800000 |
接腳連接示意圖
ADuCM4050和AD7768-1組成的數據交易處理示例模型的接腳連接狀況,如圖4所示。
ADC的重設訊號接腳RST_1連接至MCU的GPIO28,而數據就緒訊號接腳DRDY_1則連接至MCU的GPIO27。其餘接腳則根據通用的SPI配置標準進行連接,其中MCU為主機,而ADC為從機。SDI_1接收MCU發送的ADC暫存器讀/寫命令,而DOUT_1則將ADC的輸出數據發送至MCU。
|
數據交易處理的實現
中斷數據交易處理
為實現連續數據交易處理,本文將MCU的GPIO27接腳(連接至ADC的DRDY_1接腳)用於中斷觸發接腳。ADC將數據就緒訊號發送至GPIO27時會觸發MCU包含數據交易處理命令的中斷回呼函數。如圖5所示,數據擷取必須在中斷A和中斷B之間的時間間隔內進行。
利用ADI的SPI驅動程式可以在ADC和MCU之間輕鬆實現數據交易處理。但是,由於驅動程式記憶體在冗餘命令,ADC的ODR會被限制在8 kHz。本文盡可能精簡了代碼以加快ODR,將介紹實現DMA數據交易處理的兩種方法:基本模式的DMA交易處理和乒乓模式的DMA交易處理。
![]()
|
基本模式的DMA交易處理
在實現每個DMA交易處理之前需要對SPI和DMA進行配置(參見圖6中的示例代碼)。SPI_CTL為SPI配置,其值為0x280f,源於ADI的SPI驅動程式的設定值。SPI_CNT為傳輸位元組數。
|
由於每個DMA交易處理只能發送固定的16位元數據,因此SPI_CNT必須是2的倍數。本例設定SPI_CNT為4,以滿足ADC的24位元輸出數據要求。SPI_DMA暫存器為SPI的DMA致能暫存器,設定其值為0x5以使能DMA接收請求。命令pADI_DMA0->EN_SET=(1<<5)致能第五個通道的DMA,即SPI0 RX。
|
名稱 |
說明 |
|
SRC_END_PTR |
來源端指針 |
|
DST_END_PTR |
目標端指標 |
|
CHNL_CFG |
控制數據配置 |
|
暫存器 |
說明 |
值 |
|
DST_INC |
目標位址增量 |
2位元組 |
|
SRC_INC |
來源地址增量 |
0 |
|
SRC_SIZE |
來源地址增量 |
2位元組 |
|
N_minus_1 |
目前DMS週期中的 總傳輸次數- 1 |
1 (N = 2) |
|
Cycle_ctrl |
DMA週期的工作模式 |
基本模式 |
乒乓模式的DMA交易處理
在執行偽讀取命令後,DMA控制器會開始數據交易處理,進而使得MCU的CPU處於空閒狀態,而不處理任何任務。如果能夠讓CPU和DMA控制器同時工作,那麼任務處理就從串列模式轉變為並行模式。如此就可以同時進行DMA配置(透過CPU)以及DMA數據交易處理(透過DMA控制器)。
為實現這一思路,需要設定DMA控制器處於乒乓模式。乒乓模式將兩組DMA結構進行了整合:主結構和備用結構。每次DMA請求時,DMA控制器會在兩組結構之間自動切換。變數p的初始設定為0,其值表示是主DMA結構(p = 0)還是備用DMA結構(p = 1)負責數據交易處理。
如果p = 0,則在收到偽讀取命令時啟動主DMA結構進行數據交易處理,同時會為備用DMA結構分配值,使其在下一個中斷週期內負責數據交易處理。如果p = 1,則主結構和備用結構的作用互換。當僅有主結構處於基本DMA模式時,在DMA交易處理期間對DMA結構的修改會失敗。乒乓模式使得CPU能夠存取和寫入備用DMA結構,而DMA控制器可以讀取主結構,反之亦然。
如圖7b所示,由於DMA的結構配置是在最後一個週期內完成的,因此在DRDY訊號從ADC傳送至MCU後DMA數據交易處理可以被立即執行,使得CPU和DMA同時工作而無需等待。現在,ADC的ODR得到了提升空間,因為整體工作時間已大幅縮短。
|
中斷處理常式的優化
兩次DRDY訊號之間的時間間隔不僅包括了中斷回呼函數的命令執行時間,還包括了ADI的GPIO中斷處理函數的命令執行時間。
當MCU啟動時,CPU會運行開機檔案(即startup.s)。所有事件的處理函數均在該檔中定義,包括GPIO中斷處理函數。一旦觸發GPIO中斷,CPU就會執行中斷處理函數(即ADI的GPIO驅動程式中的GPIO_A_INT_HANDLER和GPIO_B_INT_HANDLER)。通用的中斷處理函數會在所有的GPIO接腳中搜索觸發中斷的接腳並清零其中斷狀態、運行回呼函數。
由於DRDY是本文應用的唯一中斷訊號,因此可以對函數進行簡化以加快進程。可選的解決方案包括:(1)在開機檔案中重新定位目標;(2)修改原始的中斷處理函數。重新定位目標表示自訂中斷處理函數,並替換開機檔案中的原始的中斷處理函數。
而修改原始的中斷處理函數只需要增加一個自訂的GPIO驅動程式。本文採用第二種方案修改原始的中斷處理函數,如圖8所示。該方案只將連接至DRDY的GPIO的接腳中斷狀態清零,並直接轉到回呼函數。請注意,這裡需要透過取消選擇build target中關於原始GPIO驅動函數的勾選框內容來隔離原始的GPIO驅動程式。
|
結果
速率性能
假定現在需要讀取200個24位元的ADC輸出數據,並且SPI位元速率設定為13 MHz。將DRDY訊號和SCLK訊號的接腳連接至示波器,則能透過觀察DRDY訊號與SPI數據交易處理(亦即DMA交易處理)啟動之間的時間間隔方法,量化本文所述的每種方法對速率的改善程度。這裡將DRDY訊號至SCLK訊號開始的時間間隔記為?t,那麼對於13 MHz的SPI速率,測量得出的?t為:
‧ (a)基本模式DMA Δt = 3.754 μs
‧ (b)乒乓模式DMA Δt = 2.8433 μs
‧ (c)乒乓模式DMA(使用優化的中斷處理函數)Δt = 1.694 μs
方法(a)和(b)可支援64 kHz的ODR,而方法(c)可支援128 kHz的ODR。這是因為方法(c)的?t最短,進而使得SCLK訊號能夠更早結束。如果SCLK訊號(即數據交易處理)能在T/2之前完成(T為目前ADC的數據輸出週期),則ODR可實現翻倍。這相對於原始的ADISPI驅動程式可以達到的8 kHz的ODR性能是一次巨大的進步。
![]()
|
使用MAX32660控制AD7768-1
使用主時脈速率為96 MHz的MCU MAX32660控制AD7768-1)時的結果如何?在該情況下,使用優化的中斷處理函數的中斷設定,可在不使用DMA函數的情況下實現256 kHz的數據輸出速率。參見圖10。
![]()
|
結論
本文利用選定的ADC(AD7768-1)和MCU(ADuCM4050或MAX32660)透過SPI實現了高速的數據交易處理。為實現速率優化的目標,本文簡化ADI的SPI驅動程式執行數據交易處理;此外,並提出啟動DMA控制器釋放核心,也可加快連續數據交易處理的流程。
在DMA的乒乓模式下,DMA的配置時間可透過適當的調度來節省。在此基礎上,還可透過直接指定中斷接腳的方式優化中斷處理函數。在13 MHz的SPI位元速率下,本文提出之方案的最佳性能可達到128 kSPS的ADC ODR。
|
? |
ADuCM4050(MCU) |
MAX32660(MCU) |
|||
|
數據交易處理 |
未經優化的中斷 |
基本模式DMA |
乒乓模式DMA |
經優化的中斷 |
經優化的中斷 |
|
匯流排類型 |
SPI |
SPI |
SPI |
SPI |
SPI |
|
主時脈速率 |
26 MHz |
26 MHz |
26 MHz |
26 MHz |
96 MHz |
|
DRDY與SCLK 之間的時間間隔 |
6.34 μs |
3.754 μs |
2.834 μs |
1.694 μs |
1.464 μs |
|
數據輸出速率 |
8 kSPS |
32 kSPS |
64 kSPS |
128 kSPS |
256 kSPS |
(本文作者Denny Wang、Sally Tseng為ADI應用工程師)




