已回答假定已回答

AD7190和MSP430F249通信读出的AD数据是0,求解,可以配置7190的I/O状态,读取配置

dun20062006@126.com 在 2014-4-3 詢問的問題
最後回覆由adi_rock於2014-4-8提供

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 communication 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

結果