STM32 - ADS1220 Driver


*/

#include <stdio.h>
#include "stm32f4xx.h"
#include "ADS1220Driver.h"
#include "SPI2.h"
#include "delay.h"


//DRDY ->PB11
//CS   ->PB12
//MOSI ->PB15
//MISO ->PB14
//SCL  ->PB13

static unsigned char RcvData[8];
long ADS1220RTDGainCorrection;
long ADS1220TCGainCorrection;

/*一般单次转换时候采集时候使用的代码

if(!Read_DRDY){//当检测到数据可读时
		ADS1220_Get_Conversion_Data(ADC1220.DigitValue);//启动读取函数
		ADS1220_Start();//及时发送一个下一次转换的信号
		ADC1220.AllDigit = (ADC1220.DigitValue[1]<<16)+(ADC1220.DigitValue[2]<<8)+ADC1220.DigitValue[3];//合并分开的24位数据
		if(ADC1220.DigitValue[1] < 0x80){//正负号判断
			ADC1220.AnalogValue = ((ADC1220.AllDigit)*VRef/0x800000);
		}
		else{
			ADC1220.AnalogValue = (-1)*((0xffffff-ADC1220.AllDigit)*VRef/0x800000);
		}

*/

/*ADS1220初始化*/

void ADS1220_Init(void)
{
		GPIO_InitTypeDef  GPIO_InitStructure;//信号就绪口
	
  RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOB, ENABLE);//使能GPIOB时钟
 
  //GPIOB11,12初始化设置
  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_11;//|GPIO_Pin_11;
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN;//普通输入模式
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;//100M
  GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;//上拉
  GPIO_Init(GPIOB, &GPIO_InitStructure);//初始化
	
	
	
	Setup_ADS1220(
				ADS1220_MUX_AIN0_AIN1,//输入多路复用器配置
				ADS1220_OP_MODE_NORMAL,//工作模式选择
				ADS1220_CONVERSION_SINGLE_SHOT,//转换模式
				ADS1220_DATA_RATE_45SPS, //数据速率
				ADS1220_GAIN_1,// 增益配置
				ADS1220_PGA_BYPASS,//禁止/启用可编程增益放大器
				ADS1220_IDAC1_DISABLED,//选择IDAC1将路由到的通道
				ADS1220_IDAC2_DISABLED, //选择IDAC2将路由到的通道
				ADS1220_IDAC_CURRENT_OFF, //IDAC电流设置
				ADS1220_VREF_EXT_REF0_PINS,// 基准电压选择
				ADS1220_TEMP_SENSOR_OFF);//温度传感器
}




