高精度ADC的MultiSPI接口:从原理到多设备系统设计实战
2026/7/25 12:32:07 网站建设 项目流程

1. 项目概述与MultiSPI接口的价值

在搞高精度数据采集系统的时候,最头疼的往往不是ADC芯片本身的性能,而是怎么把那一大堆数据稳定、高效地从ADC“搬”到主控制器里。尤其是在多通道同步采集或者需要堆叠多个ADC以扩展通道数的场景下,传统的SPI总线就像一条单车道,设备一多,要么得拉一堆片选线,把MCU的GPIO口占得满满当当,布线复杂;要么就得用多级缓冲和复杂的仲裁逻辑,时序设计让人头大。我第一次用18位、1MSPS的ADC做多通道振动分析仪时,就卡在这里,为了同步四个通道,差点把PCB画成了蜘蛛网。

这时候,像TI的ADS891xB系列(包括ADS8910B/12B/14B)这类高精度SAR ADC提供的MultiSPI数字接口,就成了一剂“解药”。它绝不仅仅是在标准SPI(SCLK, SDI, SDO, CS)基础上多加了几个引脚那么简单。其核心价值在于,它通过硬件和协议层面的深度设计,原生支持了**菊花链(Daisy-Chain)星型(Star)**两种多设备拓扑,并且允许你通过配置寄存器,在标准SPI、带提前数据启动(Early Data Launch)的SPI以及源同步(Source-Synchronous)协议之间灵活切换。这意味着,你可以用最少的控制线(有时甚至只需要一组SPI总线加一个公共CONVST),就能串联或并联起多个ADC,实现数据的顺序或并行读取,系统架构一下子变得清爽许多。

理解MultiSPI,关键要跳出“点对点”通信的思维。它把每个ADC内部的数据输出寄存器(ODR)和输入数据寄存器(IDR)在特定配置下,合并成了一个22位的“统一移位寄存器(USR)”。这个USR才是MultiSPI的灵魂,它让多个ADC的寄存器在逻辑上首尾相连,形成一条很长的移位寄存器链。主机发出的时钟和命令,会像波浪一样依次经过链上的每一个ADC,每个ADC同时在自己的位置上进行移位操作。这种设计,使得无论是菊花链的串行数据流,还是星型拓扑的独立片选控制,都有了统一的硬件基础。对于需要精简布线、高通道密度,或者对多个ADC采样时刻有严格同步要求的系统(比如多相电流检测、超声成像通道),MultiSPI提供的是一种“鱼与熊掌可兼得”的优雅方案。

2. MultiSPI接口的硬件拓扑与连接解析

MultiSPI接口的灵活性,首先体现在硬件连接上。根据系统对引脚数量、同步性和吞吐率的不同要求,TI的文档里给出了三种典型的连接方式。吃透这三种方式,是正确进行系统设计的第一步。

2.1 单设备全功能连接:理解每个引脚的角色

当我们只使用一颗ADS891xB时,为了充分利用其所有数字接口功能,可以采用全引脚连接模式。这张连接图清晰地展示了每个引脚在系统中的作用域。

Host Controller TI Device (ADS891xB) CONVST -----------> CONVST (转换启动) SCLK -----------> SCLK (串行时钟) SDI -----------> SDI (串行数据输入) RST -----------> RST (复位,可选) CS -----------> CS (片选) SDO <---------- SDO-0 (串行数据输出-0) [可选隔离] SDO-1 (输出-1,悬空或接上拉) SDO-2 (输出-2,悬空或接上拉) SDO-3 (输出-3,悬空或接上拉) RVS <--- (Ready for Valid Sample, 可选状态监控)

