302 lines
7.8 KiB
C
302 lines
7.8 KiB
C
#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;
|
||
}
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|