/*ADS1220配置*/
/*输入:
	inputMux :输入多路复用器配置(对于AINn=AVSS的设置,PGA必须(PGA_BYPASS=1),并且仅可使用增益1,2,4)
						ADS1220_MUX_AIN0_AIN1
						ADS1220_MUX_AIN0_AIN2 
						ADS1220_MUX_AIN0_AIN3
            ADS1220_MUX_AIN1_AIN2 
						ADS1220_MUX_AIN1_AIN3 
						ADS1220_MUX_AIN2_AIN3
            ADS1220_MUX_AIN1_AIN0 
						ADS1220_MUX_AIN3_AIN2 
						ADS1220_MUX_AIN0_AVSS
            ADS1220_MUX_AIN1_AVSS
						ADS1220_MUX_AIN2_AVSS
						ADS1220_MUX_AIN3_AVSS
            ADS1220_MUX_REFP-REFN
						ADS1220_MUX_AVDD-AVSS 
						ADS1220_MUX_SHORTED
						
	opMode:  工作模式选择
						ADS1220_OP_MODE_NORMAL     正常模式(256kHz 调制时钟 默认设置)
						ADS1220_OP_MODE_DUTY			 占空比模式(内部占空比1:4)
						ADS1220_OP_MODE_TURBO      Turbo模式  (512kHz调制时钟)
	
	conversionMode: 转换模式
            ADS1220_CONVERSION_SINGLE_SHOT   单次
						ADS1220_CONVERSION_CONTINUOUS	   连续
	
	dateRate:数据速率(详见说明书表18)
						ADS1220_DATA_RATE_20SPS
						ADS1220_DATA_RATE_45SPS
						ADS1220_DATA_RATE_90SPS
            ADS1220_DATA_RATE_175SPS
						ADS1220_DATA_RATE_330SPS
						ADS1220_DATA_RATE_600SPS
            ADS1220_DATA_RATE_1000SPS
						
	gainLevel:增益配置(在不使用PGA的情况下,可使用增益1,2,4.在这种情况下,通过开关电容结构获得增益)
						ADS1220_GAIN_1
						ADS1220_GAIN_2
						ADS1220_GAIN_4
						ADS1220_GAIN_8
						ADS1220_GAIN_16
            ADS1220_GAIN_32
						ADS1220_GAIN_64
						ADS1220_GAIN_128
						
	pgaBypass:禁止/启用可编程增益放大器(PGA)						
						ADS1220_USE_PGA      启用
						ADS1220_PGA_BYPASS   禁用
	
  routeIDAC1:选择IDAC1将路由到的通道
						ADS1220_IDAC1_DISABLED
						ADS1220_IDAC1_AIN0
						ADS1220_IDAC1_AIN1
						ADS1220_IDAC1_AIN2
						ADS1220_IDAC1_AIN3
						ADS1220_IDAC1_REFP
						ADS1220_IDAC1_REFN
	
  routeIDAC2:选择IDAC2将路由到的通道
						ADS1220_IDAC2_DISABLED
						ADS1220_IDAC2_AIN0
						ADS1220_IDAC2_AIN1
						ADS1220_IDAC2_AIN2
						ADS1220_IDAC2_AIN3
						ADS1220_IDAC2_REFP
						ADS1220_IDAC2_REFN	
						
	idacCurrent:IDAC电流设置
						ADS1220_IDAC_CURRENT_OFF
						ADS1220_IDAC_CURRENT_10_UA
						ADS1220_IDAC_CURRENT_50_UA
						ADS1220_IDAC_CURRENT_100_UA
						ADS1220_IDAC_CURRENT_250_UA
						ADS1220_IDAC_CURRENT_500_UA
						ADS1220_IDAC_CURRENT_1000_UA
						ADS1220_IDAC_CURRENT_1500_UA
						
	selectVref:基准电压选择
						ADS1220_VREF_INTERNAL        选择2.048V的内部基准电压(默认)
						ADS1220_VREF_EXT_REF0_PINS   使用专用REFP0和REFN0输入选择的外部基准电压
						ADS1220_VREF_EXT_REF1_PINS   使用AIN0/REFP1和AIN3/REFN1输入选择的外部基准电压
						ADS1220_VREF_AVDD						 做基准的模拟电源(AVDD-AVSS)
						
	intTempSensor:温度传感器模式
						0:禁用       1:启用
	
*/
//输出: 无
void Setup_ADS1220 (unsigned char inputMux, unsigned char opMode,
                    unsigned char conversionMode, unsigned char dataRate, unsigned char gainLevel, unsigned char pgaBypass,
                    unsigned char routeIDAC1, unsigned char routeIDAC2, unsigned char idacCurrent, unsigned char selectVref, unsigned char intTempSensor)
{
		unsigned char config[4];

    config[0] = inputMux + gainLevel + pgaBypass;
    config[1] = dataRate + opMode + conversionMode + intTempSensor + ADS1220_BURN_OUT_CURRENT_OFF;
    config[2] = ADS1220_FIR_50_60 + selectVref + ADS1220_LOW_SIDE_POWER_OPEN + idacCurrent;
    config[3] = routeIDAC1 + routeIDAC2 + ADS1220_DRDY_ON_DRDY_ONLY;

    ADS1220_Write_Regs(config, ADS1220_CONFIG_0_REG, 4);
}

/*************************************************************************************************************************************************
*  ADS1220_Reset
**************************************************************************************************************************************************/
/*!
* @brief Sends a Reset Command to the ADS1220.
*
* This function sends a Reset command to the ADS1220 on the SPI bus.
*
* @return  None
*
**************************************************************************************************************************************************/
void ADS1220_Reset (void)
{
    unsigned char cmd = ADS1220_RESET_CMD;
    SPI_Write (&cmd, RcvData, 1);
}

/*************************************************************************************************************************************************
*  ADS1220_Start
**************************************************************************************************************************************************/
/*!
* @brief Sends a Start Conversion Command to the ADS1220.
*
* This function sends a Start Conversion command to the ADS1220 on the SPI bus. Conversions will be completed when the Data Ready interrupt occurs.
*
* @return  None
*
**************************************************************************************************************************************************/
void ADS1220_Start (void)
{
    unsigned char cmd = ADS1220_START_CMD;
    SPI_Write (&cmd, RcvData, 1);
}