这里有几个关键点需要展开:

  • CONVST (Conversion Start): 这是ADC采样的“发令枪”。其上升沿触发ADC内部采样保持电路对模拟输入进行采样,并启动转换过程。在多设备系统中,将所有ADC的CONVST连在一起,是实现硬件同步采样的关键。
  • RST (Reset): 异步复位引脚。拉低至少20ns可以强制器件复位到上电默认状态。在干扰严重的工业环境,我习惯上会通过一个GPIO控制它,而不是简单地拉到DVDD,这样在程序跑飞或通信异常时,能有一个硬件的“救命稻草”。
  • SDO-0 ~ SDO-3: 这是MultiSPI“宽总线”能力的体现。在标准SPI模式下,只有SDO-0是活跃的。但当你在SDO_CNTL寄存器中将SDO_WIDTH[1:0]设置为11b,并选择源同步协议(SDO_MODE[1:0] = 11b)时,这4个引脚会同时输出转换数据的不同比特位,从而实现最高4倍于SCLK的数据吞吐率。这在需要极高采样率的单通道应用中非常有用。
  • RVS (Ready for Valid Sample): 这是一个输出状态引脚。当ADC完成一次转换且数据已准备好被读取时,RVS会拉高。你可以把它接到MCU的中断引脚上,实现基于事件的数据读取,而不是死板的延时等待,能极大提高系统效率并降低CPU负载。

注意:即使在不使用SDO-1/2/3和RVS引脚时,也建议按照数据手册的说明,将它们连接到固定的逻辑电平(通常上拉到DVDD),避免浮空引入噪声或导致不必要的功耗。

2.2 单设备最小引脚连接:标准SPI的简洁实现

对于很多只需要基本功能、且对PCB面积和布线有严格限制的应用,最小引脚连接是最常用的方案。其核心思想是复用和固定连接,最大化精简线路。

Host Controller TI Device (ADS891xB) CONVST ----+----> CONVST | CS --------+----> CS SCLK -----------> SCLK SDI -----------> SDI SDO <----------- SDO-0 [RST] ----------> DVDD (通过电阻上拉) [SDO-1/2/3] ----- NC (无连接) [RVS] ---------- NC 或监控(可选)

这种模式下,CONVST直接与CS引脚短接。这意味着每次SPI通信帧的开始(CS下降沿)也同时启动了ADC转换。这种简化牺牲了转换启动时刻的灵活性(转换与通信绑定),但换来了最少的连线。RST引脚被上拉到DVDD(数字电源),禁用了硬件复位功能,复位只能通过上电或软件命令实现。

为什么可以这样连接?这得益于ADS891xB内部数字接口的状态机设计。当CS为低时,接口处于活跃状态,可以接收命令或输出数据。将CONVSTCS相连,相当于利用CS的下拉沿作为一个“自动”的转换启动信号。对于固定采样率的应用,这种连接非常高效。但如果你需要更复杂的采样时序,比如外部触发采样,或者希望转换和数据读取在时间上完全解耦,那么独立控制CONVST就是必须的。

2.3 多设备菊花链拓扑:串联的艺术

当系统需要多个ADC,且对同步采样有要求,但又希望最大限度地节省主机SPI接口和片选线时,菊花链拓扑是首选。它的连接方式有一种独特的美感。

Host Controller |--- CONVST ----+-----> CONVST of Device 1 ---> CONVST of Device 2 ... -> CONVST of Device N |--- SCLK ----+-----> SCLK of Device 1 ---> SCLK of Device 2 ... -> SCLK of Device N |--- CS ----+-----> CS of Device 1 ---> CS of Device 2 ... -> CS of Device N |--- SDO --------------------------------------+ |--- SDI ----+-----> SDI of Device 1 | | | +<---- SDO-0 of Device 1 --------+-> SDI of Device 2 | +<---- SDO-0 of Device 2 ----- ... -> SDI of Device N | +<---- SDO-0 of Device N ---> (回连至主机SDI)

核心原理:在菊花链模式下,你需要将每个ADC的SDO_CNTL寄存器中的SDO_CNT[7:0]设置为00h01h(即标准SPI或带Early Data Launch的SPI模式)。此时,每个ADC内部的22位输出数据寄存器(ODR)和输入数据寄存器(IDR)会“折叠”成一个22位的统一移位寄存器(USR)

