<li id="wkceg"></li>
<rt id="wkceg"><delect id="wkceg"></delect></rt>
<bdo id="wkceg"></bdo>
<strike id="wkceg"><acronym id="wkceg"></acronym></strike>

  • 帳號:
    密碼:
    智動化 / 文章 /

    優(yōu)化MCU SPI驅(qū)動程式實現(xiàn)高ADC吞吐率
    [作者 Denny Wang、Sally Tseng]   2023年06月29日 星期四 瀏覽人次: [5063]

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


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


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



    圖1 : 狀態(tài)監(jiān)測
    圖1 : 狀態(tài)監(jiān)測

    通用SPI驅(qū)動程式簡介

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


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



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

    設(shè)計思路與實踐架構(gòu)

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


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



    圖3 : 不同ODR以及DRDY與SCLK之間的關(guān)係
    圖3 : 不同ODR以及DRDY與SCLK之間的關(guān)係

    以MCU作為主機

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


    以ADC作為從機

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


    (表1)數(shù)據(jù)輸出速率的功耗模式配置

    功耗模式

    抽取係數(shù)

    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的連續(xù)讀取模式也是該產(chǎn)品的一個重要特性。ADC的輸出數(shù)據(jù)儲存在暫存器0x6C中。一般而言,每次讀/寫操作之前,ADC暫存器中的數(shù)據(jù)都需要位址才可以存取,但是連續(xù)讀取模式則支援在收到每個數(shù)據(jù)就緒訊號後直接從0x6C暫存器提取數(shù)據(jù)。ADC的輸出數(shù)據(jù)為24位元的數(shù)位訊號,對應(yīng)的電壓如表2所示。

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

    說明

    類比輸出電壓

    數(shù)位輸出碼

    +全擺幅–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組成的數(shù)據(jù)交易處理示例模型的接腳連接狀況,如圖4所示。


    ADC的重設(shè)訊號接腳RST_1連接至MCU的GPIO28,而數(shù)據(jù)就緒訊號接腳DRDY_1則連接至MCU的GPIO27。其餘接腳則根據(jù)通用的SPI配置標準進行連接,其中MCU為主機,而ADC為從機。SDI_1接收MCU發(fā)送的ADC暫存器讀/寫命令,而DOUT_1則將ADC的輸出數(shù)據(jù)發(fā)送至MCU。



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

    數(shù)據(jù)交易處理的實現(xiàn)

    中斷數(shù)據(jù)交易處理

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


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



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

    基本模式的DMA交易處理

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



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

    由於每個DMA交易處理只能發(fā)送固定的16位元數(shù)據(jù),因此SPI_CNT必須是2的倍數(shù)。本例設(shè)定SPI_CNT為4,以滿足ADC的24位元輸出數(shù)據(jù)要求。SPI_DMA暫存器為SPI的DMA致能暫存器,設(shè)定其值為0x5以使能DMA接收請求。命令pADI_DMA0->EN_SET=(1<<5)致能第五個通道的DMA,即SPI0 RX。


    (表3)DMA結(jié)構(gòu)暫存器

    名稱

    說明

    SRC_END_PTR

    來源端指針

    DST_END_PTR

    目標端指標

    CHNL_CFG

    控制數(shù)據(jù)配置

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

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

    暫存器

    說明

    DST_INC

    目標位址增量

    2位元組

    SRC_INC

    來源地址增量

    0

    SRC_SIZE

    來源地址增量

    2位元組

    N_minus_1

    目前DMS週期中的

    總傳輸次數(shù)- 1

    1 N = 2

    Cycle_ctrl

    DMA週期的工作模式

    基本模式

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

    乒乓模式的DMA交易處理

    在執(zhí)行偽讀取命令後,DMA控制器會開始數(shù)據(jù)交易處理,進而使得MCU的CPU處於空閒狀態(tài),而不處理任何任務(wù)。如果能夠讓CPU和DMA控制器同時工作,那麼任務(wù)處理就從串列模式轉(zhuǎn)變?yōu)閬K行模式。如此就可以同時進行DMA配置(透過CPU)以及DMA數(shù)據(jù)交易處理(透過DMA控制器)。


    為實現(xiàn)這一思路,需要設(shè)定DMA控制器處於乒乓模式。乒乓模式將兩組DMA結(jié)構(gòu)進行了整合:主結(jié)構(gòu)和備用結(jié)構(gòu)。每次DMA請求時,DMA控制器會在兩組結(jié)構(gòu)之間自動切換。變數(shù)p的初始設(shè)定為0,其值表示是主DMA結(jié)構(gòu)(p = 0)還是備用DMA結(jié)構(gòu)(p = 1)負責(zé)數(shù)據(jù)交易處理。


    如果p = 0,則在收到偽讀取命令時啟動主DMA結(jié)構(gòu)進行數(shù)據(jù)交易處理,同時會為備用DMA結(jié)構(gòu)分配值,使其在下一個中斷週期內(nèi)負責(zé)數(shù)據(jù)交易處理。如果p = 1,則主結(jié)構(gòu)和備用結(jié)構(gòu)的作用互換。當(dāng)僅有主結(jié)構(gòu)處於基本DMA模式時,在DMA交易處理期間對DMA結(jié)構(gòu)的修改會失敗。乒乓模式使得CPU能夠存取和寫入備用DMA結(jié)構(gòu),而DMA控制器可以讀取主結(jié)構(gòu),反之亦然。


    如圖7b所示,由於DMA的結(jié)構(gòu)配置是在最後一個週期內(nèi)完成的,因此在DRDY訊號從ADC傳送至MCU後DMA數(shù)據(jù)交易處理可以被立即執(zhí)行,使得CPU和DMA同時工作而無需等待。現(xiàn)在,ADC的ODR得到了提升空間,因為整體工作時間已大幅縮短。



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

    中斷處理常式的優(yōu)化

    兩次DRDY訊號之間的時間間隔不僅包括了中斷回呼函數(shù)的命令執(zhí)行時間,還包括了ADI的GPIO中斷處理函數(shù)的命令執(zhí)行時間。


    當(dāng)MCU啟動時,CPU會運行開機檔案(即startup.s)。所有事件的處理函數(shù)均在該檔中定義,包括GPIO中斷處理函數(shù)。一旦觸發(fā)GPIO中斷,CPU就會執(zhí)行中斷處理函數(shù)(即ADI的GPIO驅(qū)動程式中的GPIO_A_INT_HANDLER和GPIO_B_INT_HANDLER)。通用的中斷處理函數(shù)會在所有的GPIO接腳中搜索觸發(fā)中斷的接腳並清零其中斷狀態(tài)、運行回呼函數(shù)。


    由於DRDY是本文應(yīng)用的唯一中斷訊號,因此可以對函數(shù)進行簡化以加快進程。可選的解決方案包括:(1)在開機檔案中重新定位目標;(2)修改原始的中斷處理函數(shù)。重新定位目標表示自訂中斷處理函數(shù),並替換開機檔案中的原始的中斷處理函數(shù)。


    而修改原始的中斷處理函數(shù)只需要增加一個自訂的GPIO驅(qū)動程式。本文採用第二種方案修改原始的中斷處理函數(shù),如圖8所示。該方案只將連接至DRDY的GPIO的接腳中斷狀態(tài)清零,並直接轉(zhuǎn)到回呼函數(shù)。請注意,這裡需要透過取消選擇build target中關(guān)於原始GPIO驅(qū)動函數(shù)的勾選框內(nèi)容來隔離原始的GPIO驅(qū)動程式。



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

    結(jié)果

    速率性能


    假定現(xiàn)在需要讀取200個24位元的ADC輸出數(shù)據(jù),並且SPI位元速率設(shè)定為13 MHz。將DRDY訊號和SCLK訊號的接腳連接至示波器,則能透過觀察DRDY訊號與SPI數(shù)據(jù)交易處理(亦即DMA交易處理)啟動之間的時間間隔方法,量化本文所述的每種方法對速率的改善程度。這裡將DRDY訊號至SCLK訊號開始的時間間隔記為?t,那麼對於13 MHz的SPI速率,測量得出的?t為:


    ? (a)基本模式DMA Δt = 3.754 μs


    ? (b)乒乓模式DMA Δt = 2.8433 μs


    ? (c)乒乓模式DMA(使用優(yōu)化的中斷處理函數(shù))Δt = 1.694 μs


    方法(a)和(b)可支援64 kHz的ODR,而方法(c)可支援128 kHz的ODR。這是因為方法(c)的?t最短,進而使得SCLK訊號能夠更早結(jié)束。如果SCLK訊號(即數(shù)據(jù)交易處理)能在T/2之前完成(T為目前ADC的數(shù)據(jù)輸出週期),則ODR可實現(xiàn)翻倍。這相對於原始的ADISPI驅(qū)動程式可以達到的8 kHz的ODR性能是一次巨大的進步。



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

    使用MAX32660控制AD7768-1

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



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

    結(jié)論

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


    在DMA的乒乓模式下,DMA的配置時間可透過適當(dāng)?shù)恼{(diào)度來節(jié)省。在此基礎(chǔ)上,還可透過直接指定中斷接腳的方式優(yōu)化中斷處理函數(shù)。在13 MHz的SPI位元速率下,本文提出之方案的最佳性能可達到128 kSPS的ADC ODR。


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

    ?

    ADuCM4050(MCU)

    MAX32660(MCU)

    數(shù)據(jù)交易處理

    未經(jīng)優(yōu)化的中斷

    基本模式DMA

    乒乓模式DMA

    經(jīng)優(yōu)化的中斷

    經(jīng)優(yōu)化的中斷

    匯流排類型

    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

    數(shù)據(jù)輸出速率

    8 kSPS

    32 kSPS

    64 kSPS

    128 kSPS

    256 kSPS


    (本文作者Denny Wang、Sally Tseng為ADI應(yīng)用工程師)


    相關(guān)文章
    ? 以馬達控制器ROS1驅(qū)動程式實現(xiàn)機器人作業(yè)系統(tǒng)
    ? 意法半導(dǎo)體的邊緣AI永續(xù)發(fā)展策略:超越MEMS迎接真正挑戰(zhàn)
    ? 探討用於工業(yè)馬達控制的CANopen 協(xié)定
    ? 確保機器人的安全未來:資安的角色
    ? 智慧型無線工業(yè)感測器之設(shè)計指南
    comments powered by Disqus
      相關(guān)新聞
    » 意法半導(dǎo)體推出新款車用高電流、低電壓切換式穩(wěn)壓器,有效支援各類嚴苛負載
    » 臺達電子公佈一百一十四年六月份營收 單月合併營收新臺幣422.08億元
    » 臺達能源與欣銓科技合作小水力轉(zhuǎn)供 助半導(dǎo)體大廠布局多元再生能源
    » 新唐科技的 NPCM8mnx BMC 晶片通過 OCP S.A.F.E. 安全認證
    » 臺達攜手珍古德協(xié)會與海科館 三方合作推動珊瑚復(fù)育教育
      相關(guān)產(chǎn)品
    » 意法半導(dǎo)體推出車用閘極驅(qū)動器 強化電動車動力系統(tǒng)的效能與擴充彈性
    » 意法半導(dǎo)體推出適用於數(shù)位鑰匙應(yīng)用的新一代車用 NFC 讀寫器 擴展 ST25R 高效能產(chǎn)品系列
    » 適用于高頻功率應(yīng)用的 IXD2012NTR 高壓側(cè)和低壓側(cè)柵極驅(qū)動器
    » KSC XA輕觸開關(guān)提供聲音柔和的輕觸回饋,增強用戶體驗
    » 首款採用 DO-214AB 緊湊型封裝的 2kA 保護晶閘管

    ?
    刊登廣告 新聞信箱 讀者信箱 著作權(quán)聲明 隱私權(quán)聲明 本站介紹

    Copyright ©1999-2025 遠播資訊股份有限公司版權(quán)所有 Powered by O3
    地址:臺北數(shù)位產(chǎn)業(yè)園區(qū)(digiBlock Taipei) 103臺北市大同區(qū)承德路三段287-2號A棟204室
    電話 (02)2585-5526 #0 轉(zhuǎn)接至總機 / E-Mail: webmaster@hope.com.tw
    主站蜘蛛池模板: 岚皋县| 凤阳县| 小金县| 宾阳县| 轮台县| 宁武县| 五寨县| 屯留县| 皋兰县| 射洪县| 广东省| 巩义市| 常宁市| 安岳县| 天长市| 富宁县| 岗巴县| 武宁县| 武乡县| 漳州市| 五家渠市| 武宁县| 和林格尔县| 景德镇市| 三门县| 寿宁县| 凉山| 重庆市| 永康市| 平凉市| 洪洞县| 乌什县| 紫金县| 沐川县| 仁寿县| 名山县| 奇台县| 华坪县| 扶沟县| 山西省| 福泉市|