/*************************************************************************************************************************************************
*  ADS1220_Powerdown
**************************************************************************************************************************************************/
/*!
* @brief Sends a Power Down Data Command to the ADS1220.
*
* This function sends a Power Down command to the ADS1220 on the SPI bus.
*
* @return  None
*
* @note A Start Conversion command is required to bring the ADS1220 out of Power Down. Since the Power Down turns off the IDACs, care must be
*       taken to allow them sufficient time to settle after waking up from a power down. Depending on the specific system, it is possible that
*       initial readings after a power down may not be valid.
*
* @sa ADS1220_Start()
**************************************************************************************************************************************************/
void ADS1220_Powerdown (void)
{
    unsigned char cmd = ADS1220_POWERDOWN_CMD;
    SPI_Write (&cmd, RcvData, 1);
}

/*************************************************************************************************************************************************
*  ADS1220_Write_Regs
**************************************************************************************************************************************************/
/*!
* @brief ADS1220寄存器写入函数
*
* This function will execute a write register command to the ADS1220. This function can be used to update one or more registers on the ADS1220.
* No error checking is performed, so it is the user's responsibility to make sure they do not attempt to write past the end of the ADS1220 registers.
*
* @param[out]   *writeValues    将要写入的八位二进制数据的地址
* @param[in]     startReg       要写入的第一个寄存器序号
* @param[in]     length         按顺序写入的寄存器数量(如startReg为2,length为  2,那么就写2,3寄存器,数据按地址依顺序增加)
*
* @return  None
*
**************************************************************************************************************************************************/
void ADS1220_Write_Regs (unsigned char *writeValues, unsigned char startReg, unsigned char length)
{
    unsigned char outData[5];
    unsigned char i;

    outData[0] = ADS1220_WRITE_CMD(startReg,length);//该命令为告诉芯片写入寄存器,并且告知长度和初始寄存器位置

    for (i=0; i<length; i++)
    {
        outData[i+1] = writeValues[i];
    }

    SPI_Write (outData, RcvData, length+1);    // Add 1 to length for command byte

}

/*************************************************************************************************************************************************
*  ADS1220_Read_Regs
**************************************************************************************************************************************************/
/*!
* @brief ADS1220寄存器配置信息读取.(具体操作方式同上函数)
*
* This function will execute a read register command to the ADS1220 and return the resultant data. This function can be used to read one or more
* registers from the ADS1220. No error checking is performed, so it is the user's responsibility to make sure they do not attempt to read past
* the end of the ADS1220 registers.
*
* @param[out]   *readValues     Pointer to place the 8 bit register values from the ADS1220
* @param[in]     startReg       Address of the first register to read
* @param[in]     length         Number of registers to read.
*
* @return  None
*
**************************************************************************************************************************************************/
void ADS1220_Read_Regs (unsigned char *readValues, unsigned char startReg, unsigned char length)
{
    unsigned char outData[5] = {0x55, 0x55, 0x55, 0x55, 0x55};

    outData[0] = ADS1220_READ_CMD(startReg,length);

    SPI_Write (outData, readValues, length+1);    // 第一位作为命令数据

}

/*************************************************************************************************************************************************
*  ADS1220_Send_Read_Data_Command
**************************************************************************************************************************************************/
/*!
* @brief 向ADS1220发送读取数据命令。
*
* This function sends a Read Data (RDATA) command to the ADS1220 on the SPI bus.
*
* @return  None
*
**************************************************************************************************************************************************/
void ADS1220_Send_Read_Data_Command (void)
{
    unsigned char cmd = ADS1220_RDATA_CMD;
    SPI_Write (&cmd, RcvData, 1);
}


/*************************************************************************************************************************************************
*  ADS1220_Get_Conversion_Data
**************************************************************************************************************************************************/
/*!
* @brief Gets the raw conversion data from the ADS1220.
*
* 此函数从ADS1获取转换数据。此函数是标准函数,用于收集转换期间的数据
* calibration operations.
*
* @param[out]   *conversionData     Pointer to place the 24 bit Conversion Data from the ADS1220
*
* @return  None
*
* @note The ADS1220_Get_Conversion_Data_Calibrated() function is used to return calibrated conversion data, which is used during normal RTD logic
*
* @sa ADS1220_Get_Conversion_Data_Calibrated()
**************************************************************************************************************************************************/
void ADS1220_Get_Conversion_Data (unsigned char *conversionData)
{

    unsigned char outData[4] = {0xff, 0xff, 0xff, 0xff};

    SPI_Write (outData, conversionData, 4);    // 3 Bytes of Conversion Data

}