当主机发出一个包含22 x N个SCLK时钟的通信帧时(N为链上ADC数量),神奇的事情发生了:在第一个时钟边沿,Device N的USR最高位(MSB)被移到其SDO-0,并进入Device N-1的SDI,作为Device N-1 USR新的最低位(LSB)。同时,Device N-1的MSB被移到Device N-2,依此类推。而主机SDI线上,最先收到的是链尾Device N的数据MSB,最后收到的是链首Device 1的数据LSB。

时序设计的坑:这里有一个至关重要的细节,也是我调试时踩过的雷。数据手册强调,最优的数据传输帧必须恰好包含22 x N个SCLK捕获边沿。如果帧长大于这个数,主机必须在CS拉高前,精心对齐每个设备的配置数据,否则后续的时钟可能会把配置字移出寄存器导致配置错误。如果帧长短于22 x N,那就更糟了,数据没有完全移出,必然导致配置错误和通信失败。所以,在初始化菊花链时,务必先通过短帧(例如只发22个时钟)单独配置每个ADC进入菊花链模式,然后再进行长帧操作。

2.4 多设备星型拓扑:并行与独立控制

如果应用场景需要同时读取多个ADC的数据,或者需要独立控制每个ADC的采样时刻,星型拓扑就更合适。它牺牲了引脚数量(需要多个CS线),但换来了更高的吞吐率和独立的设备控制能力。

Host Controller |--- CONVST ----+-----> CONVST of All Devices |--- SCLK ----+-----> SCLK of All Devices |--- SDO ----+-----> SDI of All Devices |--- SDI <---+-----+ SDO-0 of All Devices (所有ADC的SDO-0线“线与”在一起) |--- CS1 ----------> CS of Device 1 |--- CS2 ----------> CS of Device 2 |--- CSN ----------> CS of Device N

工作原理:所有ADC共享时钟(SCLK)、命令输入(SDI)和转换启动(CONVST)。但每个ADC有自己独立的片选线(CS1, CS2, ... CSN)。主机通过拉低某一个ADC的CS线,来激活与该ADC的通信。所有ADC的SDO-0输出引脚被连接在一起,形成一条共享的数据线回传给主机的SDI。

核心禁忌与解决方案:星型拓扑最大的风险是总线冲突。如果主机不小心同时拉低了两个ADC的CS线,它们的SDO-0输出会同时驱动共享数据线,造成信号冲突,可能损坏IO口或读取到乱码。因此,在软件驱动层必须严格保证,在任何时刻,有且仅有一个ADC的CS线处于有效(低电平)状态。一种稳健的做法是,在切换片选前,先确保所有CS线都处于无效(高电平)状态,等待一个短暂的稳定时间(例如1个SCLK周期),再拉低目标CS线。

拓扑选择的心得

  • 选菊花链:当你追求极致的布线简洁,ADC数量较多(比如超过4个),且系统对同步采样有严格要求,但允许数据按顺序串行输出时。典型应用是多通道同步数据记录仪。
  • 选星型拓扑:当系统需要最高的整体数据吞吐率(可以并行读取),或者需要对每个ADC进行完全独立的配置和读取操作时。典型应用是混合信号测试板卡,每个ADC可能连接不同的传感器,需要不同的采样率和配置。

3. 核心寄存器配置详解与实战策略

MultiSPI的强大功能,几乎都通过那9个配置寄存器来掌控。读懂了寄存器,你就拿到了驾驭这颗ADC的钥匙。下面我结合自己的调试经验,逐一拆解最关键的几个。

3.1 协议控制核心:SDI_CNTL与SDO_CNTL

这两个寄存器是定义通信“语言”的。SDI_CNTL决定主机如何向ADC写命令(配置),SDO_CNTL决定ADC如何向主机吐数据。

