标题:
4通道ADS1120 SPI驱动程序
[打印本页]
作者:
375341555
时间:
2024-10-16 15:12
标题:
4通道ADS1120 SPI驱动程序
#include "ADS1220.h"
void ADS1220SendByte(u8 Byte)
{
//HAL_SPI_Transmit(&hspi1,&Byte,1,10);
SPI2_ReadWriteByte(Byte);
}
unsigned char ADS1220ReceiveByte()
{
unsigned char SData = 0xff ,Result = 0;
Result = SPI2_ReadWriteByte(SData);
//HAL_SPI_TransmitReceive(&hspi1,&SData,&Result,1,10);
return Result;
}
/*
******************************************************************************
higher level functions
*/
void ADS1220ReadRegister(int StartAddress, int NumRegs, unsigned * pData)
{
int i;
/* send the command byte */
ADS1220SendByte(ADS1220_CMD_RREG | (((StartAddress<<2) & 0x0c) |((NumRegs-1)&0x03)));
/* get the register content */
for (i=0; i< NumRegs; i++)
{
*pData++ = ADS1220ReceiveByte();
}
return;
}
void ADS1220WriteRegister(int StartAddress, int NumRegs, unsigned char * pData)
{
int i;
/* send the command byte */
ADS1220SendByte(ADS1220_CMD_WREG | (((StartAddress<<2) & 0x0c) |((NumRegs-1)&0x03)));
/* send the data bytes */
for (i=0; i< NumRegs; i++)
{
ADS1220SendByte(*pData++);
}
return;
}
void ADS1220SendResetCommand()
{
/* send the command byte */
ADS1220SendByte(ADS1220_CMD_RESET);
return;
}
void ADS1220SendStartCommand()
{
/* send the command byte */
ADS1220SendByte(ADS1220_CMD_SYNC);
return;
}
void ADS1220SendShutdownCommand()
{
/* send the command byte */
ADS1220SendByte(ADS1220_CMD_SHUTDOWN);
return;
}
/* ADS1220 Initial Configuration */
unsigned int test[4];
void ADS1220Init(void)
{
uint8_t ch_cfg[4]={ADS1220_MUX_3_G|ADS1220_GAIN_1|ADS1220_PGA_BYPASS, ADS1220_CC|ADS1220_DR_45, ADS1220_VREF_SUPPLY|ADS1220_PSW_SW_OFF, ADS1220_IDAC1_OFF|ADS1220_IDAC2_OFF};
ADS1220SendResetCommand();//复位
delay_ms(100);
ADS1220WriteRegister(ADS1220_0_REGISTER,4,ch_cfg);//配置4个寄存器
delay_ms(100);
//ADS1220SendShutdownCommand();
ADS1220SendStartCommand();
}
long ADS1220ReadData()
{
long Data;
/* send the command byte */
ADS1220SendByte(ADS1220_CMD_RDATA);
/* get the conversion result */
#ifdef ADS1120
Data = ADS1220ReceiveByte();
Data = (Data << 8) | ADS1220ReceiveByte();
/* sign extend data */
if (Data & 0x8000)
Data |= 0xffff0000;
#else
Data = ADS1220ReceiveByte();
Data = (Data << 8) | ADS1220ReceiveByte();
Data = (Data << 8) | ADS1220ReceiveByte();
/* sign extend data */
if (Data & 0x800000)
Data |= 0xff000000;
#endif
return Data;
}
//选择通道函数
void ADS1220_SelCh(uint8_t ch)
{
uint8_t cfg[2]={ADS1220_MUX_0_G|ADS1220_GAIN_1|ADS1220_PGA_BYPASS};
switch(ch)
{
case 0://选择通道0
cfg[0] = ADS1220_MUX_0_G|ADS1220_GAIN_1|ADS1220_PGA_BYPASS;
ADS1220WriteRegister(ADS1220_0_REGISTER,1,cfg);
break;
case 1://选择通道1
cfg[0] = ADS1220_MUX_1_G|ADS1220_GAIN_1|ADS1220_PGA_BYPASS;
ADS1220WriteRegister(ADS1220_0_REGISTER,1,cfg);
break;
case 2://选择通道2
cfg[0] = ADS1220_MUX_2_G|ADS1220_GAIN_1|ADS1220_PGA_BYPASS;
ADS1220WriteRegister(ADS1220_0_REGISTER,1,cfg);
break;
case 3://选择通道3
cfg[0] = ADS1220_MUX_3_G|ADS1220_GAIN_1|ADS1220_PGA_BYPASS;
ADS1220WriteRegister(ADS1220_0_REGISTER,1,cfg);
break;
}
}
__IO uint16_t ADS1220_Tick = 0;
uint32_t temp,data;
float Vin[4];
//循环读取4个通道
u32 ADS1220_GetData(void)
{
static uint8_t ads_ch = 3;//通道选择
//if(ADS1220_Tick<50)return;
//ADS1220_Tick=0;
delay_ms(100);
//ADS1220ReadRegister(ADS1220_0_REGISTER,4,test);
switch(ads_ch)
{
case 0://读取通道0 然后切换到通道1
temp = ADS1220ReadData();
Vin[0] = temp*2.048f/8388608;//转换为电压 单位V
ads_ch = 1;
ADS1220_SelCh(ads_ch);
break;
case 1://读取通道1 然后切换到通道2
temp = ADS1220ReadData();
Vin[1] = temp*2.048f/8388608;//转换为电压 单位V
ads_ch = 2;
ADS1220_SelCh(ads_ch);
break;
case 2://读取通道2 然后切换到通道3
temp = ADS1220ReadData();
Vin[2] = temp*2.048f/8388608;
ads_ch = 3;
ADS1220_SelCh(ads_ch);
break;
case 3://读取通道3 然后切换到通道0
temp = ADS1220ReadData();
Vin[3] = (temp*5/32767.0000)+0.0005;
data = ((temp*5/32767.0000)+0.0005)*1000;
//ads_ch = 0;
ADS1220_SelCh(ads_ch);
break;
}
return temp;
}
复制代码
ADS1220.h
#ifndef _ADS1220_H
#define _ADS1220_H
#include "spi.h"
#define ADS1220_NO_ERROR 0
#define ADS1220_ERROR -1
/* Command Definitions */
#define ADS1220_CMD_RDATA 0x10
#define ADS1220_CMD_RREG 0x20
#define ADS1220_CMD_WREG 0x40
#define ADS1220_CMD_SYNC 0x08
#define ADS1220_CMD_SHUTDOWN 0x02
#define ADS1220_CMD_RESET 0x06
/* ADS1220 Register Definitions */
#define ADS1220_0_REGISTER 0x00
#define ADS1220_1_REGISTER 0x01
#define ADS1220_2_REGISTER 0x02
#define ADS1220_3_REGISTER 0x03
/* ADS1220 Register 0 Definition */
/* Bit 7 | Bit 6 | Bit 5 | Bit 4 | Bit 3 | Bit 2 | Bit 1 | Bit 0
//--------------------------------------------------------------------------------------------
// MUX [3:0] | GAIN[2:0] | PGA_BYPASS
*/
/* Define MUX */
#define ADS1220_MUX_0_1 0x00
#define ADS1220_MUX_0_2 0x10
#define ADS1220_MUX_0_3 0x20
#define ADS1220_MUX_1_2 0x30
#define ADS1220_MUX_1_3 0x40
#define ADS1220_MUX_2_3 0x50
#define ADS1220_MUX_1_0 0x60
#define ADS1220_MUX_3_2 0x70
#define ADS1220_MUX_0_G 0x80
#define ADS1220_MUX_1_G 0x90
#define ADS1220_MUX_2_G 0xa0
#define ADS1220_MUX_3_G 0xb0
#define ADS1220_MUX_EX_VREF 0xc0
#define ADS1220_MUX_AVDD 0xd0
#define ADS1220_MUX_DIV2 0xe0
/* Define GAIN */
#define ADS1220_GAIN_1 0x00
#define ADS1220_GAIN_2 0x02
#define ADS1220_GAIN_4 0x04
#define ADS1220_GAIN_8 0x06
#define ADS1220_GAIN_16 0x08
#define ADS1220_GAIN_32 0x0a
#define ADS1220_GAIN_64 0x0c
#define ADS1220_GAIN_128 0x0e
/* Define PGA_BYPASS */
#define ADS1220_PGA_BYPASS 0x01
/* ADS1220 Register 1 Definition */
/* Bit 7 | Bit 6 | Bit 5 | Bit 4 | Bit 3 | Bit 2 | Bit 1 | Bit 0
//--------------------------------------------------------------------------------------------
// DR[2:0] | MODE[1:0] | CM | TS | BCS
*/
/* Define DR (data rate) */
#define ADS1220_DR_20 0x00
#define ADS1220_DR_45 0x20
#define ADS1220_DR_90 0x40
#define ADS1220_DR_175 0x60
#define ADS1220_DR_330 0x80
#define ADS1220_DR_600 0xa0
#define ADS1220_DR_1000 0xc0
/* Define MODE of Operation */
#define ADS1220_MODE_NORMAL 0x00
#define ADS1220_MODE_DUTY 0x08
#define ADS1220_MODE_TURBO 0x10
#define ADS1220_MODE_DCT 0x18
/* Define CM (conversion mode) */
#define ADS1220_CC 0x04
/* Define TS (temperature sensor) */
#define ADS1220_TEMP_SENSOR 0x02
/* Define BCS (burnout current source) */
#define ADS1220_BCS 0x01
/* ADS1220 Register 2 Definition */
/* Bit 7 | Bit 6 | Bit 5 | Bit 4 | Bit 3 | Bit 2 | Bit 1 | Bit 0
//--------------------------------------------------------------------------------------------
// VREF[1:0] | 50/60[1:0] | PSW | IDAC[2:0]
*/
/* Define VREF */
#define ADS1220_VREF_INT 0x00
#define ADS1220_VREF_EX_DED 0x40
#define ADS1220_VREF_EX_AIN 0x80
#define ADS1220_VREF_SUPPLY 0xc0
/* Define 50/60 (filter response) */
#define ADS1220_REJECT_OFF 0x00
#define ADS1220_REJECT_BOTH 0x10
#define ADS1220_REJECT_50 0x20
#define ADS1220_REJECT_60 0x30
/* Define PSW (low side power switch) */
#define ADS1220_PSW_SW 0x08
#define ADS1220_PSW_SW_OFF 0x00
/* Define IDAC (IDAC current) */
#define ADS1220_IDAC_OFF 0x00
#define ADS1220_IDAC_10 0x01
#define ADS1220_IDAC_50 0x02
#define ADS1220_IDAC_100 0x03
#define ADS1220_IDAC_250 0x04
#define ADS1220_IDAC_500 0x05
#define ADS1220_IDAC_1000 0x06
#define ADS1220_IDAC_2000 0x07
/* ADS1220 Register 3 Definition */
/* Bit 7 | Bit 6 | Bit 5 | Bit 4 | Bit 3 | Bit 2 | Bit 1 | Bit 0
//--------------------------------------------------------------------------------------------
// I1MUX[2:0] | I2MUX[2:0] | DRDYM | RESERVED
*/
/* Define I1MUX (current routing) */
#define ADS1220_IDAC1_OFF 0x00
#define ADS1220_IDAC1_AIN0 0x20
#define ADS1220_IDAC1_AIN1 0x40
#define ADS1220_IDAC1_AIN2 0x60
#define ADS1220_IDAC1_AIN3 0x80
#define ADS1220_IDAC1_REFP0 0xa0
#define ADS1220_IDAC1_REFN0 0xc0
/* Define I2MUX (current routing) */
#define ADS1220_IDAC2_OFF 0x00
#define ADS1220_IDAC2_AIN0 0x04
#define ADS1220_IDAC2_AIN1 0x08
#define ADS1220_IDAC2_AIN2 0x0c
#define ADS1220_IDAC2_AIN3 0x10
#define ADS1220_IDAC2_REFP0 0x14
#define ADS1220_IDAC2_REFN0 0x18
/* define DRDYM (DOUT/DRDY behaviour) */
#define ADS1220_DRDY_MODE 0x02
#define ADS1120
extern float Vin[4];
void ADS1220Init(void);
void ADS1220Config(unsigned char ch);
u32 ADS1220_GetData(void);
#endif
复制代码
欢迎光临 (http://www.51hei.com/bbs/)
Powered by Discuz! X3.1