尧图网络科技YAOTU DIGITAL 获取报价
获取报价
首页 / 资讯中心 / 文章详情

AD7689芯片驱动开发:SPI时序配置与STM32采样实现

发布时间:2026/9/13 21:24:25

资讯中心
01
ARTICLE

AD7689芯片驱动开发:SPI时序配置与STM32采样实现

AD7689芯片驱动开发:SPI时序配置与STM32采样实现
简介面向嵌入式开发者与数据采集系统设计的一份AD7689驱动源码工程聚焦16位高精度ADC的初始化、寄存器配置、SPI通信及多通道数据读取可应用于测试测量、医疗仪器等场景。压缩包共155个文件以C源文件与头文件为主体辅以完整Keil工程文件uvproj/uvopt、编译产物hex/axf/map及调试辅助文件整体约3.01MB目录结构与工程配置完整便于直接参考或二次开发。源码内含芯片初始化、参数设置、转换启动与结果读取等核心函数并涉及与AD7705、AD9880等ADC协同使用的信号调理思路能够帮助开发者快速掌握AD7689的驱动编写与系统集成方法。目前已有977人学习适合正在调试AD7689或需要构建多通道高精度采集系统的工程师参考。1. 先分清 AD7689、AD7705、AD9880:这个压缩包里真正要开发的芯片在下载站拿到 AD7689.zip,文件名后半段通常挂着一串 ad7705、ad9880、芯片开发、源码这样的索引词,真正的主角只有一颗芯片:AD7689,16 位、8 通道、250kSPS 的 PulSAR 逐次逼近 ADC。它和 AD7705 不是一类东西——AD7705 是 Σ-Δ 架构,主打慢速高精度称重和桥式传感器;AD9880 是视频域的 HDMI/DVI 接口芯片,不做通用数据采集。三颗芯片出现在同一个文件名里,只是下载站堆关键词的结果。接下来按拿到 AD7689 怎么把它跑起来的顺序讲:先拆配置字和 SPI 时序,再给一份 STM32 上的可编译驱动源码,然后处理基准、量程、输入配置这几个最容易被改错的位,最后用一个逻辑分析仪验收技巧收尾。适合正在写驱动、调采集板,或者准备把这颗 ADC 换到新平台的工程师。2. AD7689 的 SPI 配置字与时序:一帧 16 位同时完成写和读2.1 没有寄存器的 ADC:控制全靠 SDI 命令字AD7689 内部是电容式 DAC 加比较器的逐次逼近核心,一次转换结束后,结果直接挂在 SDO 上等着被时钟取走。它没有 AD7705 那种配置寄存器组,不需要先写一堆模式寄存器再启动转换。所有控制都被压缩进一帧 SPI 传输:主控在 SCLK 上送出 16 位数据,高 14 位是配置,低 2 位是无关位,芯片在同一个帧里把上一次转换结果从 SDO 推回来。也就是说,每读一次数据,都必须先想好这一帧要写什么配置。这个设计带来的直接后果是:驱动里没有一个初始化函数能一劳永逸,每一帧都要带着配置字。照抄 AD7705 思路的人,会先写配置再单独读数据,结果读写错位,拿到的永远是旧通道的旧数据。2.2 16 位配置字:INCC、INx、BW、REF、SEQ、RB 的位布局配置字从 MSB 到 LSB 依次是:位字段作用15~13INCC[2:0]输入配置:缓冲器、单/双极性、内部 10kΩ 下拉12~10INx[2:0]通道选择,000~111 对应 IN0~IN79BW带宽/功耗档位,常规置 08REF内部基准选择:1 选 4.096V,0 选 2.5V7SEQ序列器使能,置 1 后自动轮询全部 8 个通道6RB配置字回读,置 1 时 SDO 回显配置字5~0保留/无关固定写 0拼配置字建议写成宏,不要在采样循环里散落魔法数:#define AD7689_CFG_INCC(x) ((uint16_t)(x) 13) /* 输入路径配置 */ #define AD7689_CFG_INx(x) ((uint16_t)(x) 10) /* 通道地址 */ #define AD7689_CFG_BW (0u 9) /* BW0 全带宽 */ #define AD7689_CFG_REF (1u 8) /* 内部基准 4.096V */ #define AD7689_CFG_SEQ (0u 7) /* 序列器关闭 */ #define AD7689_CFG_RB (0u 6) /* 回读关闭 */ #define AD7689_IN0_4V (AD7689_CFG_INCC(1) | AD7689_CFG_INx(0) | \ AD7689_CFG_REF | AD7689_CFG_BW)INCC 的三位组合决定输入路径,具体是哪三件事:缓冲器接不接、编码单极性还是双极性、要不要内部 10kΩ 对地。8 种组合的完整对应关系在手册 Input Configuration 表里,我这里的 INCC(1) 是采集板上最常用的带缓冲单极性档,具体板子按需求对着表改。REF 位在 2.5V 和 4.096V 之间切换,不用外部基准芯片时,大多数采集卡直接选 4.096V,量程更大,LSB 也更规整。SEQ 和 RB 平时都置 0,等用到序列器或多片调试时再单独打开。2.3 时序:CNV 上升沿启动转换,取数在下降沿之后AD7689 的采样时刻由 CNV 决定,不是由 SCLK 决定。CNV 上升沿的瞬间,输入被采进内部电容阵列并开始转换;转换结束后把 CNV 拉低,SDO 解除高阻,随后的 SCLK 把 16 位结果推出来。SCLK 空闲为低、数据在上升沿被芯片锁存,对应标准 SPI Mode 0,即 CPOL0、CPHA0。手册上的几个关键参数要心里有数:最高 SCLK 50MHz;250kSPS 满速时采样周期 tCYC 是 4µs;转换时间 tCONV 在数百纳秒到一微秒量级,以具体批次 datasheet 为准。驱动里 CNV 高电平保持时间要盖过 tCONV,别把 CNV 当普通片选随便抖一下。SCLK 不是越快越好,先按 10MHz 起步调通,再往上提。3. 用 STM32 HAL 写 AD7689 驱动:从单通道到 8 通道轮询3.1 SPI 初始化与引脚分配AD7689 需要四根线:SCLK、SDI(对应 STM32 的 MOSI)、SDO(MISO)、CNV。CNV 不能用硬件 NSS,因为 NSS 的拉低时机跟着 SPI 传输走,而 AD7689 要求 CNV 与 SCLK 独立控制,采样时刻要精确到微秒级。CNV 必须挂在普通 GPIO 上,由软件或定时器翻转。引脚分配建议:AD7689 信号STM32 侧说明CNV任意 GPIO(推挽输出)软件翻转,采样时刻由它决定SCLKSPI_SCK速率先 10MHz 起步SDISPI_MOSI配置字输入,MSB 在前SDOSPI_MISO转换结果输出HAL 初始化片段,数据宽度用 16 位,CPOL/CPHA 走 Mode 0:hspi2.Init.Mode SPI_MODE_MASTER; hspi2.Init.Direction SPI_DIRECTION_2LINES; hspi2.Init.DataSize SPI_DATASIZE_16BIT; hspi2.Init.CLKPolarity SPI_POLARITY_LOW; hspi2.Init.CLKPhase SPI_PHASE_1EDGE; /* CPHA0, Mode 0 */ hspi2.Init.NSS SPI_NSS_SOFT; hspi2.Init.BaudRatePrescaler SPI_BAUDRATEPRESCALER_8; /* 72MHz/89MHz */ HAL_SPI_Init(hspi2);数据宽度用 16 位而不是 8 位,是为了避免手动拼高低字节。用 8 位模式要自己先发高字节再发低字节,回读时再拼回来,字节序上非常容易翻车。CPHA 选 1EDGE 对应 Mode 0,和 AD7689 的 SDO 输出时序一致。3.2 单通道采样:一次 GPIO 翻转加一次 SPI 收发单通道采样的最小函数只有四步:uint16_t ad7689_read(uint16_t cfg) { uint16_t rx 0; HAL_GPIO_WritePin(CNV_GPIO_Port, CNV_Pin, GPIO_PIN_SET); /* 启动转换 */ delay_us(2); /* 覆盖 tCONV */ HAL_GPIO_WritePin(CNV_GPIO_Port, CNV_Pin, GPIO_PIN_RESET); /* 释放 SDO */ HAL_SPI_TransmitReceive(hspi2, (uint8_t *)cfg, (uint8_t *)rx, 1, 10); return rx; /* 返回的是上一帧配置对应的转换结果 */ }调用时先空读一帧丢掉,再从第二帧开始取数:ad7689_read(AD7689_IN0_4V); /* 上电残留,丢弃 */ uint16_t v ad7689_read(AD7689_IN0_4V);delay_us(2) 是给转换和内部基准建立留的余量,先把功能调通再往下压;如果手册标注的 tCONV 更长,这里按比例加。HAL_SPI_TransmitReceive 在 16 位模式下收发各一帧,实际耗时取决于 SCLK,9MHz 下约 1.8µs,加上 2µs 的 CNV 高电平,单通道采样率能跑到 200kSPS 以上,足够覆盖大多数工业采集场景。3.3 8 通道轮询与 SEQ 序列器多通道轮询最常见的做法是关掉 SEQ,在主循环里改 INx 字段循环采样:for (uint8_t ch 0; ch 8; ch) { uint16_t cfg AD7689_CFG_INCC(1) | AD7689_CFG_INx(ch) | AD7689_CFG_REF | AD7689_CFG_BW; ch_val[ch] ad7689_read(cfg); }逐通道独立配置的好处是,个别通道可以用不同极性和缓冲设置;代价是切换通道后第一帧读到的还是上一个通道的旧数据。严格做法是每个通道读两帧丢一帧,采样率会减半。我一般建议新手先用这种方式调通,确认八路输入都正常,再上序列器。SEQ 置 1 后,芯片每次转换自动推进一个通道,主循环持续发相同配置字,回读结果按 IN0→IN1→…→IN7 顺序输出。但序列器模式下你分不清当前帧是哪一路,开机后必须连续读 9 帧,丢掉第 1 帧,把第 2~9 帧作为一轮完整数据。注意:每一笔有效转换都必须有一次 CNV 上升沿,DMA 只解决数据搬运,不解决采样节拍。把 8 帧拼成一次 DMA 长传输,中间没有 CNV 上升沿,读回来的 8 个数全是同一笔旧结果。正确的 DMA 姿势是定时器中断里翻转 CNV,再启动单帧 DMA,采样率由定时器周期决定。8 通道轮询时,定时器中断频率就是单通道采样率,数据吞吐是采样率乘以通道数。4. 量程、基准与 INCC:AD7689 驱动最常改错的三个配置位4.1 REF 位与内部基准:2.5V 与 4.096V 怎么选REF 位只有一位,但它同时决定量程和 LSB,是最容易改出看不出毛病的地方。选内部基准时:REF 位基准电压单极性量程LSB02.5V0~2.5V38.15µV14.096V0~4.096V62.5µV2.5V 档 LSB 更细,适合小信号直接进 ADC;4.096V 档量程大,适合采 5V 系统分压后的信号。4.096V 除以 65536 正好等于 62.5µV,整数关系让校准和反算都方便,很多设计因此选它。外部基准的接法另说,REF 位的含义要重新查手册 Reference Configuration 表,常规板卡用内部基准就足够。基准起不来时最典型的症状是输出满码或读数整体偏移。驱动里的换算函数按单极性写:float ad7689_to_volt(uint16_t raw, uint16_t ref_mv) { return (float)raw * ref_mv / 65536.0f; /* 单极性,0~REF */ }先用万用表量 REF 引脚的电压,确认基准没问题,再怀疑后面的采样链路。4.2 INCC 三位:缓冲、极性、内部 10kΩINCC 的三位组合控制输入路径,里面有三个独立选择:缓冲器接不接、编码单极性还是双极性、输入引脚要不要内部 10kΩ 对地。带缓冲适合信号源阻抗较高的场景;不带缓冲时,信号源必须在采集窗口内把内部电容阵列充到位,运放或低阻源是必须的。双极性模式输入范围是 ±REF/2,适合交流信号,但码字变成偏移二进制,静止读数会在 0x8000 附近而不是 0 附近。根据症状反推配置错误,比逐位试编码快:现象优先排查读数永远接近 0xFFFF通道没接信号、缓冲档没开、基准没起来读数在 0x8000 附近摆动双极性档配了单极性信号,极性位反了读数低几位剧烈跳动SCLK 太快、CNV 高电平太短、信号源阻抗过高读数整体偏小且跟随缓慢采集窗口不足,降速或开缓冲再试INCC 的 8 种组合在手册里是一张完整的表,调试时拿固定电压灌进某一通道,把码值算出来对比量程关系,编码对不对立刻能看到。板卡上电后不要一上来就采数据,先用基准的一半电压做一次闭环,确认量程再动其它通道。4.3 用 RB 位核对芯片实际收到了什么多通道配置错乱、或者怀疑 SPI 模式不对时,把 RB 位置 1。此时 SDI 上的配置字会被原样推回 SDO,主控读回来和发送值逐位比对:uint16_t rb_cfg AD7689_CFG_INCC(1) | AD7689_CFG_INx(0) | AD7689_CFG_REF | AD7689_CFG_BW | AD7689_CFG_RB; uint16_t echo ad7689_read(rb_cfg); if (echo ! rb_cfg) { /* SPI 模式、字节序、引脚虚焊,按位对比 echo 就能定位 */ }任意一位对不上,优先怀疑 CPOL/CPHA 和引脚映射,而不是芯片损坏。这个回显功能平时要关掉,因为 RB1 时 SDO 不输出转换结果,只做诊断用。5. 用逻辑分析仪验收 AD7689 驱动的时序5.1 抓哪几根线、怎么触发逻辑分析仪优先接 CNV、SCLK、SDO 三根线,SDI 可以后补。采样率至少要达到 SCLK 的 5 倍,SCLK 提到 25MHz 时,低于 100MHz 采样率的分析仪抓出来的边沿都是糊的,没法判断建立时间。触发条件设成 CNV 上升沿,单次触发,一次就能抓到完整的CNV 高电平 16 个 SCLK SDO 数据窗口。5.2 三个必须看的点第一,CNV 高电平宽度。从上升沿到下降沿必须盖过 tCONV,在分析仪上数一下这个高电平持续了多少微秒,再对照手册参数。第二,SDO 的数据必须在 SCLK 上升沿之前完成建立;如果 SDO 的跳变紧贴着上升沿,说明 SCLK 太快或者 PCB 走线太长,降速处理。第三,帧边界:第一个 SCLK 上升沿采到的应该是 D15,如果解码出来数据整体右移一位,去查 8 位/16 位模式是不是搞混了。5.3 用 SPI 解码器确认模式,再做一次电压闭环分析仪的 SPI 解码器设 Mode 0(CPOL0,CPHA1EDGE),如果解出来的配置字和驱动里发的一致,时序就是对的。对不上时把 CPHA 换成 2EDGE 再解一次,两种情况只有一种能解出整齐的数据,顺便验证代码里 SPI 相位设置是否正确。最后收尾做一次电压闭环:输入接精密电压源设 1.000V,内部基准 4.096V,理论码值是 1.000 / 4.096 × 65536 ≈ 16000,即 0x3E80。实测差 1~2 个 LSB 说明基准、缓冲、时序都正常;差出几百个 LSB,回头查 REF 位和 INCC 极性,比反复拆焊换芯片快得多。本文还有配套的精品资源点击获取
02
RELATED NEWS

相关资讯

更多网站建设与数字化升级内容

03
WHY YAOTU

想打造同款高转化官网?

懂行业、懂生意,从建站到增长一站式陪跑

场景化定制

不做模板站,围绕你的业务场景量身设计,小众不撞款。

营销型架构

以转化目标组织内容与路径,让官网真正带来询盘。

全周期服务

设计、开发、运营、运维一体,上线只是开始。

免费获取你的建站方案

留下需求,专属顾问 24 小时内为你输出方案建议。