SDI_CNTL (地址 008h):这个寄存器很简单,只用最低2位SDI_MODE[1:0]。它设置的是写入数据时遵循的SPI模式,即时钟极性(CPOL)和时钟相位(CPHA)。

  • 00b: CPOL=0, CPHA=0。时钟空闲时为低电平,数据在SCLK的上升沿被ADC捕获(采样)。
  • 01b: CPOL=0, CPHA=1。时钟空闲时为低电平,数据在SCLK的下降沿被ADC捕获。
  • 10b: CPOL=1, CPHA=0。时钟空闲时为高电平,数据在SCLK的下降沿被捕获。
  • 11b: CPOL=1, CPHA=1。时钟空闲时为高电平,数据在SCLK的上升沿被捕获。

配置要点:这必须与你的主控制器(MCU/FPGA)的SPI主模式设置完全一致。大多数MCU的SPI模式0就对应00b。我建议在初始化阶段,先用模式0(00b)进行通信,因为它是最通用的模式。

SDO_CNTL (地址 00Ch):这个寄存器是重头戏,功能复杂得多。

  • SDO_MODE[1:0]:选择读取数据的协议。
    • 00b:SDO遵循SDI_CNTL中选择的SPI协议。这是最常用的标准模式。
    • 01b:在00b的基础上,启用“提前数据启动”(Early Data Launch)。这个功能是为了补偿从SDO引脚到主机SDI引脚之间的PCB走线延迟。启用后,ADC会在SCLK边沿之前提前一点时间更新SDO数据,确保主机在捕获边沿能采到稳定的数据。在SCLK频率很高(>20MHz)或走线较长时,这个功能能有效提高时序裕量。
    • 11b:源同步协议(Source-Synchronous)。这是高速模式,ADC会输出一个数据时钟(可能是SCLK的回声,也可能是内部时钟分频),数据在此时钟的双边沿(DDR)或单边沿(SDR)输出。在此模式下,SDO_WIDTH[1:0]DATA_RATE位才生效。
  • SDO_WIDTH[1:0]:设置输出总线宽度。仅在SDO_MODE=11b时有效。
    • 0xb:仅SDO-0输出数据。
    • 10b:SDO-0和SDO-1输出数据,实现2位宽并行输出。
    • 11b:SDO-0,1,2,3全部输出数据,实现4位宽并行输出。这能将数据输出速率最高提升4倍。
  • DATA_RATE:仅在SDO_MODE=11b时有效。0b为单数据率(SDR),1b为双数据率(DDR)。DDR模式下,数据在输出时钟的上升沿和下降沿都有效,吞吐率再翻倍。
  • SSYNC_CLK_SEL[1:0]:选择源同步模式下的输出时钟源和频率。

实战配置流程

  1. 上电或复位后,ADC默认处于最基础的模式(SDI_MODE=00b,SDO_MODE=00b,SDO_WIDTH=00b)。此时只能用标准SPI,通过SDO-0读取数据。
  2. 如果你需要菊花链,先将所有ADC的SDO_CNTL寄存器配置为SDO_MODE=00b01b
  3. 如果你需要极高的单通道数据率,并愿意增加PCB布线复杂度,可以配置为SDO_MODE=11b,SDO_WIDTH=11b,DATA_RATE=1b,启用4位DDR源同步模式。此时务必注意,SDO-0/1/2/3都需要连接到FPGA或MCU的高速GPIO,并且走线等长。

3.2 数据输出定制:DATA_CNTL与模式寄存器

拿到原始转换码值只是第一步,DATA_CNTLPATN_LSB/MID/MSB寄存器让你能对输出数据格式进行深度加工。

