AD1255/AD1256硬件SPI开发实战与跳坑过程

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();
}



AD1255/AD1256硬件SPI开发实战与跳坑过程_第1张图片

AD1255/AD1256硬件SPI开发实战与跳坑过程_第2张图片

AD1255/AD1256硬件SPI开发实战与跳坑过程_第3张图片

AD1255/AD1256硬件SPI开发实战与跳坑过程_第4张图片

AD1255/AD1256硬件SPI开发实战与跳坑过程_第5张图片

AD1255/AD1256硬件SPI开发实战与跳坑过程_第6张图片

AD1255/AD1256硬件SPI开发实战与跳坑过程_第7张图片

AD1255/AD1256硬件SPI开发实战与跳坑过程_第8张图片

AD1255/AD1256硬件SPI开发实战与跳坑过程_第9张图片

AD1255/AD1256硬件SPI开发实战与跳坑过程_第10张图片

AD1255/AD1256硬件SPI开发实战与跳坑过程_第11张图片

AD1255/AD1256硬件SPI开发实战与跳坑过程_第12张图片

AD1255/AD1256硬件SPI开发实战与跳坑过程_第13张图片

AD1255/AD1256硬件SPI开发实战与跳坑过程_第14张图片
AD1255/AD1256硬件SPI开发实战与跳坑过程_第15张图片

![

](https://img-blog.csdnimg.cn/8c7d9be2773a4301a2435a995bc3408e.png)

当DRDY变为低电平时,可以读取AD值。

AD1255/AD1256硬件SPI开发实战与跳坑过程_第16张图片

CS使能必须为低电平才能向ADC中读取数据。

AD1255/AD1256硬件SPI开发实战与跳坑过程_第17张图片

AD1255/AD1256硬件SPI开发实战与跳坑过程_第18张图片

山东博奥斯
https://www.bos-power.com/product/751.html

你可能感兴趣的:(GD32国产化芯片开发设计之路,人工智能,网络,linux)