|
发表于 2020-8-4 08:04:38
|
显示全部楼层
在stm32f103上测试成功的
- #include "includes.h"
- #define ADS1x20_CS_GPIO GPIOD
- #define ADS1x20_SCLK_GPIO GPIOD
- #define ADS1x20_DIN_GPIO GPIOD
- #define ADS1x20_DOUT_GPIO GPIOD
- #define ADS1x20_CS_Pin GPIO_Pin_12
- #define ADS1x20_SCLK_Pin GPIO_Pin_11
- #define ADS1x20_DIN_Pin GPIO_Pin_13
- #define ADS1x20_DOUT_Pin GPIO_Pin_14
- #define ADS1x20_CS_Out(x) x?GPIO_SetBits(ADS1x20_CS_GPIO,ADS1x20_CS_Pin):GPIO_ResetBits(ADS1x20_CS_GPIO,ADS1x20_CS_Pin)
- #define ADS1x20_SCLK_Out(x) x?GPIO_SetBits(ADS1x20_SCLK_GPIO,ADS1x20_SCLK_Pin):GPIO_ResetBits(ADS1x20_SCLK_GPIO,ADS1x20_SCLK_Pin)
- #define ADS1x20_DIN_Out(x) x?GPIO_SetBits(ADS1x20_DIN_GPIO,ADS1x20_DIN_Pin):GPIO_ResetBits(ADS1x20_DIN_GPIO,ADS1x20_DIN_Pin)
- #define ADS1x20_DOUT_Get GPIO_ReadInputDataBit(ADS1x20_DOUT_GPIO, ADS1x20_DOUT_Pin)
- void ADS1x20_Delay(unsigned short x)//单位1us
- {
- Delay_us(x);
- }
- void ADS1x20_Init(void)
- {
- GPIO_InitTypeDef GPIO_InitStructure;
- RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOD, ENABLE );
-
- //CS
- GPIO_InitStructure.GPIO_Pin = ADS1x20_CS_Pin;
- GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
- GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
- GPIO_Init(ADS1x20_CS_GPIO, &GPIO_InitStructure);
- //SCLK
- GPIO_InitStructure.GPIO_Pin = ADS1x20_SCLK_Pin;
- GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
- GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
- GPIO_Init(ADS1x20_SCLK_GPIO, &GPIO_InitStructure);
- //DIN
- GPIO_InitStructure.GPIO_Pin = ADS1x20_DIN_Pin;
- GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
- GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
- GPIO_Init(ADS1x20_DIN_GPIO, &GPIO_InitStructure);
- //DOUT
- GPIO_InitStructure.GPIO_Pin = ADS1x20_DOUT_Pin;
- GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
- GPIO_Init(ADS1x20_DOUT_GPIO, &GPIO_InitStructure);
- }
- //读写ADS1x20
- //short:芯片配置
- //Chip:芯片内的配置返回
- //return:ReadData
- unsigned char ADS1x20_ReadWirte(unsigned char Config)
- {
- unsigned char i;
- unsigned short config=0,//配置
- data=0;//读取ADC
- // ADS1x20_CS_Out(0);
- config = Config;
- for(i=0;i<8;i++)
- {
- //ADS1x20_Delay(1);
- ADS1x20_SCLK_Out(1);
- if(config&0x80)
- {
- ADS1x20_DIN_Out(1);
- }
- else
- {
- ADS1x20_DIN_Out(0);
- }
- //ADS1x20_Delay(1);
- ADS1x20_SCLK_Out(0);
- data = data<<1;
- if(ADS1x20_DOUT_Get)
- {
- data++;
- }
-
- config = config<<1;
- }
- // ADS1x20_CS_Out(1);
- return data;
- }
- //ADS1x20读取AD数据
- void ADS1x20_ReadData(unsigned char*Data)
- {
- ADS1x20_CS_Out(0);
- ADS1x20_ReadWirte(ADS1x20_RDATA);
- #ifdef ADS1120
- *Data++ = ADS1x20_ReadWirte(0xFF);
- *Data++ = ADS1x20_ReadWirte(0xFF);
- #else //ADS1220
- *Data++ = ADS1x20_ReadWirte(0xFF);
- *Data++ = ADS1x20_ReadWirte(0xFF);
- *Data++ = ADS1x20_ReadWirte(0xFF);
- *Data++ = ADS1x20_ReadWirte(0xFF);
- #endif
- ADS1x20_CS_Out(1);
- }
- //ADS1x20复位
- void ADS1x20_Reset(void)
- {
- ADS1x20_CS_Out(0);
- ADS1x20_ReadWirte(ADS1x20_RESET);
- ADS1x20_CS_Out(1);
- }
- //ADS1x20发送开始转换
- void ADS1x20_StartConversion(void)
- {
- ADS1x20_CS_Out(0);
- ADS1x20_ReadWirte(ADS1x20_START);
- ADS1x20_CS_Out(1);
- }
- //低功耗
- void ADS1x20_PowerDown(void)
- {
- ADS1x20_CS_Out(0);
- ADS1x20_ReadWirte(ADS1x20_POWERDOWN);
- ADS1x20_CS_Out(1);
- }
- //ADS1x20_ReadRegister:读取寄存器配置
- //pData:一次读取ADS1x20的4个寄存器配置
- //注:pData返回的数据空间需要4bit
- //这里是为了方便一次读出了所有寄存器的值,也可以像写寄存器那样单独读出单个寄存器的值
- void ADS1x20_ReadRegister(unsigned char *pData)
- {
- unsigned char i;
- ADS1x20_CS_Out(0);
- ADS1x20_ReadWirte(ADS1x20_RREG|0x03);
- for (i=0; i< 4; i++)// get the register content
- {
- *pData++ = ADS1x20_ReadWirte(0xFF);
- }
- ADS1x20_CS_Out(1);
- }
- //ADS1x20_WriteRegister:写入寄存器配置
- //StartAddress:写入寄存器的地址(如:00寄存器则配置为0;03寄存器则配置为3)
- //NumRegs:写入n个寄存器数据,从第StartAddress寄存器开始写
- //pData:写入寄存器的数据
- //如:把01寄存器写0x58 02寄存器写入0x49
- // unsigned char Temp[4];
- // Temp[0] = 0x58;
- // Temp[1] = 0x49;
- // ADS1x20_WriteRegister(1,2,Temp);
- void ADS1x20_WriteRegister(unsigned char StartAddress, unsigned char NumRegs, unsigned char * pData)
- {
- unsigned char i;
- ADS1x20_CS_Out(0);
- ADS1x20_ReadWirte(ADS1x20_WREG | (((StartAddress<<2) & 0x0c) |((NumRegs-1)&0x03)));// send the command byte
- for (i=0; i< NumRegs; i++)// send the data bytes
- {
- ADS1x20_ReadWirte(*pData);
- pData++;
- }
- ADS1x20_CS_Out(1);
- }
- void ADS1x20_ReadChannel(unsigned char Channel,unsigned char*Data)
- {
- unsigned char Register[4];
- Register[0] = Channel|ADS1x20_00_GAIN6|ADS1x20_00_PGA_BYPASS_E;//通道|放大倍数|PGA旁路
- Register[1] = ADS1x20_01_DR2|ADS1x20_01_MODE0|ADS1x20_01_CM0|ADS1x20_01_TS0|ADS1x20_01_BCS0;//转换速率|速率模式|转换模式|温度还是ADC|电流源开关
- Register[2] = ADS1x20_02_VREF0|ADS1x20_02_FIR1|ADS1x20_02_IDAC0;//参考电压|滤波|恒流源大小
- Register[3] = ADS1x20_03_I1MUX0|ADS1x20_03_I2MUX0|ADS1x20_03_DRDYM1;//恒流源1连接|恒流源2连接|转换结束RDRY和DOUT管脚拉低
- ADS1x20_WriteRegister(0,4,Register);//设置寄存器
- ADS1x20_StartConversion();//转换开始
- while(ADS1x20_DOUT_Get);//等待数据转换结束
- ADS1x20_ReadData(Data);//读取数据
- // ADS1x20_ReadRegister(Register);
- ADS1x20_PowerDown();//低功耗
- }
- //读取芯片温度
- unsigned short ADS1x20_ReadChip(void)
- {
- unsigned char Register;
- unsigned short temp;
- Register = ADS1x20_01_DR2|ADS1x20_01_MODE0|ADS1x20_01_CM0|ADS1x20_01_TS1|ADS1x20_01_BCS0;//转换速率|速率模式|转换模式|温度还是ADC|电流源开关
- ADS1x20_WriteRegister(1,1,&Register);//设置寄存器
- ADS1x20_StartConversion();//转换开始
- while(ADS1x20_DOUT_Get);//等待数据转换结束
- ADS1x20_CS_Out(0);
- ADS1x20_ReadWirte(ADS1x20_RDATA);//发送读命令
- temp = ADS1x20_ReadWirte(0xFF);//读芯片温度高字节
- temp = temp<<8;
- temp = temp+ADS1x20_ReadWirte(0xFF);//读芯片温度低字节
- ADS1x20_CS_Out(1);
- // ADS1x20_ReadRegister(Register);
- ADS1x20_PowerDown();//低功耗
-
- return temp;
- }
- //读取芯片温度
- float ADS1x20_ReadChipTemp(void)
- {
- unsigned short temp;
- float Temp;
- temp = ADS1x20_ReadChip();
- Temp = (float)(temp*0.00625);//温度=转换数据*0.03125/5(0.03125/5=0.00625)
- return Temp;
- }
- #ifdef ADS1120
- #else //ADS1220
- #endif
复制代码
- #ifndef __ADS1X20_H
- #define __ADS1X20_H
- #define ADS1120//如果定义了就是ADS1120如果没定义就是ADS1220
- #ifdef ADS1120
- #else //ADS1220
- #endif
- #define ADS1x20_RESET 0x06//Reset the device
- #define ADS1x20_START 0x08//Start or restart conversions
- #define ADS1x20_POWERDOWN 0x02//Enter power-down mode
- #define ADS1x20_RDATA 0x10//Read data by command
- #define ADS1x20_RREG 0x20//Read nn registers starting at address rr
- #define ADS1x20_WREG 0x40//Write nn registers starting at address rr
- //寄存器00
- #define ADS1x20_00_MUX0 0x00//AINP = AIN0, AINN = AIN1 (default)
- #define ADS1x20_00_MUX1 0x10//AINP = AIN0, AINN = AIN2
- #define ADS1x20_00_MUX2 0x20//AINP = AIN0, AINN = AIN3
- #define ADS1x20_00_MUX3 0x30//AINP = AIN1, AINN = AIN2
- #define ADS1x20_00_MUX4 0x40//AINP = AIN1, AINN = AIN3
- #define ADS1x20_00_MUX5 0x50//AINP = AIN2, AINN = AIN3
- #define ADS1x20_00_MUX6 0x60//AINP = AIN1, AINN = AIN0
- #define ADS1x20_00_MUX7 0x70//AINP = AIN3, AINN = AIN2
- #define ADS1x20_00_MUX8 0x80//AINP = AIN0, AINN = AVSS
- #define ADS1x20_00_MUX9 0x90//AINP = AIN1, AINN = AVSS
- #define ADS1x20_00_MUXA 0xA0//AINP = AIN2, AINN = AVSS
- #define ADS1x20_00_MUXB 0xB0//AINP = AIN3, AINN = AVSS
- #define ADS1x20_00_MUXC 0xC0//(VREFPx ?VREFNx) / 4 monitor (PGA bypassed)
- #define ADS1x20_00_MUXD 0xD0//(AVDD ?AVSS) / 4 monitor (PGA bypassed)
- #define ADS1x20_00_MUXE 0xE0//AINP and AINN shorted to (AVDD + AVSS) / 2
- #define ADS1x20_00_MUXF 0xF0//Not used
- #define ADS1x20_00_GAIN0 0x00//Gain = 1 (default)
- #define ADS1x20_00_GAIN1 0x02//Gain = 2
- #define ADS1x20_00_GAIN2 0x04//Gain = 4
- #define ADS1x20_00_GAIN3 0x06//Gain = 8
- #define ADS1x20_00_GAIN4 0x08//Gain = 16
- #define ADS1x20_00_GAIN5 0x0A//Gain = 32
- #define ADS1x20_00_GAIN6 0x0C//Gain = 64
- #define ADS1x20_00_GAIN7 0x0E//Gain = 128
- #define ADS1x20_00_PGA_BYPASS_E 0x00//PGA enabled (default) The PGA is always enabled for gain settings 8 to 128, regardless of the PGA_BYPASS setting.
- #define ADS1x20_00_PGA_BYPASS_D 0x01//PGA disabled and bypassed
- //寄存器01
- //------------------------------------Normal mod------Duty-cycle mode--Turbo mode
- #define ADS1x20_01_DR0 0x00//20 SPS (default)-5 SPS-----------40 SPS
- #define ADS1x20_01_DR1 0x20//45 SPS-----------11.25 SPS-------90 SPS
- #define ADS1x20_01_DR2 0x40//90 SPS-----------22.5 SPS--------180 SPS
- #define ADS1x20_01_DR3 0x60//175 SPS----------44 SPS----------350 SPS
- #define ADS1x20_01_DR4 0x80//330 SPS----------82.5 SPS--------660 SPS
- #define ADS1x20_01_DR5 0xA0//600 SPS----------150 SPS---------1200 SPS
- #define ADS1x20_01_DR6 0xC0//1000 SPS---------250 SPS---------2000 SPS
- #define ADS1x20_01_DR7 0xE0//Not used---------Not used--------Not used
- #define ADS1x20_01_MODE0 0x00//Normal mode (256-kHz modulator clock, default)
- #define ADS1x20_01_MODE1 0x08//Duty-cycle mode (internal duty cycle of 1:4)
- #define ADS1x20_01_MODE2 0x10//Turbo mode (512-kHz modulator clock)
- #define ADS1x20_01_MODE3 0x18//Not used
- #define ADS1x20_01_CM0 0x00//Single-shot mode (default)
- #define ADS1x20_01_CM1 0x04//Continuous conversion mode
- #define ADS1x20_01_TS0 0x00//Disables temperature sensor (default)
- #define ADS1x20_01_TS1 0x02//Enables temperature sensor
- #define ADS1x20_01_BCS0 0x00//Current sources off (default)
- #define ADS1x20_01_BCS1 0x01//Current sources on
- //寄存器02
- #define ADS1x20_02_VREF0 0x00//Internal 2.048-V reference selected (default)
- #define ADS1x20_02_VREF1 0x40//External reference selected using dedicated REFP0 and REFN0 inputs
- #define ADS1x20_02_VREF2 0x80//External reference selected using AIN0/REFP1 and AIN3/REFN1 inputs
- #define ADS1x20_02_VREF3 0xC0//Analog supply AVDD used as reference
- #define ADS1x20_02_FIR0 0x00//No 50-Hz or 60-Hz rejection (default)
- #define ADS1x20_02_FIR1 0x10//Simultaneous 50-Hz and 60-Hz rejection
- #define ADS1x20_02_FIR2 0x20//50-Hz rejection only
- #define ADS1x20_02_FIR3 0x30//60-Hz rejection only
- #define ADS1x20_02_PSW0 0x00//Switch is always open (default)
- #define ADS1x20_02_PSW1 0x08//Switch automatically closes when the START/SYNC command is sent and opens when the POWERDOWN commandis issued
- #define ADS1x20_02_IDAC0 0x00//Off (default)
- #define ADS1x20_02_IDAC1 0x01//Not used
- #define ADS1x20_02_IDAC2 0x02//50 uA
- #define ADS1x20_02_IDAC3 0x03//100 uA
- #define ADS1x20_02_IDAC4 0x04//250 uA
- #define ADS1x20_02_IDAC5 0x05//500 uA
- #define ADS1x20_02_IDAC6 0x06//1000 uA
- #define ADS1x20_02_IDAC7 0x07//1500 uA
- //寄存器03
- #define ADS1x20_03_I1MUX0 0x00//IDAC1 disabled (default)
- #define ADS1x20_03_I1MUX1 0x20//IDAC1 connected to AIN0/REFP1
- #define ADS1x20_03_I1MUX2 0x40//IDAC1 connected to AIN1
- #define ADS1x20_03_I1MUX3 0x60//IDAC1 connected to AIN2
- #define ADS1x20_03_I1MUX4 0x80//IDAC1 connected to AIN3/REFN1
- #define ADS1x20_03_I1MUX5 0xA0//IDAC1 connected to REFP0
- #define ADS1x20_03_I1MUX6 0xC0//IDAC1 connected to REFN0
- #define ADS1x20_03_I1MUX7 0xE0//Not used
- #define ADS1x20_03_I2MUX0 0x00//IDAC2 disabled (default)
- #define ADS1x20_03_I2MUX1 0x04//IDAC2 connected to AIN0/REFP1
- #define ADS1x20_03_I2MUX2 0x08//IDAC2 connected to AIN1
- #define ADS1x20_03_I2MUX3 0x0C//IDAC2 connected to AIN2
- #define ADS1x20_03_I2MUX4 0x10//IDAC2 connected to AIN3/REFN1
- #define ADS1x20_03_I2MUX5 0x14//IDAC2 connected to REFP0
- #define ADS1x20_03_I2MUX6 0x18//IDAC2 connected to REFN0
- #define ADS1x20_03_I2MUX7 0x1C//Not used
- #define ADS1x20_03_DRDYM0 0x00//Only the dedicated DRDY pin is used to indicate when data are ready (default)
- #define ADS1x20_03_DRDYM1 0x02//Data ready is indicated simultaneously on DOUT/DRDY and DRDY
- //#define ADS1x20_SADC0_1 ADS1x20_OS|ADS1x20_MUX0|ADS1x20_PGA5|ADS1x20_MODE1|ADS1x20_SPS4|ADS1x20_TEMP0|ADS1x20_PULL1//单次使能|AIN0-AIN1|PGA16|单次|128SPS|ADC|弱上拉
- //#define ADS1x20_ADC0_1 ADS1x20_MUX0|ADS1x20_PGA5|ADS1x20_MODE0|ADS1x20_SPS4|ADS1x20_TEMP0|ADS1x20_PULL1//AIN0-AIN1|PGA16|连续|128SPS|ADC|弱上拉
- //#define ADS1x20_STEMP ADS1x20_OS|ADS1x20_MODE1|ADS1x20_SPS4|ADS1x20_TEMP1|ADS1x20_PULL1//单次使能|单次|128SPS|温度|弱上拉
- //#define ADS1x20_TEMP ADS1x20_MODE0|ADS1x20_SPS4|ADS1x20_TEMP1|ADS1x20_PULL1//连续|128SPS|温度|弱上拉
- void ADS1x20_Init(void);
- void ADS1x20_ReadRegister(unsigned char *pData);
- void ADS1x20_WriteRegister(unsigned char StartAddress, unsigned char NumRegs, unsigned char * pData);
- void ADS1x20_ReadChannel(unsigned char Channel,unsigned char*Data);
- unsigned short ADS1x20_ReadChip(void);
- float ADS1x20_ReadChipTemp(void);
- #endif
复制代码
|
|