/*************************************************************************************************************************************************
*  ADS1220_Get_RTD_Conversion_Data_Calibrated
**************************************************************************************************************************************************/
/*!
* @brief Gets the RTD conversion data from the ADS1220 and subtracts the calibration values to return a calibrated conversion data.
*
*此函数从ADS1220获取转换数据。然后,它将减去先前计算的校准值。这个函数
*是用于在正常操作期间收集转换数据的标准函数。
*
* The function requires the system to have performed calibration
*
* @param[out]   *code     Pointer to place the 24 bit Calibrated Conversion Data from the ADS1220
*
* @return  None
*
* @note The ADS1220_Get_Conversion_Data() function is used to return raw conversion data, which is used during calibration logic
*
* @sa ADS1220_Get_Conversion_Data()
**************************************************************************************************************************************************/
void ADS1220_Get_RTD_Conversion_Data_Calibrated(volatile long *code)
{
    unsigned char outData[3] = {0xff, 0xff, 0xff};
    unsigned char tempData[3];


    SPI_Write (outData, tempData, 3);    // 3 Bytes of Conversion Data

    *code = (((long)tempData[0] << 16) + ((long)tempData[1] << 8) + (long)tempData[2]);       // combine 3 Bytes of Conversion Data to 24 bit value
    if(*code & 0x800000)  // check if result is negative
    {
        *code ^= 0x00FFFFFF; //invert and make
        *code += 1;          // two's complement
    }
    *code = (long)((long long)(*code) * ADS1220RTDGainCorrection/100000);                                    // ADS1220 Gain correction
}

/*************************************************************************************************************************************************
*  ADS1220_Get_TC_Conversion_Data_Calibrated
**************************************************************************************************************************************************/
/*!
* @brief Gets the TC conversion data from the ADS1220 and subtracts the calibration values to return a calibrated conversion data.
*
* This function gets the TC Conversion Data from the ADS1220. It will then subtract the Calibration Value previously calculated. This function
* is the standard function used to gather the conversion data during normal operations.
*
* The function requires the system to have performed calibration
*
* @param[out]   *code     Pointer to place the 24 bit Calibrated Conversion Data from the ADS1220 into 32 bit unsigned long variable
*
* @return  None
*
* @note The ADS1220_Get_Conversion_Data() function is used to return raw conversion data, which is used during calibration logic
*
* @sa ADS1220_Get_Conversion_Data()
**************************************************************************************************************************************************/


/*************************************************************************************************************************************************
*  SPI_Write
**************************************************************************************************************************************************/
/*!
* @brief Perform a SPI communication sequence to Write/Read data on SPI bus
*
* The SPI bus uses one clock line and 2 data lines that transfer data at the same time. The master will read data from the MISO
* (Master In Slave Out) line on one edge of the clock. The slave device will read on the MOSI (Master Out Slave In) on the other edge of the clock.
* As such, reads and writes happen together. If there is no data to send to the slave, the master must write out dummy data on the bus to get the
* clock to toggle for the slave device to communicate.
*
* Note that many SPI devices do not communicate back to the master at all, and have no MISO line connected.
*
* @param[in]   outData              Pointer to an array with the data that will be written on the SPI bus
* @param[in]   inData               Pointer to an array to place the data returned from the slave device. One byte for EVERY byte sent,
*                                   even the command byte
* @param[in]   length               Number of bytes to send/receive
*
**************************************************************************************************************************************************/
void SPI_Write (unsigned char *outData, unsigned char *inData, unsigned char length)
{
		unsigned char i;
	
    ADS1220_CS_Low(); // CS Active Low
	
    delay_us(1);          // Pause a bit
	
	if(!Read_DRDY){
    for (i=0; i<length; i++){
        *inData = SPI_Write_Read_Byte (outData[i]);
			  inData ++;
    }
	}
	else{
		for (i=0; i<length; i++){
			SPI_Write_Byte (outData[i]);
		}
	}
 //   while (SPI_I2S_GetFlagStatus(SPI2, SPI_I2S_FLAG_TXE) == RESET);//检测发送标志位
    delay_us(5);            // Pause a bit
		
    ADS1220_CS_High();// CS Active High

}