DATA_CNTL (地址 010h)

  • DATA_VAL位:这是调试和系统自检的“神器”。设置为0b时,输出的是真实的18位转换结果(放在D[21:4],低4位D[3:0]根据其他设置填充)。设置为1b时,输出的将是PATN寄存器中预设的固定模式,而不是实际转换结果。这在验证数据通路是否畅通、排查是模拟前端问题还是数字接口问题时非常有用。我习惯在系统初始化后,先发一个固定模式(比如0xAAAAA),看读回来的是否一致,快速完成数字回环测试。
  • PAR_EN位:奇偶校验使能。高可靠性系统必备。置1后,ADC会自动在22位输出字的LSB部分添加两个校验位:
    • D[3]:对全部18位转换数据(D[21:4])计算的偶校验位。
    • D[2]:对FPAR_LOC选择的高位部分(4/8/12/16个MSB)计算的偶校验位。
  • FPAR_LOC[1:0]:选择用于计算D[2]校验位的数据范围。这允许你对数据最重要的高位部分进行额外的重点保护。

PATN 寄存器 (014h, 015h, 016h):当DATA_VAL=1时,这3个寄存器组成的18位模式字(PATN_MSB[3:0],PATN_MID[7:0],PATN_LSB[7:2])将取代转换结果被输出。你可以把它设成0x000000x3FFFF之间的任意值。一个高级技巧是:你可以周期性地在正常数据和固定模式之间切换,在接收端通过检测固定模式来实现帧同步,特别是在高速流数据传输中,能有效防止数据错位。

3.3 功耗管理与校准优化

对于电池供电或低功耗设备,PD_CNTL寄存器是关键。

  • PD_ADC位:置1可关断ADC核心模块。在两次转换间隔较长时,关断ADC可以节省大量功耗。但要注意,从关断状态唤醒到下一次转换开始,需要等待tPU_ADC时间(具体值查数据手册,通常在几十微秒量级)。如果你的采样率是1kSPS,每次采样后关断ADC,下次采样前再唤醒,能省下99%以上的ADC功耗。
  • PD_REFBUF位:置1可关断内部参考缓冲器。如果你使用外部精密参考源直接驱动REFIN引脚,且不需要内部缓冲,可以关断它以节省功耗。同样,唤醒需要tPU_REFBUF时间。

OFFSET_CAL (地址 020h):这个寄存器常常被忽略,但它对精度有细微影响。REF_SEL[2:0]位用于选择外部参考电压范围(5.0V, 4.5V, 4.096V, 3.3V, 3.0V, 2.5V)。ADC内部的校准电路会根据你选择的VREF值进行微调,以获得该参考电压下的最佳偏移性能。务必根据你实际使用的参考电压准确设置这个字段,特别是当VREF不是标准的5V或3.3V时(比如使用4.096V这种精密参考),正确的设置能改善零刻度附近的线性度。

REF_MRG (地址 030h):参考电压微调寄存器。EN_MARG使能后,可以通过REF_OFST[4:0]对内部参考缓冲器的输出施加一个微小的正或负偏移(典型步进280µV,范围约±4.5mV)。这个功能主要用于系统校准。例如,你可以通过测量一个已知的精密电压源,如果发现ADC读数存在固定的微小增益误差,可以通过微调参考电压来进行软件补偿,而无需更换硬件。

4. 系统级设计要点与避坑指南

把ADC芯片用起来和用好,中间隔着一整个系统设计的距离。MultiSPI接口再强大,如果外围电路和PCB设计不到位,也发挥不出其应有的性能。

4.1 电源与参考电路设计:稳定性的基石

