#include "ads1220.h" #include "delay.h" #include "main.h" unsigned char PolarFlag; unsigned char Init_Config[4],channel0[8],channel1[8],channel2[8],channel3[8]; unsigned char i; /*************************************************************************** 接线顺序 *************************************************************************/ //PB0 DRDY //PA7 MISO #define DIN_H HAL_GPIO_WritePin(GPIOA,GPIO_PIN_7,GPIO_PIN_SET); //PA7 MOSI #define DIN_L HAL_GPIO_WritePin(GPIOA,GPIO_PIN_7,GPIO_PIN_RESET); //PA7 MOSI #define SCK_H HAL_GPIO_WritePin(GPIOA,GPIO_PIN_5,GPIO_PIN_SET); //PA5 SCK #define SCK_L HAL_GPIO_WritePin(GPIOA,GPIO_PIN_5,GPIO_PIN_RESET); //PA5 SCK #define CS_H HAL_GPIO_WritePin(GPIOA,GPIO_PIN_4,GPIO_PIN_SET); //PA4 CS1 #define CS_L HAL_GPIO_WritePin(GPIOA,GPIO_PIN_4,GPIO_PIN_RESET); //PA4 CS1 #define ADS1220_MISO HAL_GPIO_ReadPin(GPIOA,GPIO_PIN_6) #define ADS1220_DRDY HAL_GPIO_ReadPin(GPIOC,GPIO_PIN_4) #define DALAY_CNT 1000 void ADS1220_GPIOInit(void) { GPIO_InitTypeDef GPIO_InitStructure; GPIO_InitStructure.Pin = GPIO_PIN_5|GPIO_PIN_7; //PA5 PA7 端口配置 MOSI&SCLK GPIO_InitStructure.Mode = GPIO_MODE_OUTPUT_PP; //推挽输出 GPIO_InitStructure.Speed = GPIO_SPEED_FREQ_HIGH; //IO口速度为50MHz HAL_GPIO_Init(GPIOA, &GPIO_InitStructure); //根据设定参数初始化 HAL_GPIO_WritePin(GPIOA,GPIO_PIN_5|GPIO_PIN_6,GPIO_PIN_SET); GPIO_InitStructure.Pin = GPIO_PIN_6; //端口配置 PA6 MISO GPIO_InitStructure.Mode = GPIO_MODE_INPUT; //上拉输入 GPIO_InitStructure.Pull = GPIO_PULLUP ; HAL_GPIO_Init(GPIOA, &GPIO_InitStructure); // GPIO_InitStructure.Pin = GPIO_PIN_4; //端口配置 PC4 DRDY GPIO_InitStructure.Mode = GPIO_MODE_INPUT; //上拉输入 GPIO_InitStructure.Pull = GPIO_PULLUP; //IO口速度为50MHz HAL_GPIO_Init(GPIOC, &GPIO_InitStructure); GPIO_InitStructure.Pin = GPIO_PIN_4; //端口配置 PA4 CS GPIO_InitStructure.Mode = GPIO_MODE_OUTPUT_PP; //推挽输出 GPIO_InitStructure.Speed = GPIO_SPEED_FREQ_HIGH; //IO口速度为50MHz HAL_GPIO_Init(GPIOA, &GPIO_InitStructure); } /*************************************************************************** 函数名称:WriteOneByte(unsigned char 命令) 用途:写入一个字节到ADS1220 *************************************************************************/ void WriteOneByte(unsigned char command) { unsigned char i; for(i = 0; i < 8;i++) { if(command&0x80) { DIN_H;//ADS1220_DIN = 1 } else { DIN_L;//ADS1220_DIN = 0;/ } command <<= 1; delay_us(10); SCK_H;//ADS1220_SCK = 1; delay_us(10); SCK_L;//ADS1220_SCK = 0; delay_us(10); } } /*************************************************************************** *函数名称:ReadOneByte() *用途:从ADS1220读取一个字节 *************************************************************************/ unsigned char ReadOneByte(void) { unsigned char result,i; SCK_L;//SCLK_L; for(i = 0;i<8; i++) { SCK_H; delay_ns(1); result <<= 0x01; if(ADS1220_MISO) result |= 0X01; SCK_L; delay_ns(1); } return result; } /*************************************************************************** *函数名称:ReadData() *用途:从ADS1220读取数据 *************************************************************************/ unsigned long ReadData(void) { unsigned long adval; unsigned char a,b,c; CS_L; delay_ns(10); WriteOneByte(RDATA); a = ReadOneByte(); b = ReadOneByte(); c = ReadOneByte(); adval = a; adval = (adval<<8) | b; adval = (adval<<8) | c; delay_ns(10); CS_H; return adval; } /*************************************************************************** *函数名称:ADReset() *用途:复位ADS1220 *************************************************************************/ void ADReset(void) { CS_L; delay_ns(1); WriteOneByte(RESET); CS_H; } /*************************************************************************** 函数名称:ADS1220_Init() *用途:ADS120初始化 *************************************************************************/ void ADS1220_Init(void) { CS_H; SCK_H; DIN_H; ADReset(); } /*************************************************************************** *函数名称:关闭电源() *************************************************************************/ void ADPowerDown(void) { CS_L; WriteOneByte(POWERDOWN); CS_H; } /*************************************************************************** *函数名称:ADStartConversion() *用途:开始转换 *参数: *************************************************************************/ void ADStartConversion(void) { CS_L; WriteOneByte(START); CS_H; } /*************************************************************************** *函数名称:ReadRegister() *用途:从寄存器中读取数据 *参数:数据 *************************************************************************/ void ReadRegister(void) { unsigned char i; unsigned long Data; CS_L; WriteOneByte(RREG|0x03); for (i=0; i< 4; i++) { Data += ReadOneByte(); } CS_H; } /*************************************************************************** *函数名:WriteRegister(unsigned char StartAddress, unsigned char NumRegs, unsigned char * pData) *用途:向寄存器写入数据 *步骤:写地址2。写入数据 * Params NumRegs-----寄存器的数字 *************************************************************************/ void WriteRegister(unsigned char StartAddress, unsigned char NumRegs, unsigned char * pData) { unsigned char i; CS_L; WriteOneByte(WREG | (((StartAddress<<2) & 0x0c) |((NumRegs-1)&0x03))); for (i=0; i< NumRegs; i++) { WriteOneByte(*pData); pData++; } CS_H; } /*************************************************************************** 函数名称:CofigAD(unsigned char channel) *用途:设置采样通道 *参数: *************************************************************************/ void CofigAD(unsigned char channel) { switch(channel) { case 0: Init_Config[0] = MUX_8 | PGA_0 | PGA_BYPASS_Disable;//单端模式,选择通道AINP = AIN0,AINN = AVSS ,PGA = 1,禁用PGA break; case 1: Init_Config[0] = MUX_9 | PGA_0 | PGA_BYPASS_Disable;//单端模式,选择通道AINP = AIN1,AINN = AVSS ,PGA = 1,禁用PGA break; case 2: Init_Config[0] = MUX_10 | PGA_0 | PGA_BYPASS_Disable;//单端模式,选择通道AINP = AIN2,AINN = AVSS,PGA = 1,禁用PGA break; case 3: Init_Config[0] = MUX_11 | PGA_0 | PGA_BYPASS_Disable;//单端模式,选择通道AINP = AIN3,AINN = AVSS,PGA = 1,禁用PGA break; case 4: Init_Config[0] = MUX_0 | PGA_0 | PGA_BYPASS_Disable;//差分模式,选择通道AINP = AIN0,AINN = AIN1(默认设置),PGA = 1,禁用PGA break; } Init_Config[1] = 0XC0; Init_Config[2] = 0X00; Init_Config[3] = 0X00; WriteRegister(0x00,0x04,Init_Config); ReadRegister(); } /*************************************************************************** *函数名:GetAD(unsigned char channel) *目的:得到结果 *************************************************************************/ float GetAD(unsigned char channel) { float Result_f; unsigned long Result; unsigned long delay_cnt = 0; CofigAD(channel); ADStartConversion(); while(ADS1220_DRDY) { delay_cnt++; if(delay_cnt > DALAY_CNT) { break; } } Result = ReadData(); ADPowerDown(); if(Result & 0x800000) { PolarFlag = 1; Result = ~Result; Result = Result&0xffffff; Result = Result+1; } else PolarFlag =0; Result_f = (float)Result*1000*2.499/(1048575) + 150;//20位精度 Result_f /= 10.0; return Result_f; }