声明:本人水平有限,博客可能存在部分错误的地方,请广大读者谅解并向本人反馈错误。
由于项目的需要,上周又设计了ADS1285的采集电路板,最近几天焊接了一下,重新进行测试。由于之前对ADC采集不是重点,所以就草草了事,交给了其他同学负责,现在出现了一些问题,所以本篇博客争取再把ADS1285的数据手册过一遍,仔细学习一下。
本博客可能存在一些错误,还希望各位小伙伴们能够指出错误,和诸位努力又帅气的小伙们共同学习、共同进步!
由于本博客中会直接使用数据手册的译文,所以为了区分,数据手册的译文均使用引用的形式:
引用:…
下面是我新绘制的PCB,不过在调试时还是出现了一些问题,这些问题会逐渐进行测试解决的,在本文以后会放上代码,需要的小伙伴关注即可,即可观看全文。
一、 简单认识一下
1.1 引脚说明
引脚说明比较简单,在这就不一一接收了,小伙伴可以去数据手册阅读,这里直接把原理图放出来,与大家参考一下。
1.2 电气特性
在这突然发现一点, V I N H V_{INH} VINH的最低值要0.8×IOVDD,这一点之前没有想过,这个点需要多多注意。
1.3 时序
上图主要是SPI里面CS、CLK、DIN三条线的时序,可以注意到CLK在空闲时为低电平;在上升沿采集DIN上的数据,这一点在软件设计上是非常重要的,需要注意一下。
上图主要介绍了DRDY引脚的时序,DRDY引脚是表面数据已经准备好了,所以在读取到DRDY位低电平时,说明就可以读取数据了。
二、概述
2.1 程序框图
调制器数据由数字滤波器处理,提供最终的转换结果。该数字滤波器由一个sinc滤波器和一个可编程相位、FIR低通滤波器和一个IIR高通滤波器组成。高通滤波器从数据中去除直流和低频分量。
采样率转换器(SRC)通过对输出数据重采样来补偿时钟频率误差。时钟频率补偿范围为±244ppm,分辨率为7ppb。
用户可编程增益和失调校准寄存器纠正失调和增益错误。
SYNC引脚同步ADC。同步有两种操作方式:脉冲同步和连续同步。RESET引脚复位ADC,包括用户配置设置。引脚是抗噪声的,施密特触发输入,以提高在高噪声环境中的可靠性。
PWDN引脚在ADC不使用时切断电源。通过串行接口提供软件下电模式(STANDBY)。
4线制spi,串行接口读取转换数据和读写设备寄存器数据。
两个通用数字I/O可用于系统级控制。
PGA和缓冲器的电源由AVDD1和AVSS提供。电荷泵稳压器增加PGA后面缓冲器的输入电压范围。调制器的电源由AVDD2提供。IOVDD通过1.8v低压差稳压器(LDO)提供数字逻辑核心。IOVDD是数字I/O供应。
三、细节描述
3.1 模拟输入
ADC包含两个差分输入通道,多路复用器在两个差分输入之间选择进行测量。多路复用器还提供了测量噪声和偏置的测试模式。短输入测试配置可带或不带400-Ω电阻,以模拟800-Ω检波器产生的热噪声。多路复用配置如下表所示。
本项目只使用AIN1引脚,所以在此只需要配置MUX[2:0]为000即可。
3.2 可编程增益放大器(PGA)与缓冲区(Buffer)
上图为PGA和Buffer的框架
该器件可与PGA或单位增益缓冲器一起工作。缓冲操作禁用PGA偏置,降低设备功耗。当AVDD1 = 3.3 V时,由于PGA增益= 1的输入余量有限,因此必须在此条件下使用缓冲器。
上面有句话非常重要:“当AVDD1 = 3.3 V时,由于PGA增益=1的输入余量有限,因此必须在此条件下使用缓冲器。”我们使用的AVDD1为5V,所以可以不使用缓冲器。当然,使用缓冲器的好处是降低功耗,所以最后还是得根据功耗去选择是否使用缓冲器。
PGA增益由CONFIG1寄存器的gain[2:0]位编程:
无论PGA或缓冲操作,从每个缓冲输出连接两个47-nF, c0g介电电容器到AVSS (CAPBP和CAPBN)。电压电荷泵增加了缓冲输入的操作净空。在CAPC和AGND之间连接一个外部4.7-nF电容器,用于电荷泵操作。
3.3 参考电压
ADC需要一个参考电压才能工作。参考电压输入是差分的,定义为REFP和REFN引脚之间的电压:VREF = VREFP - VREFN。由于差分输入,VREFN走线可以路由到电压基准接地端子,以避免地噪声干扰。
该器件提供三种参考电压选择:5 V、4.096 V或2.5 V。使用VREF = 5 V或4.096 V实现最大动态范围性能,这需要AVDD1 = 5 V才能运行。如果AVDD1 = 3.3 V,则限制参考电压为2.5 V。通过CONFIG1寄存器的REF[1:0]位编程使参考电压与物理电压匹配。使用低噪声的精密电压基准,在测量带宽内最佳小于0.5 μVRMS。
“使用VREF = 5 V或4.096 V实现最大动态范围性能,这需要AVDD1 = 5 V才能运行。如果AVDD1 = 3.3 V,则限制参考电压为2.5 V”,这句话是电路设计时必须要的,在这给大家提醒一下。
3.4 IOVDD电压输入
IOVDD数字电源工作在两个电压范围:1.65 V至1.95 V和2.7 V至3.6 V。如果IOVDD工作在1.65 v ~ 1.95 v范围内,请将IOVDD直接连接到CAPD引脚上。
当IOVDD工作在1.65 v ~ 1.95 v范围时,接线方式如下图所示。否则,如果工作在2.7 v ~ 3.6 v范围内的IOVDD,请勿将这些引脚连接在一起。
“如果工作在2.7 v ~ 3.6 v范围内的IOVDD,请勿将这些引脚连接在一起。”
3.5 数字滤波器
该数字滤波器由三部分组成:可变sinc滤波器;可变系数、固定抽取FIR滤波器;和一个可编程高通滤波器(IIR)。所需的滤波器路径由CONFIG0寄存器的filter[1:0]位选择。sinc滤波器提供部分滤波的数据,绕过FIR和HPF滤波器和用户校准。对于完全过滤的数据,选择FIR过滤器选项。IIR滤波器级去除直流和低频数据,FIR和组合FIR + IIR滤波器被送到到用户校准块和输出代码裁剪块。
3.5.1 Sinc滤波器
数字滤波器的第一部分是可变抽取的五阶sinc滤波器(sinx/x)。调制器数据通过采样率转换器以fMOD = fCLK / 4 = 2.048 MHz (1.024 MHz低功耗模式)的标称速率传递到sinc滤波器。sinc滤波器部分地为FIR滤波器过滤数据,FIR滤波器产生最终的频率响应。sinc滤波器数据旨在与后处理滤波器一起使用,以形成最终的频率响应。
下表显示了抽取比和sinc滤波器的输出数据率。sinc滤波器数据速率由CONFIG0寄存器的DR[2:0]位编程。
3.5.2 FIR滤波器
数字滤波器的第二部分是多级FIR低通滤波器。从sinc滤波器部分过滤的数据被输入到FIR滤波器。FIR滤波器决定数据的最终频率和相位响应。FIR滤波器由四个阶段组成,如下图所示。
前两个FIR级是半带滤波器,每级抽取= 2。第三和第四FIR级决定最终的频率和相位响应。抽取是4和2,对于FIR阶段3和4。FIR滤波器的整体抽取比为32。第3级和第4级的唯一系数集决定线性和最小相位滤波器响应。相位响应由CONFIG0寄存器的phase位选择。
下表列出了sinc和FIR滤波器阶段的组合抽取比以及相应的FIR滤波器数据率。
3.5.3 高通滤波器阶段
数字滤波器的最后一级是高通滤波器(HPF)。高通滤波器被实现为一级滤波器,IIR滤波器。高通滤波器从数据中去除直流和低频。通过编程CONFIG0寄存器的FILTR[1:0]使能HPF。
下表给出了高通滤波器编程的示例。
HPF通过积累数据来实现高通功能。类似于模拟HPF在输入端施加直流阶跃变化后的操作,滤波器需要时间来积累数据以从信号中去除直流。转角频率越低,滤波器安定下来的时间就越长。
为了缩短HPF的设置时间,偏移寄存器被用作HPF累加器的种子值。每次HPF状态从禁用变为启用时,累加器都会加载偏移寄存器。偏置寄存器可以预置一个估计值,如果直流电平已知,也可以预置一个校准值。为了提高精度,将偏移值按GAIN[3:0] / 400000h的逆值进行缩放。使能HPF后,正常偏移操作被禁止。
用OFFSET[2:0]寄存器初始化HPF累加器:
- 关闭HPF
- 将所需的值写入OFFSET[2:0]寄存器
- 使能HPF。OFFSET[2:0]被加载到HPF数据累加器中
- HPF跟踪来自信号的剩余直流值
后续对OFFSET[2:0]寄存器的写入将被忽略。要重新加载OFFSET[2:0]寄存器的内容到HPF,请禁用并重新启用HPF。
3.6 时钟输入
操作需要时钟信号。时钟信号应用于CLK引脚,fCLK = 8.192 MHz用于高功率和中功率模式,4.096 MHz用于低功率模式。与许多精度数据转换器一样,需要低抖动时钟来实现数据表性能。避免使用rc时钟振荡器。建议使用水晶时钟源。为了避免时钟信号振铃,可以在到源端的时钟PCB线路中放置一个串联电阻。时钟信号走线应远离其他时钟信号、输入引脚和模拟组件。
四、设备功能模式
4.1 电源模式
有三种功率分辨率模式提供功耗和动态范围之间的权衡。
模式分为高功率、中功率和低功率。有关噪音性能的详细资料,请参阅噪音性能部分。CONFIG0寄存器的MODE[1:0]位选择电源模式。低功耗模式时钟频率为4.096 MHz(半速时钟);因此,输出数据速率也被缩放了一半。
4.2 省电模式
通过将PWDN引脚设为低电平或通过发送STANDBY命令的软件控制来进行下电。如果需要退出下电,可以将PWDN调高或发送WAKEUP命令退出软件下电(时钟运行)。断电使模拟电路失效;然而,数字LDO (CAPD引脚)仍然偏置,从IOVDD提取小偏置电流。相比之下,软件下电会产生更大的IOVDD偏置电流。在两种断电模式下,数字输出的交流信号停止,但保持高或低驱动。数字输入不能浮动;否则,漏电流会从IOVDD电源流出。如果下电时时钟中断,则复位ADC。断电时同步丢失;因此,请重新同步ADC。
4.3 复位
ADC有三种复位方法:上电复位(POR)、reset引脚或reset命令。当电源电压超过相应的阈值时,上电复位。通过引脚复位ADC,驱动reset低电平至少两个fCLK周期,然后返回高电平进行复位。通过命令复位,在复位命令的SCLK上升沿第8条之后的下一个fCLK上升沿生效。在重置时,过滤器将重新启动,用户寄存器将重置为默认值。
4.4 同步
通过SYNC引脚或SYNC命令对ADC进行同步,从而重新启动数字滤波器周期。在CLK的下降沿上同步后,引脚的同步发生在CLK的下一个上升沿上。SYNC命令的同步发生在CLK的上升沿,在该命令的第8位之后。
以下情况会导致同步丢失:
- 上电周期,ADC复位,或当硬件或软件进入断电模式
- 模式变化如下:DR[2:0] (data rate);PHASE (filter phase);MODE[1:0] (power mode);SYNC (synchronization mode);SRC[1:0] (sample rate converter enabled or disabled)
同步控制方式有脉冲同步和连续同步两种。同步模式由ID/SYNC寄存器的SYNC位编程。
4.4.1 脉冲同步模式
脉冲同步模式无条件同步SYNC上升沿上的ADC。当同步时,内部过滤器内存复位,DRDY变高,过滤器周期重新开始。以下63个DRDY周期被禁用,以允许数字滤波器沉降。当转换数据准备好时,DRDY断言为低。
4.4.2 连续同步模式
连续同步模式提供了接受连续时钟信号到同步引脚的选项。ADC将SYNC时钟信号的周期与DRDY信号的N个周期进行比较,以确定是否可以重新同步。
最初,第一个SYNC正边同步ADC。只有当SYNC的上升沿在N多个DRDY周期之间的时间间隔相差至少±1个fCLK周期时,才会发生重新同步,其中N = 1,2,3等等。否则,SYNC时钟周期与已经存在的DRDY脉冲处于同步状态,不会发生重同步。请注意,当采样率转换器启用时,不能使用连续同步模式。
同步完成后,DRDY继续脉冲;然而,数据保持低63个数据周期,以允许数字滤波器沉淀。由于数字滤波器的初始延迟,同步输入信号和DRDY脉冲表现出偏移时间。偏移时间是数据速率的函数。
4.5 采样率转换器
采样率转换器(SRC)通过对调制器数据以写入SRC寄存器的补偿因子设定的新速率重新采样来补偿时钟频率误差。频率补偿范围为±244ppm,分辨率为7.45 ppb(1 / 227)。
时钟频率误差通过向SCR0和SRC1寄存器写入一个值来补偿。寄存器值为2补码格式,用于正负频率误差补偿。正寄存器数据值降低数据速率频率(增加周期)。新的数据速率频率由DRDY信号的频率观测到。
频率补偿样例如下表所示。8000h禁用采样率转换器。0000h使数据不加补偿地通过,但在同步输入到DRDY脉冲的时间延迟上增加了8 / fCLK延迟。
4.6 偏置和增益校准
ADC集成了校准寄存器来校正偏移和增益误差。如下图所示,从滤波器数据中减去24位偏移量(offset[23:0]),然后乘以24位增益值(gain[23:0]),再除以400000h。数据被裁剪为32位以产生最终输出。当高通滤波器启用时,偏移操作被绕过。
4.6.1 偏移寄存器
偏移量校正是由一个24位字组成的三个8位寄存器(高地址是MSB)。偏移值左对齐以与32位数据对齐。偏移值为2补码,最大正值为7FFFFFh,最大负值为800000h。从转换数据中减去OFFSET;如下表所示。
偏置误差通过带输入短多路复用器选项的偏置校准命令或通过收集短输入ADC数据并将值写入寄存器来纠正。
虽然偏置校正范围从-FS到+FS,但偏置和增益校正的总和不得超过未校准范围的106%。
当高通滤波器被启用时,偏移校正被禁用。偏移值被用作起始值,以缩短高通滤波器的沉降时间。要重新加载偏移值到HPF,请禁用并重新启用高通滤波器。
4.6.2 增益寄存器
增益校正是通过一个24位字,由三个8位寄存器(高地址= MSB)组成。增益值为24位,用直二进制编码,对于gain[23:0],归一化为1.0,等于400000h。应用校准信号后,通过增益校准命令或通过收集ADC数据并将计算值写入增益寄存器来校准增益误差。下表列出了GAIN[23:0]寄存器值的示例。
虽然增益值的范围可以大于或小于1,但偏置和增益校正的总和不得超过未校准范围的106%。
4.6.3 校准步骤
可以使用ADC校准命令或手动校准来执行ADC校准。
校准程序如下:
1.选择PGA或缓冲操作,输入通道和PGA增益条件进行校准。
2.预置OFFSET寄存器= 000000h和GAIN寄存器= 400000h。
3.禁用高通滤波器进行偏移校准。短输入到系统,或使用输入MUX提供输入。系统级输入短可以产生更精确的校准。输入确定后,发送OFSCAL命令或执行手动校准。
a. OFSCAL命令。命令发出后,DRDY在81个转换周期后被驱动至低电平,表示校准完成。OFFSET寄存器用新的校准值更新。如下图所示,第一个数据输出使用新的OFFSET值。
b.手动校准。等待数字滤波器至少64次转换,然后平均一些数据点,以提高校准精度。将该值写入24位OFFSET寄存器。
4.施加增益校准电压。输入确定后,发送GANCAL命令或执行手动校准。
a.GANCAL命令。施加正直流满量程校准电压。命令发出后,DRDY在81个转换周期后被驱动至低电平,表示校准完成。ADC计算增益,使满量程码等于应用的校准信号。如下图所示,第一个数据输出使用新的“GAIN”值。
b.手动校准。对采样率或略低于满量程(例如,增益= 1时为2.4 V)的直流校准信号应用交流相干信号。使用小于满量程的校准信号可防止截断输出代码,否则会导致不正确的校准。等待64转换的数字滤波器解决,然后平均一些数据点,以提高校准精度。对于交流信号校准,使用一些相干信号周期来计算均方根值。
五、编程
相关的SPI接线在这里就不再详细介绍了,只介绍较为重要的命令和接口。
5.1 数据准备(DRDY)接口
DRDY是一个active-low输出,表示转换数据准备就绪。无论CS的状态如何,DRDY都是活动的。DRDY在SCLK的第一个下降沿上被驱动为高电平,无论是否正在读取数据或输入命令。如下图所示,如果没有检索到数据,DRDY脉冲为8个fCLK周期。
5.2 数据转换格式
如下表所示,转换数据采用32位2补码格式,表示正负数。如果需要,可以将CS调高,将数据读取操作缩短为24位。来自Sinc滤波器的数据缩放取决于VREF的值以及PGA或缓冲区操作。
5.3 命令
ADC的命令如下表所示。大多数命令的长度都是一个字节。然而,寄存器读和写命令的字节数取决于命令中指定的寄存器数据的数量。
5.3.1 单字节命令
单字节命令的一般格式如下图所示
5.3.2 WAKEUP命令
WAKEUP命令用来退出备用模式,恢复系统正常运行。如果ADC已经上电,则该命令为no operation (NOP)。当退出备用模式时,ADC需要重新同步。
5.3.3 STANDBY命令
STANDBY命令进入软件下电模式。ADC通过WAKEUP命令退出软件下电模式。
5.3.4 SYNC命令
SYNC命令用来同步ADC。同步发生在SYNC命令字节的第8位。同步时,当前转换停止并重新启动。如果需要使用软件命令同步多个ADC,需要同时向所有设备下发命令。使用该命令时,SYNC引脚必须为高电平。
5.3.5 RESET命令
RESET命令用来复位ADC。
5.3.6 直接读取数据
读取转换数据有两种方法:直接读取数据和命令读取数据。
直接读取数据不需要命令,而是在DRDY降低后,只需应用SCLK来读取数据。
读数据直接操作如下图所示。当DRDY低时,取CS低开始读操作。
CS低导致DOUT从三态模式转换到数据MSB的输出。数据在SCLK的上升沿上读取,在SCLK的下降沿上更新。DRDY在SCLK的第一个下降沿返回高值。
读32位数据后DOUT是低的。要在新数据可用之前再次读取相同的数据,请使用RDATA命令。
读取转换数据时保持DIN低。如果发送了RDATA(读转换数据)或RREG(读寄存器数据)命令,输出数据会因该命令而中断。如果在读取操作期间DRDY降低,则除非读取至少三个字节的旧数据,否则新数据将丢失。
5.3.7 读转换数据命令
RDATA命令(如下图)用于在同一转换周期内重新读取数据或读取被读寄存器命令中断的数据。在这两种情况下,DRDY都是高的,因为DRDY在前一个操作的第一个SCLK上被驱动为高。如果DRDY值高,第一个输出字节是0,后面跟着data。如果为低,则第一个输出字节是转换数据的字节1,它将为输出字节2重新启动。
5.3.8 RREG:读寄存器命令
RREG命令读取寄存器数据。该命令由两个字节组成,后面跟着指定寄存器字节数的输出。ADC自动将地址递增到命令的第2字节中指定的寄存器数。递增地址不换行。该命令的第一个字节是添加到寄存器起始地址的操作码,第二个字节是要读取的寄存器数- 1。
--第一个命令字节:0010 rrrr,其中rrrr是起始寄存器地址
--第二个命令字节:0000 nnnn,其中nnnn是要读取的寄存器数减去1
下图给出了一个从寄存器地址01h开始的3个寄存器读操作的示例。第一个寄存器数据出现在DOUT上,位于SCLK的第16个下降沿。数据被锁存在SCLK的上升沿上。
5.3.9 WREG:写寄存器命令
WREG命令用于写寄存器数据。该命令是两个字节,后面跟着要写入的指定寄存器字节数。ADC自动将地址递增到命令中指定的寄存器数。递增地址不换行。该命令的第一个字节是添加到寄存器起始地址的操作码,第二个字节是要写入的寄存器数- 1。
--第一个命令字节:0100 rrrr,其中rrrr是第一个寄存器的起始地址。
--第二个命令字节:0000 nnnn,其中nnnn是要写入的寄存器数- 1。
数据字节:取决于指定的寄存器数。
5.4 寄存器
5.4.1 ID/SYNC寄存器
5.4.2 CONFIG0寄存器
5.4.3 CONFIG1寄存器
5.4.4 HPF0, HPF1寄存器
5.4.5 OFFSET0, OFFSET1, OFFSET2寄存器
5.4.6 GAIN0, GAIN1, GAIN2寄存器
5.4.7 GPIO寄存器
5.4.8 SRC0, SRC1寄存器
六、代码
ADS1285.C文件
#include "ADS1285.h"
#include "MCT8316.h"
#include "spi.h"
#include "math.h"uint8_t readData[4] ={0x00};uint8_t data[20] = {0x00};uint32_t readDataFinal = 0x0000000;uint32_t offsetFinal = 0x0000000,gainFinal = 0x0000000;uint8_t readData1,readData2,readData3,readData4;// 直接读取数据
void Direct_Read_Data(uint8_t * Data)
{int i = 0;uint8_t command;uint8_t data_temp;while(DRDY);ADC_X_CS_LOW; // 拉低CS引脚for(i=0;i<4;i++){HAL_SPI_Receive(&hspi2,(uint8_t *)&Data[i],1,50);// 读取数据}readDataFinal = (Data[0]<<24)|(Data[1]<<16)|(Data[2]<<8)|(Data[3]);ADC_X_CS_HIGH; // 拉低CS引脚HAL_Delay(1);
}// 读取数据,指令--0x12
void ReadConversionData(uint8_t * Data,uint8_t command)
{int i = 0;ADC_X_CS_LOW; // 拉低CS引脚HAL_SPI_Transmit(&hspi2,(uint8_t *)&command,1,10);for(i=0;i<4;i++){HAL_SPI_Receive(&hspi2,(uint8_t *)&Data[i],1,10);// 读取数据}readDataFinal = (Data[0]<<24)|(Data[1]<<16)|(Data[2]<<8)|(Data[3]);ADC_X_CS_HIGH; // 拉低CS引脚 }
// 写寄存器
uint8_t writeData = 0;
void WriteReg(uint8_t *writeRegData, uint8_t number,uint8_t first)
{uint8_t i=0;// 要写入的数据uint8_t subNumber = number - 1;writeRegData[0] = first;writeRegData[1] = subNumber; // 将代码个数写入ADC_X_CS_LOW; // 拉低CS引脚for(i=0;i<number+2;i++){writeData = writeRegData[i];HAL_SPI_Transmit(&hspi2,(uint8_t *)&writeData,1,10);}ADC_X_CS_HIGH; // 拉高CS引脚
}
// 读寄存器的值
void ReadReg(uint8_t const startAddr, uint8_t *regData, uint8_t number)
{uint8_t writeReadData = 0,i,readDataTemp = 0;ADC_X_CS_LOW; // 拉低CS引脚writeReadData = (0x02<<4)|startAddr;HAL_SPI_Transmit(&hspi2,(uint8_t *)&writeReadData,1,10);writeReadData = (0x00<<4)|(number - 1);HAL_SPI_Transmit(&hspi2,(uint8_t *)&writeReadData,1,10);for(i=0;i<number;i++){HAL_SPI_Receive(&hspi2,(uint8_t *)&readDataTemp,1,10);// 读取数据regData[i] = readDataTemp;}offsetFinal = (regData[2]<<16) | (regData[1]<<8) | (regData[0]);gainFinal = (regData[5]<<16) | (regData[4]<<8) | (regData[3]);ADC_X_CS_HIGH; // 拉高CS引脚
}
// 初始化:
void ADS1285_Init(uint8_t const startAddr,uint8_t number)
{data[0] = (0x04<<4)|startAddr;// 地址data[1] = number - 1; // 写入的寄存器个数data[2] = (0x00<<7)|PULSEMODE; // (0x00<<7)|CONTINUOUSMODEdata[3] = (MIDPOWER<<6)|(SPS250<<3)|(MINI_PHS<<2)|FILTER_RES ; // 00011011 (HIGHPOWER<<6)|(SPS1000<<3)|(LINEAR_PHS<<2)|FIR // 0100 0011data[4] = (INPUT_1<<5) | (REF_4_096V<<3) | GAIN_1; // 00001000
// data[5] = ;
// data[6] = ;
// data[7] = ;
// data[8] = ; WriteReg(data,number,data[0]);
}
// 写入单个寄存器
void SingleByteCommand(uint8_t command)
{ADC_X_CS_LOW; // 拉低CS引脚HAL_SPI_Transmit(&hspi2,(uint8_t *)&command,1,10);ADC_X_CS_HIGH; // 拉高CS引脚
}
ADS1285.h文件
#ifndef ADS1285_H
#define ADS1285_H
#include "stm32L4xx_hal.h"// 寄存器地址
#define ID_SYNC_REG 0x00
#define CONFIG0_REG 0x01
#define CONFIG1_REG 0x02
#define HPF0_REG 0x03
#define HPF1_REG 0x04
#define OFFSET0_REG 0x05
#define OFFSET1_REG 0x06
#define OFFSET2_REG 0x07
#define GAIN0_REG 0x08
#define GAIN1_REG 0x09
#define GAIN2_REG 0x0A
#define GPIO_REG 0x0B
#define SRC0_REG 0x0C
#define SRC1_REG 0x0D// 命令:
#define WAKEUP 0x00
#define STANDBY 0x02
#define SYNC 0x04
#define ADS1285_RESET 0x06
#define RDATA 0x12
#define OFSCAL 0x60
#define GANCAL 0x61// 个寄存器位:
#define PULSEMODE 0
#define CONTINUOUSMODE 1#define HIGHPOWER 0
#define MIDPOWER 1
#define LOWPOWER 2
#define DePOWER 3#define SPS250 0
#define SPS500 1
#define SPS1000 2
#define SPS2000 3
#define SPS4000 4#define LINEAR_PHS 0
#define MINI_PHS 1#define FILTER_RES 0
#define SINC 1
#define FIR 2
#define FIR_IIR 3#define INPUT_1 0
#define INPUT_2 1
#define INTERNAL_400 2
#define INPUT_1andINPUT_2 3
#define RESERVED_4 4
#define INTERNAL_0 5
#define RESERVED_6 6
#define RESERVED_7 7#define REF_5V 0
#define REF_4_096V 1
#define REF_2_5V 2
#define RESERVED 3#define GAIN_1 0
#define GAIN_2 1
#define GAIN_4 2
#define GAIN_8 3
#define GAIN_16 4
#define GAIN_32 5
#define GAIN_64 6
#define BUFFER 7// ADS1285 DRDY引脚,若是该引脚为低电平,则表示数据转换完成
#define DRDY HAL_GPIO_ReadPin(ADS_X_DRDY_GPIO_Port, ADS_X_DRDY_Pin)
// CS引脚
#define ADC_X_CS_LOW HAL_GPIO_WritePin(ADC_X_CS_GPIO_Port, ADC_X_CS_Pin,0)
#define ADC_X_CS_HIGH HAL_GPIO_WritePin(ADC_X_CS_GPIO_Port, ADC_X_CS_Pin,1)extern uint8_t readData[4];// 写入单个字节
void SingleByteCommand(uint8_t command);
// 直接读取数据,DRDY引脚拉点之后,将CS引脚拉低,然后读取数据
void Direct_Read_Data(uint8_t * Data);
// 读取数据
void ReadConversionData(uint8_t * Data,uint8_t command);
// 读取寄存器,穿入起始地址和读取寄存器的个数
void ReadReg(uint8_t startAddr, uint8_t *regData, uint8_t number);
// 写入寄存器,穿入起始地址和读取寄存器的个数
void WriteReg(uint8_t *writeRegData, uint8_t number,uint8_t first);
// 初始化
void ADS1285_Init(uint8_t const startAddr,uint8_t number);#endif
七、往期回顾
项目进展(一)-晶振正常输出、焊接驱动芯片、查找芯片手册并学习
项目进展(二)-配置MCT8316ZR芯片,主要学习如何根据数据手册配置外设等
项目进展(三)-电机驱动起来了,发现了很多关键点,也遇到了一些低级错误
项目进展(四)-双电机均可驱动,配置模拟SPI,调平仪功能初步实现!
项目进展(五)-修复PCB电路板,学习32位ADC芯片ADS1285
项目进展(六)-继续学习32位ADC芯片ADS1285
项目进展(七)-焊接ADS1285及其外围电路,学习芯片的SPI部分
项目进展(八)-编写代码,驱动ADS1285
项目进展(九)-完善ADS1285代码
项目进展(十)-解决ADS1285在调试时出现的问题