ADS891xB需要两路电源:模拟电源(AVDD,通常5V)和数字接口电源(DVDD,1.8V至5V,需与主机IO电压匹配)。电源去耦是命门

  • AVDD:必须在靠近芯片的AVDD和AGND引脚之间放置一个10µF的钽电容或陶瓷电容(针对低频噪声),并并联一个0.1µF的陶瓷电容(针对高频噪声)。这个0.1µF的电容要尽可能近,最好在芯片的背面(如果使用BGA封装)。
  • DVDD:同样需要0.1µF + 1µF的组合靠近芯片放置。特别注意,如果DVDD来自一个开关电源(DCDC),其噪声可能会通过数字接口耦合到敏感的模拟部分,建议使用π型滤波器(如铁氧体磁珠+电容)进行隔离。
  • 参考电压电路:这是影响ADC绝对精度的核心。即使使用内部参考,REFIN引脚也需要一个极其干净、稳定的电压。数据手册中的典型应用图使用REF5045(4.5V基准)加一个由1kΩ电阻和1µF电容构成的低通滤波器(截止频率约160Hz),这能极大抑制基准源本身的宽带噪声。如果你使用外部基准,这个滤波电路是必须的。REFBUFOUT到REFM之间的10µF和0.1µF去耦电容同样需要严格靠近芯片引脚布局。

4.2 模拟前端设计:不止是运放选型

驱动一个18位、1MSPS的SAR ADC,对运放的要求非常苛刻。数据手册推荐了OPA2625(用于差分输入)和THS4551(用于全差分放大器配置)。选择它们不仅仅是因为低噪声、低失真,更是因为其高带宽和强大的容性负载驱动能力

电荷反冲滤波器(Charge-Kickback Filter):这是SAR ADC前端设计的精髓。每个ADC输入引脚(AINP, AINN)对地都需要接一个电容(CFLT,推荐10nF COG/NPO材质),并通过一个小的串联电阻(RFLT,推荐2.2Ω)连接到运放输出。

  • CFLT的作用:它有两个关键作用。第一,作为“电荷桶”,在ADC采样瞬间提供瞬时大电流,快速对内部采样电容充电,减少采样误差。第二,它与RFLT构成低通滤波器,滤除来自运放的宽带噪声。其值(10nF)远大于ADC的采样电容(60pF),确保了电荷供给充足。
  • RFLT的作用:隔离运放输出和容性负载(CFLT + ADC采样电容),防止运放因驱动大电容而发生振荡,提高稳定性。但这个电阻不能太大,否则会和ADC的非线性输入阻抗在信号变化时产生失真。2.2Ω是一个经过折衷的推荐值。

稳定性验证千万不要凭感觉!一定要用TINA-TI或其他SPICE工具对“运放 + RFLT + CFLT + ADC采样电容”这个整体电路进行瞬态分析和交流稳定性分析。观察运放输出在采样瞬间的建立情况,确保在采样时间窗口内能稳定到18位精度(即误差小于1LSB,对于4.5V量程约为17.2µV)。同时检查相位裕度,确保大于45度。

4.3 数字接口与PCB布局:细节决定成败

MultiSPI接口的时序裕量在高采样率下非常紧张,PCB布局必须精心处理。

  1. 时钟与数据线等长:对于SCLK、SDI、SDO这些高速数字信号(在1MSPS下,SCLK频率可能高达22MHz或更高),应作为一组进行布线,尽量保持走线长度一致,以减少信号间的skew(偏斜)。如果使用源同步宽总线模式(SDO-0/1/2/3),这四条数据线之间也要等长。
  2. CONVST走线要短且干净:CONVST是模拟采样的触发信号,其边沿的抖动(jitter)会直接转化为采样时间的不确定性,影响高频信号的采样精度。这条线应尽可能短,远离其他高速数字线(如SCLK),并考虑在靠近ADC端串联一个小电阻(如22Ω)以减缓边沿,减少振铃和辐射。
  3. 地平面分割与单点连接:正确的做法是使用完整的统一地平面,而不是物理分割模拟地和数字地。将模拟部分和数字部分在布局上分开,但地平面在PCB底层或内层保持连续。ADC的AGND和DGND引脚应通过最短的走线连接到这个统一地平面上的同一点附近。在电源入口处,通过磁珠或0Ω电阻将模拟电源地和数字电源地单点连接。
  4. 隔离的应用:在输入材料框图中,数字接口部分标注了“(Optional)Isolation”。在工业现场或存在高共模电压的场合,在主机控制器和ADC的MultiSPI接口之间使用数字隔离器(如ISO7741)是保护主机的关键措施。隔离器应放置在ADC数字接口的“外侧”,即ADC的SCLK、SDI、CS、SDO等信号先进入隔离器,再连接到主机。同时,隔离器两侧需要使用独立的隔离电源(例如隔离DC-DC模块)。

