1. 项目背景与硬件选型
最近在做一个传感器数据采集的项目,需要测量微弱的电压信号,STM32自带的12位ADC精度不够用,于是选了AD7789这款24位高精度ADC芯片。这家伙精度真的很高,最低功耗只有100μA,特别适合低速高精度的测量场景,比如温度传感器、压力传感器或者电子秤这类应用。
AD7789是ADI公司推出的Σ-Δ型ADC,内置PGA(可编程增益放大器),最高128倍增益,支持单极性和双极性输入模式。最关键的是它采用SPI接口,跟STM32连接起来特别方便。我用的主控是STM32F103C8T6,也就是常说的"蓝色药丸"开发板,性价比超高。
硬件连接很简单:AD7789的SCLK接PA5,DOUT/RDY接PA6,DIN接PA7,CS接PA4。电源方面,模拟部分我用了一颗LDO单独供电,避免数字噪声影响ADC精度。基准电压选了ADR421,2.5V的超低噪声基准源,确保测量稳定性。
2. CubeMX基础配置
打开STM32CubeMX,先配置时钟树。我用的外部8MHz晶振,PLL倍频到72MHz,这是F103的极限速度了。然后到SPI1配置:
在Mode里选Full-Duplex Master,这个很重要,因为AD7789需要先发送命令再读取数据。Data Size设成8bit,虽然ADC是24位的,但通信是以字节为单位进行的。
硬件NSS信号这里要选Disable,我们用软件控制片选。为什么不用硬件NSS呢?因为AD7789的通信协议比较特殊,需要在数据传输间隙保持CS为低电平,硬件NSS会自动拉高,不符合要求。
时钟极性(CPOL)设成High,时钟相位(CPHA)选2 Edge。这个配置是根据AD7789的时序图来的:时钟空闲时为高电平,数据在第二个边沿(也就是上升沿)采样。
分频系数我先设成256,这样SPI时钟大约是280kHz。虽然AD7789最高支持2MHz的SPI时钟,但刚开始调试时用低速更稳妥。
GPIO配置方面,除了SPI引脚,我还把PA4(CS)和PA6(RDY)配置成普通输出和输入。特别注意PA6要设置成上拉输入,因为AD7789的RDY信号是开漏输出。
最后生成代码时,记得在Project Settings里把库版本选为LL库(Low-Layer),这样代码效率更高。当然用HAL库也可以,只是函数调用开销大一些。
3. SPI通信深度解析
AD7789的SPI通信有点特殊,需要特别注意时序。它的DOUT/RDY引脚是复用的:平时作为数据准备信号(低电平有效),数据传输时作为数据输出。
通信流程是这样的:先拉低CS,然后发送8位配置命令,等待RDY变低,再发送读取命令,最后读取24位数据。整个过程CS要保持低电平,这是最容易出错的地方。
我一开始用HAL_SPI_Transmit和HAL_SPI_Receive函数,发现时序不对。后来看了源码才发现,这些函数会在传输前后控制CS引脚,不符合我们的需求。解决办法是直接用LL库的底层函数:
void AD7789_WriteByte(uint8_t data)
{
w


802

被折叠的 条评论
为什么被折叠?



