账号:
密码:
最新动态
产业快讯
CTIMES / 文章 /
优化MCU SPI驱动程式实现高ADC吞吐率
 

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

浏览人次:【2704】

本文描述设计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应用工程师)
相关文章
具备超载保护USB 供电ISM无线通讯
以GMSL取代GigE Vision的相机应用方案
运用PassThru技术延长储能系统寿命
巨磁阻多圈位置感测器的磁体设计
ST以MCU创新应用技术潮流 打造多元解决方案
comments powered by Disqus
相关讨论
  相关新闻
» 贸泽电子2024年第一季度推出逾10,000项新元件
» 宜特2024年第一季合并营收突破10亿元 展现验证分析布局力道
» SAP加速AI驱动供应链创新 推动制造业转型
» 宇瞻迈入绿色显示市场 成功开发胆固醇液晶全彩电子纸
» 调研:2024年中国ADAS市场迈向Level 3自动驾驶


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

Copyright ©1999-2024 远播信息股份有限公司版权所有 Powered by O3  v3.20.1.HK84R8DN5C4STACUKZ
地址:台北数位产业园区(digiBlock Taipei) 103台北市大同区承德路三段287-2号A栋204室
电话 (02)2585-5526 #0 转接至总机 /  E-Mail: webmaster@ctimes.com.tw