5. 软件驱动实现与调试技巧

硬件搭建好了,最后一步就是让软件跑起来。一个健壮的驱动程序,不仅要能正确读写数据,还要包含丰富的状态监控和错误处理机制。

5.1 初始化序列与寄存器配置

上电或复位后,ADC需要一段稳定的时间(t_POR,查数据手册)。之后,建议遵循以下初始化序列:

  1. 硬件复位(可选):如果连接了RST引脚,拉低至少20ns再拉高。
  2. 软件复位:通过SPI发送一个特定的命令序列(具体命令查寄存器映射,通常是向某个保留地址写入特定值)。这能确保寄存器恢复到已知状态。
  3. 配置核心寄存器:按需配置SDI_CNTL,SDO_CNTL,DATA_CNTL。例如,配置为菊花链标准SPI模式:
    // 假设函数 write_reg(addr, data) 用于写寄存器 write_reg(0x008, 0x00); // SDI_MODE = 00b, 标准SPI模式0 write_reg(0x00C, 0x00); // SDO_MODE = 00b, 跟随SDI模式;SDO_WIDTH=00b (单线输出) write_reg(0x010, 0x00); // DATA_VAL=0, 输出真实转换数据;PAR_EN=0, 关闭校验
  4. 配置参考与校准:根据实际硬件设置OFST_CAL寄存器。如果使用外部参考且需要微调,配置REF_MRG
  5. 配置模式寄存器(如需):如果要用固定模式测试,设置PATN_LSB/MID/MSBDATA_CNTL中的DATA_VAL=1
  6. 退出低功耗模式(如果之前进入):确保PD_CNTL寄存器中的PD_ADCPD_REFBUF位为0。

5.2 数据读取流程与帧结构

对于单设备标准SPI模式,一次完整的读取操作如下:

  1. 拉低CS(同时如果CONVST与CS短接,则启动转换)。
  2. 等待转换完成(可以查询状态寄存器,或等待固定时间t_CONV,或监控RVS引脚)。
  3. 主机发出22个SCLK时钟脉冲。在时钟沿,主机从SDO线上读取22位数据(MSB先出)。
  4. 拉高CS,结束帧。

对于菊花链模式,假设有3个设备:

  1. 拉低公共CS(启动所有ADC转换)。
  2. 等待转换完成。
  3. 主机发出22 * 3 = 66个SCLK时钟脉冲。在这66个时钟内,数据会从Device 3 -> Device 2 -> Device 1 -> 主机依次移位出来。
  4. 拉高CS。主机收到的66位数据中,前22位是Device 3的数据,中间22位是Device 2,最后22位是Device 1。

关键代码片段示例(伪代码)

// 读取单个ADC数据(标准SPI) uint32_t read_adc_data(void) { uint32_t data = 0; cs_low(); // 启动转换(如果CONVST与CS短接) delay_us(t_CONV); // 等待转换完成,更优做法是用RVS中断 for (int i = 0; i < 22; i++) { sclk_high(); data <<= 1; if (read_sdo_pin()) data |= 0x01; sclk_low(); } cs_high(); return data & 0x3FFFFF; // 取22位有效数据 } // 读取菊花链数据(3个ADC) void read_daisy_chain(uint32_t data_array[3]) { uint64_t raw_data = 0; // 需要足够大的容器存放66位数据 cs_low(); delay_us(t_CONV); for (int i = 0; i < 66; i++) { sclk_high(); raw_data <<= 1; if (read_sdo_pin()) raw_data |= 0x01; sclk_low(); } cs_high(); // 解析数据:先出来的是最后一个设备的数据 data_array[2] = (raw_data >> 44) & 0x3FFFFF; // Device 3 data_array[1] = (raw_data >> 22) & 0x3FFFFF; // Device 2 data_array[0] = raw_data & 0x3FFFFF; // Device 1 }