/*************************************************************************************************************************************************
*  发送+读取函数
**************************************************************************************************************************************************/
/*!
* @brief This function is used to place a single byte on the SPI bus. This function is for expert mode only.
*
* This function can be used by someone managing their own communications on the SPI bus to place one byte on the bus. It is assumed that the user
* will manage the STE pin themselves when using this command. The received byte from the MISO pin will be returned by this function.
*
* This function only exists to support users who have non-standard SPI devices on their bus. Some devices require excessive time between bytes or
* a delay between the command byte and subsequent data bytes.
*
* @param[in]   data              Pointer to an array with the data that will be written on the SPI bus
*
* @return  in_data               Character sent from SPI device on MISO line
**************************************************************************************************************************************************/
unsigned char SPI_Write_Read_Byte (unsigned char data)
{

	while (SPI_I2S_GetFlagStatus(SPI2, SPI_I2S_FLAG_TXE) == RESET);//检测发送标志位
	SPI_I2S_SendData(SPI2, data); //通过外设SPI1发送一个数据
	while (SPI_I2S_GetFlagStatus(SPI2,SPI_I2S_FLAG_RXNE) == RESET);             // Wait for end of data receive
	
	return ((unsigned char)SPI_I2S_ReceiveData(SPI2));        // Return the received byte from RX Buffer
	
}

//仅发送函数

void SPI_Write_Byte (unsigned char data)
{

	while (SPI_I2S_GetFlagStatus(SPI2, SPI_I2S_FLAG_TXE) == RESET);//检测发送标志位
	SPI_I2S_SendData(SPI2, data); //通过外设SPI1发送一个数据
	
}
#ifndef __ADS1220_DRIVER_H_
#define __ADS1220_DRIVER_H_
 
/*
	Code name:ADS1220Driver
	Date:2019.5.10
	Writing by : Borygnay

*/
#include <stdio.h>
#include "stm32f4xx.h"
 
