#include "AD7124.h"
#include <stdio.h>
#include "THERMOCOUPLE.H"
#include "74HC138D.h"
u8 jieguo[10]={0};
//CS---GND SCLK---PA5 MOSI/DIN---PA7 MISO/DOUT----PA6 模式3 第二个边沿收发
void AD7124_Init() //硬件初始化
{
GPIO_InitTypeDef GPIO_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_GPIOC, ENABLE); //使能端口时钟
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5|GPIO_Pin_7;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; //推挽输出
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; //IO口速度为50MHz
GPIO_Init(GPIOA, &GPIO_InitStructure); //根据设定参数初始化
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9|GPIO_Pin_8;
GPIO_Init(GPIOC, &GPIO_InitStructure); //根据设定参数初始化
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6; //输入
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING; //浮空输入
GPIO_Init(GPIOA, &GPIO_InitStructure);
GPIO_SetBits(GPIOC, GPIO_Pin_9|GPIO_Pin_8); //置1
AD7124_SCLK = 1; //空闲状态下
}
void AD7124_Rest() //复位
{
u8 i=0;
AD7124_SCLK = 1;
for(i=0;i<70;i++)
{
AD7124_SCLK = 1;
AD7124_MOSI =1;
AD7124_SCLK = 0;
delay_us(1);
}
}
void AD7124_Write(u8 data) //写 用于写寄存器
{
u8 i=0;
AD7124_SCLK = 1; //空闲状态下
for(i=0;i<8;i++)
{
AD7124_SCLK = 0;
delay_us(1);
if(data & 0x80)
AD7124_MOSI =1 ;
else
AD7124_MOSI =0 ;
AD7124_SCLK = 1;
data<<=1;
delay_us(1);
}
AD7124_SCLK = 1;
}
void AD7124_Write_xByte(u8 ADD ,u8 xByte,u32 data) //写 地址,字节,数据 用于写寄存器
{
AD7124_Write(ADD);
if(xByte == 1)
AD7124_Write(data);
if(xByte == 2)
{
AD7124_Write(data>>8);
AD7124_Write(data);
}
if(xByte == 3)
{
AD7124_Write(data>>16);
AD7124_Write(data>>8);
AD7124_Write(data);
}
if(xByte == 4)
{
AD7124_Write(data>>24);
AD7124_Write(data>>16);
AD7124_Write(data>>8);
AD7124_Write(data);
}
}
void AD7124_Write_RS_Read(u8 data) //写 用于读寄存器
{
u8 com = 0x40;
u8 i=0;
com |= data;
AD7124_SCLK = 1; //空闲状态下
for(i=0;i<8;i++)
{
AD7124_SCLK = 0;
delay_us(1);
if(com & 0x80)
AD7124_MOSI =1 ;
else
AD7124_MOSI =0 ;
AD7124_SCLK = 1;
com<<=1;
delay_us(1);
}
AD7124_SCLK = 1;
}
u8 AD7124_Read(void) //读8bit
{
u8 i=0;
u8 data=0;
AD7124_SCLK = 1; //空闲状态下
for(i=0;i<8;i++)
{
data<<=1;
AD7124_SCLK = 0;
delay_us(1);
AD7124_SCLK = 1;
delay_us(1);
data |= AD7124_MISO;
}
AD7124_SCLK = 1;
return data;
}
u32 AD7124_Read_X(u8 add,u8 number)
{
u32 data=0;
AD7124_Write_RS_Read(add);
if(number == 1)
data = AD7124_Read();
if(number == 2)
{
data = AD7124_Read();
data <<= 8;
data |= AD7124_Read();
}
if(number == 3)
{
data = AD7124_Read();
data <<= 8;
data |= AD7124_Read();
data <<= 8;
data |= AD7124_Read();
}
if(number == 4)
{
data = AD7124_Read();
data <<= 8;
data |= AD7124_Read();
data <<= 8;
data |= AD7124_Read();
data <<= 8;
data |= AD7124_Read();
}
return data;
}
u8 One_Convert() //单次转换配置
{
u8 cnt=0;
u8 temp=0;
AD7124_Write(0x01);
AD7124_Write(0x04);
while(AD7124_MOSI ==1)
{
delay_us(1);
cnt++;
if(cnt>50)
return 0;
}
AD7124_Write(0x42);
temp = AD7124_Read();
return temp;
}
u8 Contin_Convert() //连续转换配置
{
u8 cnt=0;
u8 temp=0;
AD7124_Write(0x42);
temp = AD7124_Read();
AD7124_Write(0x42);
temp = AD7124_Read();
return temp;
}
u8 Contin_Read() //连续读取配置
{
u8 cnt=0;
u8 temp=0;
AD7124_Write(0x01);
AD7124_Write(0x08);
AD7124_Write(0x00);
while(AD7124_MISO ==1)
{
delay_us(1);
cnt++;
if(cnt>50)
return 0;
}
temp = AD7124_Read();
temp = AD7124_Read();
return temp;
}
void AD7124_Check_ID(void) //检查模块时序、复位
{
u8 temp=0;
AD7124_Write(0x45);
temp = AD7124_Read();
if(temp != 0x14 && temp != 0x15)
AD7124_Rest(); //复位
}
void Choose_Channel() //通道0初始化
{
AD7124_Check_ID(); //检查模块时序、复位
//1.控制寄存器
AD7124_Write_xByte(AD7124_ADC_CTRL_REG,2,AD7124_ADC_CTRL_REG_DATA_STATUS | AD7124_ADC_CTRL_REG_REF_EN | AD7124_ADC_CTRL_REG_POWER_MODE(3) | AD7124_ADC_CTRL_REG_MODE(0) | AD7124_ADC_CTRL_REG_CLK_SEL(0));
//2.写AD7124 通道0寄存器
AD7124_Write_xByte(AD7124_CH5_MAP_REG,2,AD7124_CH_MAP_REG_CH_ENABLE | AD7124_CH_MAP_REG_SETUP(0) | AD7124_CH_MAP_REG_AINP(10) | AD7124_CH_MAP_REG_AINM(11));
//3.写AD7124 配置0寄存器
AD7124_Write_xByte(AD7124_CFG0_REG,2,AD7124_CFG_REG_BIPOLAR | AD7124_CFG_REG_AIN_BUFP | AD7124_CFG_REG_AINN_BUFM | AD7124_CFG_REG_REF_BUFP | AD7124_CFG_REG_REF_BUFM | AD7124_CFG_REG_REF_SEL(0) | AD7124_CFG_REG_PGA(5) | Samprate_2Hz);
//4.滤波器打开
AD7124_Write_xByte(AD7124_FILT0_REG,3,AD7124_FILT_REG_FILTER(0) | AD7124_FILT_REG_REJ60 | AD7124_FILT_REG_POST_FILTER(0) | AD7124_FILT_REG_FS(384));
}
void Yx_Channel(u8 number) //number 0~7
{
uint8_t PGA =5;
u8 i=0;
u32 REGtemp=0,tempp=0;
u32 temp=0;
float adcx=0;
Set_High_Voltage(number); //第几位接通
//1.复位ADC
AD7124_Rest(); //复位
AD7124_Write_xByte(AD7124_ADC_CTRL_REG,2,/*AD7124_ADC_CTRL_REG_REF_EN | */AD7124_ADC_CTRL_REG_POWER_MODE(3) | AD7124_ADC_CTRL_REG_MODE(0) | AD7124_ADC_CTRL_REG_CLK_SEL(0));
// AD7124_Write_xByte(AD7124_CH0_MAP_REG,2,AD7124_CH_MAP_REG_CH_ENABLE | AD7124_CH_MAP_REG_SETUP(0) | AD7124_CH_MAP_REG_AINP(11) | AD7124_CH_MAP_REG_AINM(10));
// AD7124_Write_xByte(AD7124_CFG0_REG,2,AD7124_CFG_REG_BIPOLAR | AD7124_CFG_REG_AIN_BUFP | AD7124_CFG_REG_AINN_BUFM | AD7124_CFG_REG_REF_BUFP | AD7124_CFG_REG_REF_BUFM | AD7124_CFG_REG_REF_SEL(0) | AD7124_CFG_REG_PGA(5));
// AD7124_Write_xByte(AD7124_FILT0_REG,3,AD7124_FILT_REG_FILTER(0) | AD7124_FILT_REG_REJ60 | AD7124_FILT_REG_POST_FILTER(0) | AD7124_FILT_REG_FS(384));
//3.配置寄存器0 双极性 开路检测电流源关闭 REFINx(+)上的缓冲器使能。 REFINx(-)上的缓冲器使能。 AINP上的缓冲器使能 //AINM上的缓冲器使能 基准电压选择REFIN2(+)/REFIN2(-)。增益32
AD7124_Write_xByte(AD7124_CFG0_REG,2,AD7124_CFG_REG_BIPOLAR|AD7124_CFG_REG_BURNOUT(0)|AD7124_CFG_REG_REF_BUFP|AD7124_CFG_REG_REF_BUFM | AD7124_CFG_REG_AIN_BUFP|AD7124_CFG_REG_AINN_BUFM|AD7124_CFG_REG_REF_SEL(0)|AD7124_CFG_REG_PGA(5));
//4.滤波器配置 000 = sinc4滤波器(默认)。
AD7124_Write_xByte(AD7124_FILT0_REG,3,AD7124_FILT_REG_FILTER(0)|AD7124_FILT_REG_REJ60|AD7124_FILT_REG_POST_FILTER(0)|AD7124_FILT_REG_SINGLE_CYCLE|AD7124_FILT_REG_FS(384));
//5.失调寄存器
//2.通道寄存器 通道0配置 通道使能1 模拟配置 AIN10正模拟 AIN11负模拟
AD7124_Write_xByte(AD7124_CH0_MAP_REG,2,AD7124_CH_MAP_REG_CH_ENABLE|AD7124_CH_MAP_REG_SETUP(0)|AD7124_CH_MAP_REG_AINP(11)|AD7124_CH_MAP_REG_AINM(10));
while(AD7124_MISO ==1){}
AD7124_Write_RS_Read(0x42);
for(i=0;i<3;i++)
{
jieguo[i] = AD7124_Read();
}
temp = jieguo[0];
temp <<=8;
temp |= jieguo[1];
temp <<=8;
temp |= jieguo[2];
adcx = temp;
adcx = (adcx-8388608)*78.125/8388608;
printf("temp = %f\r\n",adcx); //(temp-8388608)*78.125/8388608
adcx = K_VtoT(adcx);
printf("temp = %f\r\n",adcx);
}
void Test_AD7124()
{
Yx_Channel(1);
}