5.3 调试技巧与常见问题排查

  1. 问题:读回来的数据全是0或全为1(0x3FFFFF)。

    • 检查电源和参考电压:用万用表和示波器确认AVDD、DVDD、VREF电压正确且无噪声。
    • 检查模拟输入:确保模拟输入信号在ADC量程范围内(0到VREF)。
    • 检查CONVST信号:用示波器看CONVST是否有正常的脉冲?脉冲宽度是否满足要求?
    • 进行数字回环测试:配置DATA_VAL=1,并设置一个独特的PATN值(如0x2AAAAA)。如果能读回这个固定模式,说明数字通信是通的,问题在模拟前端或转换触发。如果读不回,问题在SPI通信本身。
  2. 问题:SPI通信不稳定,偶尔数据错误。

    • 检查时序:用示波器同时测量SCLK、CS和SDO。确保SCLK频率在芯片额定范围内(查数据手册最大SCLK频率)。检查建立时间(setup)和保持时间(hold)是否满足要求。特别注意CS拉高后到下一次CS拉低之间的时间间隔是否足够。
    • 检查电气连接:确认上拉/下拉电阻正确,信号线没有浮空。测量SCLK、SDO等信号线上是否有过冲或振铃?必要时在靠近ADC端串联一个22-100Ω的电阻。
    • 降低SCLK频率:先尝试用很低的SCLK频率(如100kHz)通信,如果稳定,再逐步提高,找到系统能稳定工作的最高频率。
  3. 问题:菊花链中,只有第一个或最后一个设备数据正确。

    • 确认配置一致性:确保链上所有ADC的SDO_CNTL寄存器都配置为相同的菊花链兼容模式(00h01h)。
    • 检查帧长度:这是最常见的原因。你发出的SCLK脉冲数必须是22 x N(N为链上设备数)。仔细检查你的SPI驱动程序,确保时钟计数准确。
    • 检查物理连接:用万用表逐段测量菊花链的连接:主机SDO -> Device 1 SDI, Device 1 SDO-0 -> Device 2 SDI, ... , Device N SDO-0 -> 主机SDI。确保没有接错、虚焊或短路。
  4. 问题:使用源同步模式时,数据对齐错误。

    • 检查时钟相位:在源同步模式下,主机需要根据ADC输出的数据时钟来捕获数据。确保你的FPGA或MCU在正确的时钟边沿(根据DDR/SDR设置)采样数据线。
    • 执行时序分析:在FPGA设计中,必须对输入的数据和时钟进行时序约束(set_input_delay),并利用工具进行静态时序分析,确保满足建立保持时间。
    • 利用IODELAY/IDELAY:对于高速信号(>50MHz),PCB走线延迟可能已经超过一个时钟周期。Xilinx FPGA的IODELAY或类似功能可以动态调整数据线的延迟,以对齐时钟和数据。这可能需要进行眼图扫描或训练序列来找到最佳延迟值。

最后,一份完整的调试清单:电源/参考电压 -> 基本SPI通信(读ID或固定模式)-> 单设备正常数据采集 -> 多设备拓扑连接与配置 -> 高速模式优化。每一步都稳扎稳打,用示波器和逻辑分析仪(SPI协议分析功能非常好用)仔细观察信号,大部分问题都能被定位和解决。MultiSPI接口初看复杂,但一旦理解了其“统一移位寄存器”的核心思想,并严格按照时序和配置要求操作,它就能成为构建高密度、高性能数据采集系统的强大助力。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询