帳號:
密碼:
最新動態
產業快訊
CTIMES / 文章 /
優化MCU SPI驅動程式實現高ADC吞吐率
 

【作者: Denny Wang、Sally Tseng】   2023年06月29日 星期四

瀏覽人次:【3811】

本文描述設計MCU和ADC之間的高速串列周邊介面(SPI)關於數據交易處理驅動程式的流程,並介紹優化SPI驅動程式的不同方法及其ADC與MCU配置等,以及展示在不同MCU中使用相同驅動程式時ADC的吞吐率。


隨著技術的進步,低功耗物聯網(IoT)和邊緣/雲端運算需要更精準的數據傳輸。圖1展示的無線監測系統是一個具有24位元類比數位轉換器(ADC)的高精度數據擷取系統。在此我們通常會遇到的問題,即微控制單元(MCU)能否為數據轉換器提供高速的序列介面。


本文描述了設計MCU和ADC之間的高速串列周邊介面(SPI)關於數據交易處理驅動程式的流程,並介紹優化SPI驅動程式的不同方法及其ADC與MCU配置,以及SPI和直接記憶體存取(DMA)關於數據交易處理的示例代碼,最後展示在不同MCU中使用相同驅動程式時ADC的吞吐率。



圖1 : 狀態監測
圖1 : 狀態監測

通用SPI驅動程式簡介

通常,MCU廠商會在常式代碼中提供通用的SPI驅動程式/API。通用SPI驅動程式/API通常可以涵蓋大多數用戶的應用,這些代碼可能包含許多配置或判斷語句。


然而在某些特定情況下,例如ADC資料擷取,通用的SPI驅動程式可能無法滿足ADC數據的全速的吞吐率需求,因為通用的驅動程式中有過多的配置,而未使用的配置會產生額外的開銷並導致時間延遲。



圖2 : 通用API的配置
圖2 : 通用API的配置

設計思路與實踐架構

我們通常會選擇低功耗高性能的MCU作為主機透過SPI擷取ADC的輸出數據。但是,由於ADI的SPI驅動程式的數據交易處理命令存在冗餘,因此數據輸出速率可能被明顯降低。


為了充分釋放ADC的潛在速率,本文使用ADuCM4050和AD7768-1進行實驗並嘗試可能的解決方案。儘管在使用預設濾波器的情況下,ADuCM4050的最大數據輸出速率可達256 kHz,但在目前的情況下,其速率被限制在8 kHz。提高輸出速率的潛在解決方案包括刪除不必要的命令以及啟動DMA控制器。以下將介紹這些思路。



圖3 : 不同ODR以及DRDY與SCLK之間的關係
圖3 : 不同ODR以及DRDY與SCLK之間的關係

以MCU作為主機

ADuCM4050 MCU為一款主時脈速率為26 MHz的超低功耗微控制器,核心為ARMR CortexR-M4F處理器。ADuCM4050配有三個SPI,每個SPI都有兩個DMA通道(接收和發射通道)可與DMA控制器連接。DMA控制器和DMA通道可實現記憶體與周邊之間的數據傳輸。這是一種高效的數據分配方法,可將核心釋放以處理其他任務。


以ADC作為從機

AD7768-1為一款24位元低功耗、高性能的Σ-Δ ADC。其數據輸出速率(ODR)和功耗模式均可根據使用者的要求進行配置。ODR由抽取係數和功耗模式共同決定,如表1中所示。