#ifdef __CPLUSPLUS
extern "C" {
#endif
	
extern float PgaGainLevel; 
#define VRef  3.3


#define	Read_DRDY       GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_11) 	
	
#define ADS1220_CS_High()    GPIO_SetBits(GPIOB,GPIO_Pin_12)
#define ADS1220_CS_Low()   GPIO_ResetBits(GPIOB,GPIO_Pin_12)
	
	
#define ADS1220_RESET_CMD          0x06
#define ADS1220_WREG_CMD           0x40
#define ADS1220_RREG_CMD           0x20
#define ADS1220_RDATA_CMD          0x10
#define ADS1220_START_CMD          0x08
#define ADS1220_POWERDOWN_CMD      0x02

	
#define ADS1220_WRITE_CMD(reg,len)     (ADS1220_WREG_CMD + (reg << 2) + (len-1))
#define ADS1220_READ_CMD(reg,len)      (ADS1220_RREG_CMD + (reg << 2) + (len-1))

#define ADS1220_CONFIG_0_REG      0
#define ADS1220_CONFIG_1_REG      1
#define ADS1220_CONFIG_2_REG      2
#define ADS1220_CONFIG_3_REG      3

//寄存器0配置宏定义
#define ADS1220_MUX_MASK          0xf0
#define ADS1220_MUX_SHIFT         4

#define ADS1220_MUX_AIN0_AIN1     (0x0 << ADS1220_MUX_SHIFT)
#define ADS1220_MUX_AIN0_AIN2     (0x1 << ADS1220_MUX_SHIFT)
#define ADS1220_MUX_AIN0_AIN3     (0x2 << ADS1220_MUX_SHIFT)
#define ADS1220_MUX_AIN1_AIN2     (0x3 << ADS1220_MUX_SHIFT)
#define ADS1220_MUX_AIN1_AIN3     (0x4 << ADS1220_MUX_SHIFT)
#define ADS1220_MUX_AIN2_AIN3     (0x5 << ADS1220_MUX_SHIFT)
#define ADS1220_MUX_AIN1_AIN0     (0x6 << ADS1220_MUX_SHIFT)
#define ADS1220_MUX_AIN3_AIN2     (0x7 << ADS1220_MUX_SHIFT)
#define ADS1220_MUX_AIN0_AVSS     (0x8 << ADS1220_MUX_SHIFT)
#define ADS1220_MUX_AIN1_AVSS     (0x9 << ADS1220_MUX_SHIFT)
#define ADS1220_MUX_AIN2_AVSS     (0xa << ADS1220_MUX_SHIFT)
#define ADS1220_MUX_AIN3_AVSS     (0xb << ADS1220_MUX_SHIFT)
#define ADS1220_MUX_REFP_REFN     (0xc << ADS1220_MUX_SHIFT)
#define ADS1220_MUX_AVDD_AVSS     (0xd << ADS1220_MUX_SHIFT)
#define ADS1220_MUX_SHORTED       (0xe << ADS1220_MUX_SHIFT)


#define ADS1220_GAIN_MASK         0xe
#define ADS1220_GAIN_SHIFT        1

#define ADS1220_GAIN_1            (0x0 << ADS1220_GAIN_SHIFT)
#define ADS1220_GAIN_2            (0x1 << ADS1220_GAIN_SHIFT)
#define ADS1220_GAIN_4            (0x2 << ADS1220_GAIN_SHIFT)
#define ADS1220_GAIN_8            (0x3 << ADS1220_GAIN_SHIFT)
#define ADS1220_GAIN_16           (0x4 << ADS1220_GAIN_SHIFT)
#define ADS1220_GAIN_32           (0x5 << ADS1220_GAIN_SHIFT)
#define ADS1220_GAIN_64           (0x6 << ADS1220_GAIN_SHIFT)
#define ADS1220_GAIN_128          (0x7 << ADS1220_GAIN_SHIFT)
 
#define ADS1220_PGA_BYPASS        1
#define ADS1220_USE_PGA           0



	
//寄存器1配置宏定义	

#define ADS1220_DATA_RATE_MASK    0xe0
#define ADS1220_DATA_RATE_SHIFT   5

#define ADS1220_DATA_RATE_20SPS   (0 << ADS1220_DATA_RATE_SHIFT)
#define ADS1220_DATA_RATE_45SPS   (1 << ADS1220_DATA_RATE_SHIFT)
#define ADS1220_DATA_RATE_90SPS   (2 << ADS1220_DATA_RATE_SHIFT)
#define ADS1220_DATA_RATE_175SPS  (3 << ADS1220_DATA_RATE_SHIFT)
#define ADS1220_DATA_RATE_330SPS  (4 << ADS1220_DATA_RATE_SHIFT)
#define ADS1220_DATA_RATE_600SPS  (5 << ADS1220_DATA_RATE_SHIFT)
#define ADS1220_DATA_RATE_1000SPS (6 << ADS1220_DATA_RATE_SHIFT)

#define ADS1220_OP_MODE_MASK      0x18
#define ADS1220_OP_MODE_SHIFT     3

#define ADS1220_OP_MODE_NORMAL    (0 << ADS1220_OP_MODE_SHIFT)
#define ADS1220_OP_MODE_DUTY      (1 << ADS1220_OP_MODE_SHIFT)
#define ADS1220_OP_MODE_TURBO     (2 << ADS1220_OP_MODE_SHIFT)

#define ADS1220_CONVERSION_MODE_MASK     0x4
#define ADS1220_CONVERSION_SINGLE_SHOT   0x0
#define ADS1220_CONVERSION_CONTINUOUS    0x4

#define ADS1220_TEMP_SENSOR_MASK         0x2
#define ADS1220_TEMP_SENSOR_ON           0x2
#define ADS1220_TEMP_SENSOR_OFF          0x0

#define ADS1220_BURN_OUT_MASK            0x1
#define ADS1220_BURN_OUT_CURRENT_ON      0x1
#define ADS1220_BURN_OUT_CURRENT_OFF     0x0
	
//寄存器2配置宏定义	
#define ADS1220_VREF_MASK                0xc0
#define ADS1220_VREF_SHIFT               6

#define ADS1220_VREF_INTERNAL            (0 << ADS1220_VREF_SHIFT)
#define ADS1220_VREF_EXT_REF0_PINS       (1 << ADS1220_VREF_SHIFT)
#define ADS1220_VREF_EXT_REF1_PINS       (2 << ADS1220_VREF_SHIFT)
#define ADS1220_VREF_AVDD                (3 << ADS1220_VREF_SHIFT)

#define ADS1220_FIR_FILTER_MASK          0x30
#define ADS1220_FIR_FILTER_SHIFT         4

#define ADS1220_FIR_NONE                 (0 << ADS1220_FIR_FILTER_SHIFT)
#define ADS1220_FIR_50_60                (1 << ADS1220_FIR_FILTER_SHIFT)
#define ADS1220_FIR_50                   (2 << ADS1220_FIR_FILTER_SHIFT)
#define ADS1220_FIR_60                   (3 << ADS1220_FIR_FILTER_SHIFT)

#define ADS1220_LOW_SIDE_POWER_MASK      0x04
#define ADS1220_LOW_SIDE_POWER_OPEN      0x00
#define ADS1220_LOW_SIDE_POWER_CLOSES    0x04

#define ADS1220_IDAC_CURRENT_MASK        0x07
#define ADS1220_IDAC_CURRENT_SHIFT       0

#define ADS1220_IDAC_CURRENT_OFF         (0 << ADS1220_IDAC_CURRENT_SHIFT)
#define ADS1220_IDAC_CURRENT_10_UA       (1 << ADS1220_IDAC_CURRENT_SHIFT)
#define ADS1220_IDAC_CURRENT_50_UA       (2 << ADS1220_IDAC_CURRENT_SHIFT)
#define ADS1220_IDAC_CURRENT_100_UA      (3 << ADS1220_IDAC_CURRENT_SHIFT)
#define ADS1220_IDAC_CURRENT_250_UA      (4 << ADS1220_IDAC_CURRENT_SHIFT)
#define ADS1220_IDAC_CURRENT_500_UA      (5 << ADS1220_IDAC_CURRENT_SHIFT)
#define ADS1220_IDAC_CURRENT_1000_UA     (6 << ADS1220_IDAC_CURRENT_SHIFT)
#define ADS1220_IDAC_CURRENT_1500_UA     (7 << ADS1220_IDAC_CURRENT_SHIFT)


//寄存器3配置宏定义	

#define ADS1220_IDAC1_MUX_MASK           0xe0
#define ADS1220_IDAC1_MUX_SHIFT          5

#define ADS1220_IDAC1_DISABLED           (0 << ADS1220_IDAC1_MUX_SHIFT)
#define ADS1220_IDAC1_AIN0               (1 << ADS1220_IDAC1_MUX_SHIFT)
#define ADS1220_IDAC1_AIN1               (2 << ADS1220_IDAC1_MUX_SHIFT)
#define ADS1220_IDAC1_AIN2               (3 << ADS1220_IDAC1_MUX_SHIFT)
#define ADS1220_IDAC1_AIN3               (4 << ADS1220_IDAC1_MUX_SHIFT)
#define ADS1220_IDAC1_REFP0              (5 << ADS1220_IDAC1_MUX_SHIFT)
#define ADS1220_IDAC1_REFN0              (6 << ADS1220_IDAC1_MUX_SHIFT)

#define ADS1220_IDAC2_MUX_MASK           0x1c
#define ADS1220_IDAC2_MUX_SHIFT          2

#define ADS1220_IDAC2_DISABLED           (0 << ADS1220_IDAC2_MUX_SHIFT)
#define ADS1220_IDAC2_AIN0               (1 << ADS1220_IDAC2_MUX_SHIFT)
#define ADS1220_IDAC2_AIN1               (2 << ADS1220_IDAC2_MUX_SHIFT)
#define ADS1220_IDAC2_AIN2               (3 << ADS1220_IDAC2_MUX_SHIFT)
#define ADS1220_IDAC2_AIN3               (4 << ADS1220_IDAC2_MUX_SHIFT)
#define ADS1220_IDAC2_REFP0              (5 << ADS1220_IDAC2_MUX_SHIFT)
#define ADS1220_IDAC2_REFN0              (6 << ADS1220_IDAC2_MUX_SHIFT)

#define ADS1220_DOUT_DRDY_MASK           0x2
#define ADS1220_DRDY_ON_DOUT_DRDY        0x2
#define ADS1220_DRDY_ON_DRDY_ONLY        0x0

#define SPI_INVALID_RATE              0XFF
#define SPI_INVALID_COMMAND           0X01

void ADS1220_Init(void);
void Setup_ADS1220 (unsigned char inputMux, unsigned char opMode,
                    unsigned char conversionMode, unsigned char dataRate, unsigned char gainLevel, unsigned char pgaBypass,
                    unsigned char routeIDAC1, unsigned char routeIDAC2, unsigned char idacCurrent, unsigned char selectVref, unsigned char intTempSensor);
void ADS1220_Offset_Calibrate_Data (unsigned char *tempData);
void ADS1220_Reset (void);
void ADS1220_Start (void);
void ADS1220_Powerdown (void);
void ADS1220_Write_Regs (unsigned char *writeValues, unsigned char startReg, unsigned char length);
void ADS1220_Read_Regs (unsigned char *readValues, unsigned char startReg, unsigned char length);
void ADS1220_Send_Read_Data_Command (void);
void ADS1220_Get_Conversion_Data (unsigned char *conversionData);
void ADS1220_Get_RTD_Conversion_Data_Calibrated(volatile long *code);
void ADS1220_Get_TC_Conversion_Data_Calibrated(volatile long *code);
void Setup_SPI_Master (void);
void SPI_Write (unsigned char *outData, unsigned char *inData, unsigned char length);
unsigned char SPI_Write_Read_Byte (unsigned char data);
void SPI_Write_Byte (unsigned char data);


#ifdef __CPLUSPLUS
}
#endif

