打印

AD7799使用困惑,急!!

[复制链接]
4899|7
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
jianghuang|  楼主 | 2007-4-7 15:21 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
我用的是AD7799BRUZ芯片,打算应用于称重。
电路连接参照数据手册(Rev.0) 27页的那个电路,
我只用了AIN1一个通道,其余未用。

出现的问题是:采不出数据。

进行满量程校准后读出的数据全为FF,读状态寄存器有错误标志。把REF_DEC置位后有NOREF错误标志,可是我的参考电压接是是正5V啊,是不是AD7799内部的参考电压电路部分损坏了啊!!
#include <intrins.h>        /* use _nop_() function */
/*
AD7799写寄存器函数
WriteData:要写的数据
*/
void WriteByteToAd7799(unsigned char WriteData)
{
   unsigned char i;
   //AD7799_CS=0;
   for(i=0;i<8;i++)
   {
      AD7799_SCLK=0;
      if(WriteData&0x80)AD7799_DIN=1;
      else AD7799_DIN=0;
      WriteData=WriteData<<1;
      AD7799_SCLK=1;
    }
    //AD7799_CS=1;
}

/*
AD7799读寄存器函数
*/
unsigned char ReadByteFromAd7799(void)
{
   unsigned char i;
   unsigned char ReadData;
   //AD7799_CS=0;
   ReadData=0;
   for(i=0;i<8;i++)
   {
      AD7799_SCLK=0;
      ReadData=ReadData<<1;
      if(AD7799_DOUT)ReadData+=1;
      AD7799_SCLK=1;
   }
   //AD7799_CS=1;
   return(ReadData);
}

void WaiteRDY(void)
{
    unsigned int iint;
    iint=0;
    while(AD7799_RDY)
    {
        iint++;
        if(iint>20000)
        {
            //reset ad7799
            WriteByteToAd7799(0xff);
            WriteByteToAd7799(0xff);
            WriteByteToAd7799(0xff);
            WriteByteToAd7799(0xff);
            for(iint=0;iint<1000;iint++)
            {
                _nop_();
                _nop_();
            }
            Ad7799_Ini(0);
            break;
        }
    }
}

void Ad7799_Ini(unsigned char ChannelNum)
{
    
    WriteByteToAd7799(0x10);//b0000 1000
    /* Writes to Communications Register Setting Next Operation as Write to
    CONFIGURATION Register*/
    WriteByteToAd7799(0x00); //增益为0
    WriteByteToAd7799(0x10+ChannelNum); //1通道
    /*CONFIGURATION REGISTER[00,BO(0),U/B(0),
    0(0),G2(1),G1(1),G0(1),0,0,REF_DET(0),BUF(1),0(0),CH2(0),CH1(0),CH0(0)]*/

    WriteByteToAd7799(0x08); //b0000 1000
    /* Writes to Communications Register Setting Next Operation as Write to
    Mode Register*/
    WriteByteToAd7799(0x80);
    WriteByteToAd7799(0x0a);
    /* Writes to Mode Register Initiating Internal Zero-Scale Calibration*/
    WaiteRDY();
    /* Wait for RDY pin to go low to indicate end of calibration cycle*/
    WriteByteToAd7799(0x08);
    /* Writes to Communications Register Setting Next Operation as Write to
    Mode Register*/
    WriteByteToAd7799(0xa0);
    WriteByteToAd7799(0x0a);
    /* Writes to Mode Register Initiating Internal Full-Scale Calibration*/
    WaiteRDY();
    /* Wait for RDY pin to go low to indicate end of calibration cycle*/



    WriteByteToAd7799(0x08); //b0000 1000
    /* Writes to Communications Register Setting Next Operation as Write to
    Mode Register*/
    WriteByteToAd7799(0x00);
    WriteByteToAd7799(0x0A);
    /* Mode Register[MD2(0),MD1(0),MD0(0),PSW(0),0(0),0(0),0(0),0(0),
    (0),(0),0(0),0(0),FS3(1),FS2(0),FS1(1),FS0(0)]*/
    /*模式0 Continuous-Conversion Mode.,Fadc=16.7HZ;*/
}

long ReadAd7799ConversionData(void)
{
    long ConverData;
    unsigned char ADSAT;
    unsigned int iint;

    WaiteRDY();
    WriteByteToAd7799(0x40);
    ADSAT=ReadByteFromAd7799();
    if((ADSAT&0x40)||(ADSAT& 0x08)==0)  //出错或者读写异常
    {
   WriteByteToAd7799(0xff);
   WriteByteToAd7799(0xff);
   WriteByteToAd7799(0xff);
   WriteByteToAd7799(0xff);
   for(iint=0;iint<3000;iint++)
   {
        _nop_();
    }
    Ad7799_Ini(0);
       return(0);
    }
    else
    {
    WriteByteToAd7799(0x58);

    /* Writes to Communications Register Setting Next Operation as Continuous
    Read From Data Register*/
    WaiteRDY();
   /* Wait for RDY pin to go low to indicate end of calibration cycle*/
   if(!AD7799_RDY)
   {
       ConverData=0;
       ConverData=ReadByteFromAd7799();
       ConverData=ConverData<<8;
       ConverData=ReadByteFromAd7799()+ConverData;
       ConverData=ConverData<<8;
       ConverData=ReadByteFromAd7799()+ConverData;
   }
   /* Read Conversion Result from AD7730's Data Register*/



   return(ConverData);

   }
}

#include <reg52.h>
#include "ad7799.h"

idata long addata;

main()
{
   Ad7799_Ini(0);
   while(1)
   {
     addata=ReadAd7799ConversionData();
   }
}

相关帖子

沙发
ayb_ice| | 2007-4-7 15:43 | 只看该作者

急也没有用,分析分析程序,看看datasheet...

急也没有用,分析分析程序,看看datasheet,一定是程序问题...

使用特权

评论回复
板凳
jianghuang|  楼主 | 2007-4-7 16:21 | 只看该作者

程序我都分析的很透彻了

程序我都分析的很透彻了,datasheet也看了很多遍了
还是找不到原因
我怀疑AD7799的参考电压部分坏了,可现在手头没有可以换的

使用特权

评论回复
地板
ayb_ice| | 2007-4-7 16:29 | 只看该作者

不知你是什么MCU

不知你是什么MCU,感觉读数据应该AD7799_DOUT置1...

使用特权

评论回复
5
jianghuang|  楼主 | 2007-4-7 17:29 | 只看该作者

就是普通的C51单片机啊

就是普通的C51单片机啊

使用特权

评论回复
6
billypeng| | 2017-4-10 18:16 | 只看该作者
简单的方式,换一个芯片.
AD7799的参考电压,我用2.5V,ref3025提供。基本没有什么问题。三个通道都可以使用。

使用特权

评论回复
7
lnulibin| | 2017-4-10 19:13 | 只看该作者
也许是读写时序错误,
先找一个AD7799中的可读可写的寄存器,
写入一个数据,然后再把数据读出,看一看是否一致.
确保时序是对的.
然后再研究别的问题.

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

8

主题

20

帖子

0

粉丝