AD1255/AD1256硬件SPI开发实战与跳坑过程
以上图片我们可以知道在t17阶段,数据是不能被读取的。另外最小是16个τCLKIN,具体是多少这个跟你配置的DATA_rate的设置有关系。
1.6 同步SYNC的时序
要同步SYNC,要么采用管脚SYNC,要么发出SYNC的命令。这里我们打算采用的是发出SYNC命令。
2、分立部件
2.1 INPUT MULTIPLEXER输入通道选择器
同一时刻,只能有一个通道输入,所以输入通道的选择控制由 MULTIPLEXER 寄存器控制。AINp是正,如果采用单端输
入,那么AINN则接地。
提醒:
2.2 OPEN/SHORT SENSOR DETECTION 开路/短路的传感器检测
传感器检测电流源(SDCS)提供了一种方法来验证连接到ADS1255/6的外部传感器的完整性。(说实话,我没看懂,尴尬)
没关系,我们采用关闭这个传感器检测。我个人猜的话,可能就是用于判断是否给模拟输入端输入了信号,是否是开路还是短路状态。
当SDCS使能的时候,ADS1256将会自动的打开模拟输入端的buffer,无视buffer的bit位设置。这样做可以防止输入信号从SDCS中加载信号。
总而言之,模拟的部分,我没看太懂,但是我们可以知道的是开了SDCS的话,就可以防止在开路短路的时候测量。
2.3 PGA(可编程的增益放大器)
上述表格的意义就很有意思了,PGA的设置也不是随便设置的,当要测量特别小的信号时候,PGA就非常有用了,这一点要根据满量程最大的输入电压选择合适的PGA。PGA的设置在ADCON寄存器中。
重要:
在改变PGA的设置后,需要重新校准A/D转换器
2.4 DIGITAL FILTER(数字滤波器)
可以权衡数据速率(采样率)和分辨率。
数据速率的配置在DRATE里面设置。
以下是幅频响应
3 模式
首先要说一下在AD1256这款芯片里面,有SETTLING TIME这个概念。
The settling time指的是从模拟输入端到数字滤波器的传播延时,对于不同的数据速率,The SETTLING TIME对应不同。使用不同的模式,会产生不同的setting time。
这个都没关系DRDY_n作为输入信号,ADS1256会发出低电平指示我们可以开始读取数据了。
以下都是基于buffer、PGA、datarate的初始化设置完毕后。采取的模式选择。
3.1 单通道同步模式
在初始化完毕后,发送同步命令、或者通过SYNC/PWND的管脚发出的同步命令后,进入setting time (t18)。
然后在DRDY_n在低电平的时候后发出RDATA命令,接着读取即可。
这种模式也是十分简单的。
3.2 使用输入选择器切换通道
最有效的切换(cycle through)改变输入通道的方式就是使用WREG 命令给MUX寄存器,在DRDY_n变低后,发出WREG命令,然后改变通道,通过发出SYNC和WAKEUP的命令重新启动转换,并且以RDATA发出命令后读取数据。并且这里我们要注意了,当输入通道切换时,我们完全没有必要丢弃数据,因为ADS1256在DRDY_n走低前,就可以完全获得稳定的数据指示读取数据已经准备好了。不过读取数据,是读取的上一个通道的数据。当DRDY_n再次走低的时候吧,通过更新多通道寄存器重复循环。
3.3 使用单触发模式(节能模式)
使用STANDBY 命令可以让功耗大量的减小,通过发出wakeup命令可以从待机模式到单触发转换。使用这种模式,会有一个额外的延时需要用于ADC的调制器的启动和稳定。
3.4 连续转换模式(RDATAC)
这种模式的意思就是说,转换只需要一RDATAC,而不需要发送一个rdata,读取一个DOUT。
使用这种连续转换的读取方式,是在同步、输入寄存器改变后,或者从待机模式下唤醒后,都可以使用这种连续读取的方式。这种方式其他都一样,只不过读取不再是使用发送一个rdata,然后读取数据。而是只需要发送一次rdatac后,以后就在drdy_n的低电平,直接读取数据,即可。不过这个取决于DRDY_n的周期个数。下图是不同的SPS对应的DRDY_n的周期。如果不按照周期读取,那么可能读到旧数据和新数据的混合物。
所以,这种连续读取的模式,我不太建议,这里我们不做实现。就算实现,我觉得也只能在单通道的采集的情况下实现好点。
4、校准
OFC校准:offset calibration
FSC校准: full-scale calibration
DRDY_n goes high when calibration begins and remains so until settled data is ready afterwards.
DRDY_n会一直走高,当校准开始时,直到数据准备完毕。
下面这段话就很关键了,在reset复位后、上电后、buffer改变、数据率改变、PGA改变后都要执行自校验。
以下是在不同数据率下理想的OFC和FSC,但是这点都不重要,我们交给系统自动校验即可,不用专门通过寄存器的方式写入。
4.1自校准 self-calibration
以上官方建议,强烈推荐上电后使用SELFCAL命令。虽然配置了自动自校验。
使用SELFOCAL、SELFGCAL、SELFCAL这三个命令
/*
*********************************************************************************************************
*
* 模块名称 : ADS125X 驱动模块(8通道带PGA的24位ADC)
* 文件名称 : bsp_ADS125X.h
*
* Copyright (C), 2013-2014, 安富莱电子 www.armfly.com
*
*********************************************************************************************************
*/
#ifndef _BSP_ADS125X_H
#define _BSP_ADS125X_H
#include "main.h"
#define ADC_DEBUG 0
// define commands
#define ADS1256_CMD_WAKEUP 0x00
#define ADS1256_CMD_RDATA 0x01
#define ADS1256_CMD_RDATAC 0x03
#define ADS1256_CMD_SDATAC 0x0f
#define ADS1256_CMD_RREG 0x10
#define ADS1256_CMD_WREG 0x50
#define ADS1256_CMD_SELFCAL 0xf0
#define ADS1256_CMD_SELFOCAL 0xf1
#define ADS1256_CMD_SELFGCAL 0xf2
#define ADS1256_CMD_SYSOCAL 0xf3
#define ADS1256_CMD_SYSGCAL 0xf4
#define ADS1256_CMD_SYNC 0xfc
#define ADS1256_CMD_STANDBY 0xfd
#define ADS1256_CMD_REST 0xfe
// define the ADS1256 register values
#define ADS1256_STATUS 0x00
#define ADS1256_MUX 0x01
#define ADS1256_ADCON 0x02
#define ADS1256_DRATE 0x03
#define ADS1256_IO 0x04
#define ADS1256_OFC0 0x05
#define ADS1256_OFC1 0x06
#define ADS1256_OFC2 0x07
#define ADS1256_FSC0 0x08
#define ADS1256_FSC1 0x09
#define ADS1256_FSC2 0x0A
// define multiplexer codes
#define ADS1256_MUXP_AIN0 0x00
#define ADS1256_MUXP_AIN1 0x10
#define ADS1256_MUXP_AIN2 0x20
#define ADS1256_MUXP_AIN3 0x30
#define ADS1256_MUXP_AIN4 0x40
#define ADS1256_MUXP_AIN5 0x50
#define ADS1256_MUXP_AIN6 0x60
#define ADS1256_MUXP_AIN7 0x70
#define ADS1256_MUXP_AINCOM 0x80
#define ADS1256_MUXN_AIN0 0x00
#define ADS1256_MUXN_AIN1 0x01
#define ADS1256_MUXN_AIN2 0x02
#define ADS1256_MUXN_AIN3 0x03
#define ADS1256_MUXN_AIN4 0x04
#define ADS1256_MUXN_AIN5 0x05
#define ADS1256_MUXN_AIN6 0x06
#define ADS1256_MUXN_AIN7 0x07
#define ADS1256_MUXN_AINCOM 0x08
// define gain codes
#define ADS1256_GAIN_1 0x00
#define ADS1256_GAIN_2 0x01
#define ADS1256_GAIN_4 0x02
#define ADS1256_GAIN_8 0x03
#define ADS1256_GAIN_16 0x04
#define ADS1256_GAIN_32 0x05
#define ADS1256_GAIN_64 0x06
//#define ADS1256_GAIN_64 0x07
//define drate codes
#define ADS1256_DRATE_30000SPS 0xF0
#define ADS1256_DRATE_15000SPS 0xE0
#define ADS1256_DRATE_7500SPS 0xD0
#define ADS1256_DRATE_3750SPS 0xC0
#define ADS1256_DRATE_2000SPS 0xB0
#define ADS1256_DRATE_1000SPS 0xA1
#define ADS1256_DRATE_500SPS 0x92
#define ADS1256_DRATE_100SPS 0x82
#define ADS1256_DRATE_60SPS 0x72
#define ADS1256_DRATE_50SPS 0x63
#define ADS1256_DRATE_30SPS 0x53
#define ADS1256_DRATE_25SPS 0x43
#define ADS1256_DRATE_15SPS 0x33
#define ADS1256_DRATE_10SPS 0x23
#define ADS1256_DRATE_5SPS 0x13
#define ADS1256_DRATE_2_5SPS 0x03
//void Init_ADS1256_GPIO(void);
//void Delay(unsigned int dal);
void ADS1256_Init(uint8_t PGA); //初始化ADS1256
int32_t ADS1256ReadData(void);
int32_t ADS_sum(unsigned char road);
int32_t ADS_Diff(unsigned char channel);
#endif
/***************************** 安富莱电子 www.armfly.com (END OF FILE) *********************************/
#include "bsp_ads125x.h"
#include "main.h"
/*
ADS125X基本特性:
1、模拟部分供电5V;
2、SPI数字接口电平:3.3V
3、PGA设置范围: 1、2、4、8、16、32、64、
4、参考电压2.5V (推荐缺省的,外置的)
5、输入电压范围:PGA = 1 时, 可输入正负5V
6. 自动校准 (当设置了PGA,BUF使能、数据采样率时,会启动自校准)
7. 输入的缓冲器可设置启用和关闭(一般选启用)
外部晶振频率 = 7.68MHz,
时钟频率 tCLK = 1/7.68M = 0.13uS
输出数据周期 tDATA = 1 / 30K = 0.033mS (按30Ksps计算)
对SPI的时钟速度要求: (ADS125X.pdf page 6)
最快 4个tCLK = 0.52uS
最慢 10个tDATA = 0.3mS (按 30Ksps 计算)
SCL高电平和低电平持续时间最小 200ns
RREG, WREG, RDATA 命令之后,需要延迟 4 * tCLK = 0.52uS;
RDATAC, RESET, SYNC 命令之后,需要延迟 24 * tCLK = 3.12uS;
实际测试,在3.3V上电后, 及时不做任何配置,ADS125的DRDY 口线即开始输出脉冲信号(2.6us高,33.4低,频率30KHz)
*/
/*
调试记录
(1) 设置寄存器时,SCK过快导致芯片不能每次都收到数据。原因: 发送的相邻的字节之间需要延迟一小段时间.
(2) 连续复位CPU时,偶尔出现芯片输出采样率异常。
*/
/* 定义口线置0和置1的宏 */
#define RESET_0() HAL_GPIO_WritePin(SPI2_RST_GPIO_Port, SPI2_RST_Pin,GPIO_PIN_RESET);//GPIO_ResetBits(SPI2_RST_GPIO_Port, SPI2_RST_Pin)
#define RESET_1() HAL_GPIO_WritePin(SPI2_RST_GPIO_Port, SPI2_RST_Pin,GPIO_PIN_SET);
#define CS_0() HAL_GPIO_WritePin(SPI2_CS_GPIO_Port, SPI2_CS_Pin,GPIO_PIN_RESET);
#define CS_1() HAL_GPIO_WritePin(SPI2_CS_GPIO_Port, SPI2_CS_Pin,GPIO_PIN_SET);
#define SCK_0() HAL_GPIO_WritePin(SPI2_CLK_GPIO_Port, SPI2_CLK_Pin,GPIO_PIN_RESET);
#define SCK_1() HAL_GPIO_WritePin(SPI2_CLK_GPIO_Port, SPI2_CLK_Pin,GPIO_PIN_SET);
#define DI_0() HAL_GPIO_WritePin(SPI2_DIN_GPIO_Port, SPI2_DIN_Pin,GPIO_PIN_RESET);
#define DI_1() HAL_GPIO_WritePin(SPI2_DIN_GPIO_Port, SPI2_DIN_Pin,GPIO_PIN_SET);
#define DO_IS_HIGH() (HAL_GPIO_ReadPin(SPI2_DOUT_GPIO_Port, SPI2_DOUT_Pin) == GPIO_PIN_SET)
#define DRDY_IS_LOW() (HAL_GPIO_ReadPin(SPI2_NDY_GPIO_Port, SPI2_NDY_Pin ) == GPIO_PIN_RESET)
void ADS1255_SELFCAL(void);
void ADS1255_SELFOCAL(void);
void ADS1255_SELFGCAL(void);
void ADS1255_SYSOCAL(void);
void ADS1255_WAKEUP(void);
void ADS1255_RESET(void);
void ADS1255_SYNC(void);
void ADS1255_RDATAC(void);
uint8_t choice_flag=0;
/*
*********************************************************************************************************
* 函 数 名: delay_us
* 功能说明: 配置STM32的GPIO和SPI接口,用于连接 ADS125X
* 形 参: 无
* 返 回 值: 无
*********************************************************************************************************
*/
void delay_us(uint32_t udelay)
{
uint32_t Delay = udelay * 120/4;
do
{
__NOP();
}
while (Delay --);
}
/*
*********************************************************************************************************
* 函 数 名: bsp_InitADS125X
* 功能说明: 配置STM32的GPIO和SPI接口,用于连接 ADS125X
* 形 参: 无
* 返 回 值: 无
*********************************************************************************************************
*/
void bsp_InitADS125X(void)
{
RESET_1();
CS_1();
SCK_0(); /* SPI总线空闲时,钟线是低电平 */
DI_1();
HAL_Delay(100);
RESET_0();
HAL_Delay(100);
RESET_1();
HAL_Delay(100);
CS_1();
HAL_Delay(1);
SCK_0(); /* SPI总线空闲时,钟线是低电平 */
HAL_Delay(1);
CS_0();
HAL_Delay(1);
}
//几个延时
static void ADS125X_DelaySCLK(void)//F103 72M
{
uint16_t i;
for(i = 0; i < 5; i++);//0.5us
}
void ADS125X_Delay_1us(uint16_t t)//F103 72M
{
uint16_t i, j;
for(j = 0; j < t; j++)
{
for(i = 0; i < 10; i++);//1us
}
}
static void ADS1256_DelayDATA(void)
{
/*
Delay from last SCLK edge for DIN to first SCLK rising edge for DOUT: RDATA, RDATAC,RREG Commands
最小 50 个tCLK = 50 * 0.13uS = 6.5uS
*/
ADS125X_Delay_1us(10); /* 最小延迟 6.5uS, 此处取10us */
}
/*
*********************************************************************************************************
* 函 数 名: ADS125X_Send8Bit
* 功能说明: 向SPI总线发送8个bit数据。 不带CS控制。
* 形 参: _data : 数据
* 返 回 值: 无
*********************************************************************************************************
*/
static void ADS125X_Send8Bit(uint8_t _data)
{
uint8_t i;
/* 连续发送多个字节时,需要延迟一下 */
ADS125X_DelaySCLK();
ADS125X_DelaySCLK();
/* ADS125X 要求 SCL高电平和低电平持续时间最小 200ns */
for(i = 0; i < 8; i++)
{
if(_data & 0x80)
{
DI_1();
}
else
{
DI_0();
}
SCK_1();
ADS125X_DelaySCLK();
_data <<= 1;
SCK_0(); /* <---- ADS125X 是在SCK下降沿采样DIN数据, 数据必须维持 50nS */
ADS125X_DelaySCLK();
}
}
/*
*********************************************************************************************************
* 函 数 名: ADS125X_Recive8Bit
* 功能说明: 从SPI总线接收8个bit数据。 不带CS控制。
* 形 参: 无
* 返 回 值: 无
*********************************************************************************************************
*/
static uint8_t ADS125X_Recive8Bit(void)
{
uint8_t i;
uint8_t read = 0;
ADS125X_DelaySCLK();
/* ADS125X 要求 SCL高电平和低电平持续时间最小 200ns */
for(i = 0; i < 8; i++)
{
SCK_1();
ADS125X_DelaySCLK();
read = read << 1;
SCK_0();
if(DO_IS_HIGH())
{
read++;
}
ADS125X_DelaySCLK();
}
return read;
}
//ADS1256 写数据
//向ADS1256中地址为regaddr的寄存器写入一个字节databyte
void ADS1256WREG(unsigned char regaddr, unsigned char databyte)
{
CS_0();
//向寄存器写入数据地址
ADS125X_Send8Bit(ADS1256_CMD_WREG | (regaddr & 0x0F));
//写入数据的个数n-1
ADS125X_Send8Bit(0x00);
//向regaddr地址指向的寄存器写入数据databyte
ADS125X_Send8Bit(databyte);
CS_1();
}
//ADS1255读寄存器
//说明:根据要求写入寄存器地址
unsigned char ADS1256RREG(unsigned char regaddr)
{
unsigned char reg_date;
CS_0();
//向寄存器写入数据地址
ADS125X_Send8Bit(regaddr | ADS1256_CMD_RREG);
//写入数据的个数n-1
ADS125X_Send8Bit(0x00);
reg_date = ADS125X_Recive8Bit();
CS_1();
return reg_date;
}
//ADS1255写寄存器
void ADS1256_WriteCmd(unsigned char _cmd)
{
CS_0();
ADS125X_Send8Bit(_cmd);
CS_1();
}
//设置单端采集通道
void ADS1256_SetChannal(uint8_t _ch)
{
/*
Bits 7-4 PSEL3, PSEL2, PSEL1, PSEL0: Positive Input Channel (AINP) Select
0000 = AIN0 (default)
0001 = AIN1
0010 = AIN2 (ADS1256 only)
0011 = AIN3 (ADS1256 only)
0100 = AIN4 (ADS1256 only)
0101 = AIN5 (ADS1256 only)
0110 = AIN6 (ADS1256 only)
0111 = AIN7 (ADS1256 only)
1xxx = AINCOM (when PSEL3 = 1, PSEL2, PSEL1, PSEL0 are ?°don?ˉt care?±)
NOTE: When using an ADS1255 make sure to only select the available inputs.
Bits 3-0 NSEL3, NSEL2, NSEL1, NSEL0: Negative Input Channel (AINN)Select
0000 = AIN0
0001 = AIN1 (default)
0010 = AIN2 (ADS1256 only)
0011 = AIN3 (ADS1256 only)
0100 = AIN4 (ADS1256 only)
0101 = AIN5 (ADS1256 only)
0110 = AIN6 (ADS1256 only)
0111 = AIN7 (ADS1256 only)
1xxx = AINCOM (when NSEL3 = 1, NSEL2, NSEL1, NSEL0 are ?°don?ˉt care?±)
*/
if(_ch > 2)
{
return;
}
ADS1256WREG(ADS1256_MUX, (_ch << 4) | (1 << 3)); /* Bit3 = 1, AINN 1ì?¨?ó AINCOM */
}
// 设置差分采集通道
void ADS1256_SetDiffChannal(uint8_t _ch)
{
/*
Bits 7-4 PSEL3, PSEL2, PSEL1, PSEL0: Positive Input Channel (AINP) Select
0000 = AIN0 (default)
0001 = AIN1
0010 = AIN2 (ADS1256 only)
0011 = AIN3 (ADS1256 only)
0100 = AIN4 (ADS1256 only)
0101 = AIN5 (ADS1256 only)
0110 = AIN6 (ADS1256 only)
0111 = AIN7 (ADS1256 only)
1xxx = AINCOM (when PSEL3 = 1, PSEL2, PSEL1, PSEL0 are ?°don?ˉt care?±)
NOTE: When using an ADS1255 make sure to only select the available inputs.
Bits 3-0 NSEL3, NSEL2, NSEL1, NSEL0: Negative Input Channel (AINN)Select
0000 = AIN0
0001 = AIN1 (default)
0010 = AIN2 (ADS1256 only)
0011 = AIN3 (ADS1256 only)
0100 = AIN4 (ADS1256 only)
0101 = AIN5 (ADS1256 only)
0110 = AIN6 (ADS1256 only)
0111 = AIN7 (ADS1256 only)
1xxx = AINCOM (when NSEL3 = 1, NSEL2, NSEL1, NSEL0 are ?°don?ˉt care?±)
*/
if(_ch == 0)
{
ADS1256WREG(ADS1256_MUX, (0 << 4) | 1); /* 差分输入 AIN0, AIN1 */
}
else if(_ch == 1)
{
ADS1256WREG(ADS1256_MUX, (2 << 4) | 3); /* 差分输入 AIN2, AIN3 */
}
else if(_ch == 2)
{
ADS1256WREG(ADS1256_MUX, (4 << 4) | 5); /* 差分输入 AIN4, AIN5 */
}
else if(_ch == 3)
{
ADS1256WREG(ADS1256_MUX, (6 << 4) | 7); /* 差分输入 AIN6, AIN7 */
}
}
//等
void ADS1256_WaitDRDY(void)
{
uint32_t i;
for(i = 0; i < 40000000; i++)
{
if(DRDY_IS_LOW())
{
break;
}
}
if(i >= 40000000)
{
#if ADC_DEBUG
printf("ADS1256_WaitDRDY() Time Out ...\r\n"); /* 调试语句. 用语排错 */
#endif
}
}
//初始化ADS1256
void ADS1256_Init(uint8_t PGA)
{
/* 初始化 */
bsp_InitADS125X();
HAL_Delay(10);
/* 配置 */
ADS1256_WriteCmd(ADS1256_CMD_REST);
HAL_Delay(100);
ADS1256_WriteCmd(ADS1256_CMD_SYNC);
HAL_Delay(10);
ADS1256_WriteCmd(ADS1256_CMD_WAKEUP);
HAL_Delay(10);
/* AD配置 */
// ADS1256WREG(ADS1256_STATUS, 0x04); // 高位在前、自校准、不使用缓冲
ADS1256WREG(ADS1256_STATUS, 0x06); // 高位在前、自校准、使用缓冲测量低于3.5V
HAL_Delay(10);
ADS1256WREG(ADS1256_MUX, 0x08); // 初始化端口A0为‘+’,AINCOM位‘-’
// ADS1256WREG(ADS1256_MUX, 0x01); // 初始化端口A0为‘+’,A1位‘-’差分
HAL_Delay(10);
ADS1256WREG(ADS1256_ADCON, 0x00); //
ADS1256WREG(ADS1256_ADCON, PGA); // PGA设置增益倍 关闭 CLKOUT 引脚输出,关闭传感器检测,设置增益倍数1
HAL_Delay(10);
ADS1256WREG(ADS1256_DRATE, ADS1256_DRATE_50SPS); // 数据50sps
HAL_Delay(10);
ADS1256WREG(ADS1256_IO, 0x00);
HAL_Delay(10);
/* 校准 */
ADS125X_Send8Bit(0xF0);
HAL_Delay(100);
choice_flag=PGA;
}
//读取AD值
int32_t ADS1256ReadData(void)
{
uint32_t read = 0;
/* SPI片选 = 0 */
CS_0();
/* 读数据的命令 */
ADS125X_Send8Bit(ADS1256_CMD_RDATA);
/* 必须延迟才能读取芯片返回数据 */
ADS1256_DelayDATA();
/* 读采样结果,3个字节,高字节在前 */
read = ADS125X_Recive8Bit() << 16;
read += (ADS125X_Recive8Bit() << 8);
read += ADS125X_Recive8Bit();
/* SPI片选 = 1 */
CS_1();
/* 负数进行扩展。24位有符号数扩展为32位有符号数 */
if(read & 0x800000)
{
read += 0xFF000000;
}
return (int32_t)read;
}
uint8_t ADS1255_ReadID(void)
{
// uint8_t id=0;
// uint8_t buff;
// /*SPI??=0*/
// CS_0();
// /* 配置 */
// ADS1256_WriteCmd(ADS1256_CMD_RREG);
// HAL_Delay(100);
// ADS1256_WriteCmd(ADS1256_CMD_SYNC);
// HAL_Delay(10);
// ADS1256_WriteCmd(ADS1256_CMD_WAKEUP);
// HAL_Delay(10);
//
//
// buff=CMD_RREG|REG_STATUS;
// HAL_SPI_Transmit(&hspi2,&buff,1,SPIx_TIMEoUT_MAX);//SPI??
// buff=0x00;
// HAL_SPI_Transmit(&hspi2,&buff,1,SPIx_TIMEoUT_MAX);//SPI??
// while(HAL_GPIO_ReadPin(DRDY_GPIO_Port,DRDY_Pin));
// HAL_Delay(1);
// HAL_SPI_Receive(&hspi2,&id,1,SPIx_TIMEoUT_MAX);
// /*SPI??=1*/
// HAL_GPIO_WritePin(SPI2_NSS_GPIO_Port,SPI2_NSS_Pin,GPIO_PIN_SET);
// return (id>>4);
return 0;
}
//读取ADS1256单路数据
int32_t ADS_sum(unsigned char channel)
{
/* 等 */
// ADS1256_WaitDRDY();
/* 切换模拟通道 */
ADS1256_SetChannal(channel);//单端
// ADS1256_SetDiffChannal(0);//差分
ADS125X_Delay_1us(5);
/* 同步 */
ADS1256_WriteCmd(ADS1256_CMD_SYNC);
ADS125X_Delay_1us(5);
/* 唤醒 */
ADS1256_WriteCmd(ADS1256_CMD_WAKEUP);
ADS125X_Delay_1us(25);
/* 读取AD值,返回24位数据 */
return (int32_t)ADS1256ReadData();
}
//读取ADS1256差分数据
int32_t ADS_Diff(unsigned char channel)
{
/* 等 */
// ADS1256_WaitDRDY();
/* 切换模拟通道 */
// ADS1256_SetChannal(channel);//单端
ADS1256_SetDiffChannal(0);//差分
// ADS125X_Delay_1us(5);
/* 同步 */
ADS1256_WriteCmd(ADS1256_CMD_SYNC);
// ADS125X_Delay_1us(5);
/* 唤醒 */
ADS1256_WriteCmd(ADS1256_CMD_WAKEUP);
// ADS125X_Delay_1us(25);
/* 读取AD值,返回24位数据 */
return (int32_t)ADS1256ReadData();
}
![
](https://img-blog.csdnimg.cn/8c7d9be2773a4301a2435a995bc3408e.png)
当DRDY变为低电平时,可以读取AD值。
CS使能必须为低电平才能向ADC中读取数据。
山东博奥斯
https://www.bos-power.com/product/751.html