#endif  

  • 3
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
ADS1220是一款16位精度的差分式模拟-数字转换器(ADC),适用于高精度测量应用。下面介绍如何使用STM32驱动ADS1220。 首先,需要连接ADS1220STM32ADS1220STM32之间的接口可以是SPI或I2C。在本例中,我们使用SPI接口。 接下来,需要编写STM32的SPI驱动程序,从ADS1220读取数据。以下是示例代码: ```c #include "stm32f10x.h" // 定义SPI引脚 #define ADS1220_SPI SPI1 #define ADS1220_GPIO GPIOA #define ADS1220_CS_PIN GPIO_Pin_4 #define ADS1220_SCK_PIN GPIO_Pin_5 #define ADS1220_MISO_PIN GPIO_Pin_6 #define ADS1220_MOSI_PIN GPIO_Pin_7 // 初始化SPI void ADS1220_SPI_Init(void) { SPI_InitTypeDef SPI_InitStructure; GPIO_InitTypeDef GPIO_InitStructure; // 使能SPI时钟和GPIO时钟 RCC_APB2PeriphClockCmd(RCC_APB2Periph_SPI1 | RCC_APB2Periph_GPIOA, ENABLE); // 配置SPI引脚 GPIO_InitStructure.GPIO_Pin = ADS1220_CS_PIN | ADS1220_SCK_PIN | ADS1220_MOSI_PIN; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; GPIO_Init(ADS1220_GPIO, &GPIO_InitStructure); GPIO_InitStructure.GPIO_Pin = ADS1220_MISO_PIN; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING; GPIO_Init(ADS1220_GPIO, &GPIO_InitStructure); // 配置SPI SPI_StructInit(&SPI_InitStructure); SPI_InitStructure.SPI_Direction = SPI_Direction_2Lines_FullDuplex; SPI_InitStructure.SPI_Mode = SPI_Mode_Master; SPI_InitStructure.SPI_DataSize = SPI_DataSize_8b; SPI_InitStructure.SPI_CPOL = SPI_CPOL_Low; SPI_InitStructure.SPI_CPHA = SPI_CPHA_1Edge; SPI_InitStructure.SPI_NSS = SPI_NSS_Soft; SPI_InitStructure.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_4; SPI_Init(ADS1220_SPI, &SPI_InitStructure); // 使能SPI SPI_Cmd(ADS1220_SPI, ENABLE); } // 读取ADS1220数据 uint16_t ADS1220_ReadData(void) { uint16_t data; // 使能ADS1220 GPIO_ResetBits(ADS1220_GPIO, ADS1220_CS_PIN); // 发送读取命令 SPI_SendData(ADS1220_SPI, 0x01); // 等待数据读取完成 while (SPI_I2S_GetFlagStatus(ADS1220_SPI, SPI_I2S_FLAG_RXNE) == RESET); // 读取高8位数据 data = SPI_ReceiveData(ADS1220_SPI) << 8; // 发送读取命令 SPI_SendData(ADS1220_SPI, 0x01); // 等待数据读取完成 while (SPI_I2S_GetFlagStatus(ADS1220_SPI, SPI_I2S_FLAG_RXNE) == RESET); // 读取低8位数据 data |= SPI_ReceiveData(ADS1220_SPI); // 禁用ADS1220 GPIO_SetBits(ADS1220_GPIO, ADS1220_CS_PIN); return data; } int main(void) { uint16_t data; // 初始化SPI ADS1220_SPI_Init(); while (1) { // 读取ADS1220数据 data = ADS1220_ReadData(); // 处理数据 // ... // 延时 // ... } } ``` 在上面的代码中,初始化函数`ADS1220_SPI_Init()`配置了SPI接口和GPIO引脚。`ADS1220_ReadData()`函数实现了从ADS1220读取数据的过程。 通过上述步骤,就可以在STM32上驱动ADS1220实现高精度测量了。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值