电路设计论坛
直播中

飘逸的D

12年用户 800经验值
私信 关注
[问答]

AD7190和MSP430F249通信读出的AD数据为什么是0?

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

更多回帖

发帖
×
20
完善资料,
赚取积分