(表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

AD7768-1的連續讀取模式也是該產品的一個重要特性。ADC的輸出數據儲存在暫存器0x6C中。一般而言,每次讀/寫操作之前,ADC暫存器中的數據都需要位址才可以存取,但是連續讀取模式則支援在收到每個數據就緒訊號後直接從0x6C暫存器提取數據。ADC的輸出數據為24位元的數位訊號,對應的電壓如表2所示。

(表2)數位輸出碼和類比輸入電壓

說明

類比輸出電壓

數位輸出碼

+全擺幅–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。



圖4 : AD7768-1和ADuCM4050的介面接腳連接
圖4 : AD7768-1和ADuCM4050的介面接腳連接

數據交易處理的實現

中斷數據交易處理

為實現連續數據交易處理,本文將MCU的GPIO27接腳(連接至ADC的DRDY_1接腳)用於中斷觸發接腳。ADC將數據就緒訊號發送至GPIO27時會觸發MCU包含數據交易處理命令的中斷回呼函數。如圖5所示,數據擷取必須在中斷A和中斷B之間的時間間隔內進行。


利用ADI的SPI驅動程式可以在ADC和MCU之間輕鬆實現數據交易處理。但是,由於驅動程式記憶體在冗餘命令,ADC的ODR會被限制在8 kHz。本文盡可能精簡了代碼以加快ODR,將介紹實現DMA數據交易處理的兩種方法:基本模式的DMA交易處理和乒乓模式的DMA交易處理。



圖5 : 兩次中斷的時間間隔
圖5 : 兩次中斷的時間間隔

基本模式的DMA交易處理

在實現每個DMA交易處理之前需要對SPI和DMA進行配置(參見圖6中的示例代碼)。SPI_CTL為SPI配置,其值為0x280f,源於ADI的SPI驅動程式的設定值。SPI_CNT為傳輸位元組數。



圖6 : 基本DMA交易處理模式的代碼
圖6 : 基本DMA交易處理模式的代碼

由於每個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。


(表3)DMA結構暫存器

名稱

說明

SRC_END_PTR

來源端指針

DST_END_PTR

目標端指標

CHNL_CFG

控制數據配置

每個DMA通道都有一個DMA結構暫存器,如表3中所示。需要指出的是,這裡的數據來源位址的結尾(即SPI0 Rx,亦即來源端指標SRC_END_PTR)在整個操作期間無需增加,因為Rx FIFO會自動將暫存器中的數據推送出去。另一方面,數據目標位址的結尾(即目標端指標DST_END_PTR)根據ADI的SPI驅動程式的使用函數計算得出,即目標位址+ SPI_CNT -2。 目前位址為內部陣列緩衝區的位址。DMA控制數據配置CHNL_CFG包括來來源數據大小、來源位址增量、目標位址增量、剩餘傳輸次數和DMA控制模式等設定,其值0x4D000011按照表4中所述的設定配置。

(表4)控制數據配置0x4D00011的DMA配置

暫存器

說明

DST_INC

目標位址增量

2位元組

SRC_INC

來源地址增量

0

SRC_SIZE

來源地址增量

2位元組

N_minus_1

目前DMS週期中的

總傳輸次數- 1

1 N = 2

Cycle_ctrl

DMA週期的工作模式

基本模式

SCLK時脈透過偽讀取命令SPI_SPI0 -> RX啟動,輸出數據透過MISO從ADC傳至MCU。MOSI上其它的數據傳輸可以忽略不計。一旦完成Rx的FIFO填充,DMA請求就會產生進而啟動DMA控制器,以將數據從DMA來源位址(即SPI0 Rx FIFO)傳輸至DMA目標位址(即內部陣列的緩衝區)。值得注意的是,SPI_DMA=0x3時會產生Tc請求。 最後,透過將目前目標位址加4的方式,將目標位址用於下一個4位元組的傳輸。 請注意,SPI0 DMA通道的pADI_DMA0->DSTADDR_CLR和pADI_DMA0->RMSK_CLR必須在首次中斷觸發之前在主函數中設定。前一個為DMA通道目標位址減量致能清零暫存器,用於在增量模式下設定每次DMA傳輸後的目標位址移位(目標位址計算函數僅在增量模式下有效)。後一個為DMA通道請求遮罩清零暫存器,用於將通道的DMA請求狀態清零。 基本模式的DMA交易處理時間圖如圖7a所示。圖中三個時隙分別代表DRDY訊號、SPI/DMA設定和DMA數據交易處理。在該模式中,CPU的閒置時間較多,因此希望DMA控制器在處理數據傳輸時能將任務分配給CPU。

乒乓模式的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得到了提升空間,因為整體工作時間已大幅縮短。



圖7 : (a)基本模式DMA和(b)乒乓模式的時間圖
圖7 : (a)基本模式DMA和(b)乒乓模式的時間圖

中斷處理常式的優化

兩次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驅動程式。



圖8 : 嵌套向量中斷控制器(NVIC)
圖8 : 嵌套向量中斷控制器(NVIC)

結果

速率性能


假定現在需要讀取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性能是一次巨大的進步。



圖9 : (a)基本模式DMA、(b)乒乓模式,以及(c)乒乓模式(使用優化的中斷處理函數)的Δt
圖9 : (a)基本模式DMA、(b)乒乓模式,以及(c)乒乓模式(使用優化的中斷處理函數)的Δt

使用MAX32660控制AD7768-1

使用主時脈速率為96 MHz的MCU MAX32660控制AD7768-1)時的結果如何?在該情況下,使用優化的中斷處理函數的中斷設定,可在不使用DMA函數的情況下實現256 kHz的數據輸出速率。參見圖10。



圖10 : 不使用DMA時MAX32660的ODR
圖10 : 不使用DMA時MAX32660的ODR

結論

本文利用選定的ADC(AD7768-1)和MCU(ADuCM4050或MAX32660)透過SPI實現了高速的數據交易處理。為實現速率優化的目標,本文簡化ADI的SPI驅動程式執行數據交易處理;此外,並提出啟動DMA控制器釋放核心,也可加快連續數據交易處理的流程。


在DMA的乒乓模式下,DMA的配置時間可透過適當的調度來節省。在此基礎上,還可透過直接指定中斷接腳的方式優化中斷處理函數。在13 MHz的SPI位元速率下,本文提出之方案的最佳性能可達到128 kSPS的ADC ODR。


(表5) 高速SPI連接實現ADuCM405和MAX32660

?

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應用工程師)


相關文章
意法半導體的邊緣AI永續發展策略:超越MEMS迎接真正挑戰
為嵌入式系統注入澎湃動力 開啟高效能新紀元
探討用於工業馬達控制的CANopen 協定
確保機器人的安全未來:資安的角色
智慧型無線工業感測器之設計指南
comments powered by Disqus
相關討論
  相關新聞
» 用生成式AI教機器狗跑酷 讓機器人表現更上一層樓
» 安森美與伍爾特電子攜手 升級高精度電力電子應用虛擬設計
» 微軟啟動「AI+ Taiwan」計畫 在台資料中心正式啟用
» 科盛科技於印尼雅加達設立新據點 深耕東南亞市場
» 經濟部深化跨國夥伴互利模式 電子資訊採購連5年破2千億美元


刊登廣告 新聞信箱 讀者信箱 著作權聲明 隱私權聲明 本站介紹

Copyright ©1999-2024 遠播資訊股份有限公司版權所有 Powered by O3  v3.20.2048.3.143.218.231
地址:台北數位產業園區(digiBlock Taipei) 103台北市大同區承德路三段287-2號A棟204室
電話 (02)2585-5526 #0 轉接至總機 /  E-Mail: webmaster@ctimes.com.tw