AD7190和MSP430F249
通信,使用的是模拟SPI,可以配置AD7190的GPIO,万用表测量有正确的值,读出GPIO寄存器值,
可以读取ID,读取配置寄存器值,但是就是不能读出AD值,全是0。求解
/******************AD7190协议*********************************
名 称:AD7190.H
实现功能:SPI测量AD7190的数据,测量电压值
说 明:系统校准,测量电压
***************************************************/
#ifndef _AD7190_H
#define _AD7190_H
#define SYNC_1 P6OUT |= BIT6
#define SYNC_0 P6OUT = ~BIT6
#define A5SD_1 P4OUT |= BIT2
#define A5SD_0 P4OUT = ~BIT2
#define SHUT_1 P4OUT |= BIT1
#define SHUT_0 P4OUT = ~BIT1
#define ADCS_1 P6OUT |= BIT5
#define ADCS_0 P6OUT = ~BIT5
#define SCLK_1 P5OUT |= BIT3
#define SCLK_0 P5OUT = ~BIT3
#define DOUT_1 P5OUT |= BIT1
#define DOUT_0 P5OUT = ~BIT1
#define DIN_val P5IN BIT2 //接AD7190数据输出引脚
/*******************************************
名称:Write_AD7190 向AD7190写1个数据
参数: len 要发送的数据长度 ; buf要发送的缓冲区
说明:CS低电平,使能AD7190,发送数据
********************************************/
void Write_AD7190(unsigned char len, unsigned char *buf)
{
unsigned char i,j;
unsigned char TX_dat;
SCLK_1 ; delay_us(10); //CLK高电平
//SYNC_1;
ADCS_1 ; delay_us(10); //使能AD7190
//SYNC_0;
ADCS_0 ; delay_us(10);
for(i=len;i>0;i--)
{
TX_dat=*(buf + i - 1);
for(j=0; j<8; j++)
{
SCLK_0;
if((TX_dat 0x80)==0x80) { DOUT_1;} //Send one to SDO pin
else { DOUT_0;}
delay_us(10);
SCLK_1;
delay_us(10);
TX_dat <<= 1; //Rotate d
}
}
//SYNC_1;
ADCS_1 ; //不使能
}
/*******************************************
名称:Read_AD7190 读出AD7190的数据
参数: len 要发送的数据长度 ; buf要发送的缓冲区
说明:CS低电平,使能AD7190,接受数据,关闭CS
********************************************/
void Read_AD7190(unsigned char len, unsigned char *buf)
{
unsigned char i,j;
unsigned char RX_dat=0;
SCLK_1 ; delay_us(10); //CLK高电平
//SYNC_1;
ADCS_1 ; delay_us(10); //使能AD7190
//SYNC_0;
ADCS_0 ; delay_us(10);
//while(DIN_val==1); //等待AD7190输出低电平
for(j=len; j>0; j--)
{
RX_dat=0;
for(i=0; i<8; i++)
{
SCLK_0;
RX_dat <<= 1; //Rotate data
delay_us(10);
if(DIN_val){ RX_dat |=0x01;}
SCLK_1; delay_us(10);
}
*(buf+j-1)= RX_dat;
}
//SYNC_1;
ADCS_1 ;
}
/*******************************************
名称:AD7190_Init 读出AD7190的数据
说明:配置AD7190的增益,极性,时钟,输出频率,
********************************************/
void AD7190_Init(void)
{
unsigned char buf[4]={0,0,0,0};
SYNC_0;
SCLK_1;
ADCS_1; //CS高电平
DOUT_1; //DOUT输出高电平
buf[2]=0xff;buf[1]=0xff;buf[0]=0xff;
Write_AD7190(3,buf); Write_AD7190(2,buf);
delay_us(800);
buf[0]=0x10;
Write_AD7190(1,buf); //写通信寄存器0x10,配置配置寄存器
buf[2]=0x00; //Vrl- vrl+是基准电压源
buf[1]=0x08; //配置通道 通道AIN2+ _AIN2- //08
buf[0]=0x00; //禁止激励电流,禁止基准电压检测,禁止buf缓冲区,极性,增益=1 //00
Write_AD7190(3,buf);
buf[0]=0x08;
Write_AD7190(1,buf); //写通信寄存器0x08,配置模式寄存器
buf[2]=0x08; //工作模式,连续工作模式,内部E4.92M晶振 08
buf[1]=0x03; //sinc4 滤波器,不校验,单周期转换 03
buf[0]=0x00; // 输出频率4.7HZ ff
Write_AD7190(3,buf); //写模式寄存器,
buf[0]=0x28; //GPIO设计
Write_AD7190(1,buf); //写通信寄存器0x28,配置写GPI0寄存器
buf[0]=0x3f; //使能P0,P1,P2,P3;都是高电平 0x3f
Write_AD7190(1,buf);
}
//AD转换函数
float AD7190_Convert(void)
{
unsigned char buf[4]={0,0,0,0};
long Temp,T1,T2;
float AD_Value=0;
buf[0]=0x58; //0x58 读数据寄存器 //0x5c是连续读
Write_AD7190(1,buf); //写通信寄存器0x58,读出数据存储器
//while(DIN_val==1);
Read_AD7190(3,buf);
Uart0_TX_byte(buf[2]);
Uart0_TX_byte(buf[1]);
Uart0_TX_byte(buf[0]);
T1=(long)buf[2]<<16 ;
T2=(long)buf[1]<<8 ;
Temp = T1+T2+buf[0];
AD_Value = (float)Temp*2.98E-4; //MV
return AD_Value;
}
//读GPI0寄存器状态 返回结果正确
void AD7190_Read_GPIO(void)
{
unsigned char buf[4]={0,0,0,0};
buf[0]=0x68; //读GPIO寄存器
Write_AD7190(1,buf);
Read_AD7190(1,buf);
Uart0_TX_byte(buf[0]);
}
//读ID 返回数据是0x80
void AD7190_Read_ID(void)
{
unsigned char buf[4]={0,0,0,0};
buf[0]=0x60; //读设备ID
Write_AD7190(1,buf);
Read_AD7190(1,buf);
Uart0_TX_byte(buf[0]);
}
//读出配置寄存器数据,用来测试,返回数据正常
void AD7190_Read_Status(void)
{
unsigned char buf[4]={0,0,0,0};
buf[0]=0x50; //读配置寄存器
Write_AD7190(1,buf); //write communica
tion register 0x50 to control the progress to read configuration register
Read_AD7190(3,buf); //read configuration register
Uart0_TX_byte(buf[2]);
Uart0_TX_byte(buf[1]);
Uart0_TX_byte(buf[0]);
}
#endif