打印

AD7712的驱动程序的问题,请各位前辈帮忙看看。

[复制链接]
4242|17
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
ddwl99|  楼主 | 2011-1-18 09:01 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
在我的调试过程中,发现两个问题。
第一,AD7712控制寄存器写不进去。我拿来一个新的芯片,然后就写进去了。等到你重新给板子上电之后,就发现写不进去。怎么读取控制寄存器的值都是默认值。
第二,在控制寄存器写入成功后,读取AD值,发现,当外部电压为0的时候读取出数值为7FFFFF,然后当电压超过2.5V之后读取数值为000000,只有当电压在0-2.5V时才能读出数。

硬件就是最基本电路,什么都没有。我的控制寄存器写入的数据时0x228146.选择的是2通道,增益为1.范围应该为-10V~+10v才对呀!

下面是我的C代码,MCU是PIC18F4520
void writeAD7712(U32 data, U8 add)
{
        U8 i = 0;
        U8 bitTmp = 0;
        
        ODATA = 0;
        WDATA();//DATA口改为输出状态
        
        switch(add)
        {
                case CTRL_REG:
                        A0 = 0;
                        break;
                case DATA_REG:
                        A0 = 1;
                        break;
                default:
                        A0 = 1;//默认处理数据寄存器或者校正寄存器
        }
        RFS = 1;
        TFS = 0;
        
        for(i = 0; i < 24; i++)
        {
                if(data & 0x00800000)
                {
                        ODATA = 1;
                }
                else
                {
                        ODATA = 0;
                }
                Nop();
                SCLK = 1;
                delaySPI();
                SCLK = 0;
                delaySPI();
                data <<= 1;
        }
        
        TFS = 1;
        A0 = 1;
        SCLK = 0;
}

void readAD7712(U8 add)
{
        U8 i = 0;
        static U32 tempData = 0;
        RDATA();
        
        if(0 == _cnt)//开始读取
        {
               
                while(DRDY);
                switch(add)
                {
                        case CTRL_REG:
                                A0 = 0;
                                break;
                        case DATA_REG:
                                A0 = 1;
                                break;
                        default:
                                A0 = 1;//默认处理数据寄存器或者校正寄存器
                }
                RFS = 0;
                TFS = 1;
        }
        
        if(0 == RFS)
        {
                if(0 == SCLK)
                {
                        SCLK = 1;
                        if(IDATA)
                        {
                                tempData++;
                        }        
                }
                else
                {
                        if(_cnt < 23)
                        {
                                tempData <<= 1;
                        }
                        _cnt++;
                        SCLK = 0;
                }
        }        
        
        if(24 == _cnt)
        {
                static U8 vl = 0;
               
                SCLK = 0;
                RFS = 1;
                TFS = 1;
               
                readValue[vl] = tempData;
                vl = ++vl % 50;
                tempData = 0;
                _cnt = 0;
               
        }
}
void main(void)
{
        RCONbits.IPEN = 1;
        
        INTCON = 0x00;                                                                        
        INTCON2 = 0x00;
        INTCON3 = 0x00;
        
        PIE1 = 0x00;
        PIE2 = 0x00;

        
        PIR1 = 0;
        PIR2 = 0;
        INTCONbits.GIE = 0;//关闭全局中断及外设中断
        INTCONbits.PEIE = 0;
        initTimer0();
        initIOPort();
        initAD7712();
        INTCONbits.PEIE = 1;//打开全局中断及外设中断
        INTCONbits.GIE = 1;
        
        while(1)
        {
                if(sysTick > 5)
                {
                        sysTick = 0;
                        readAD7712(CTRL_REG);
                }
        }        
}

请各位帮帮忙看看哪有问题~
我的QQ:23158314

相关帖子

沙发
ddwl99|  楼主 | 2011-1-20 10:43 | 只看该作者
昨天ADI公司工程师回帖:
对于寄存器不能正常读写,一般要从硬件和软件两方面找问题。建议您先检查一下硬件连接是否良好,PCB焊接等问题会引起寄存器不能正常读写的状况。您可以先测量一下供电管脚,接地管脚,以及REF OUT输出是否正常。
对于读写寄存器,需要注意的是通信时序,您可以将通信时序用示波器测量一下,然后与数据手册中给出的时序进行一下对比,也可以抓图贴上来一起帮您分析一下。

他所说的我都已经查看了,没有问题。

大家有没有遇到过这个问题呢~?
0-2.5V能读出数来还不算,它的数值是反的,理论上讲应该是0V对应0x000000,而2.5V对应7FFFFF吧。但是他却是反的~~

使用特权

评论回复
板凳
tcc8073| | 2012-9-4 08:58 | 只看该作者
你的问题有解决吗,如果有的话把解决的过程也给出来一下,让大家学习下,谢谢!

使用特权

评论回复
地板
csl84| | 2012-9-4 14:42 | 只看该作者
你怎么知道是,没写进去呢,我认为是操作时序的问题。

使用特权

评论回复
5
zwwoshi| | 2012-9-15 16:47 | 只看该作者
可能是时序的问题!

使用特权

评论回复
6
tcc8073| | 2012-9-17 09:51 | 只看该作者
我已经写进去并能读出来,但是有个问题就是怎么制定校验系数和设定滤波系数这二个参数,标准是什么,在不同的通道切换时候如果系数不同怎么修改和设计的参数,谢谢

使用特权

评论回复
7
609881593| | 2015-5-13 21:59 | 只看该作者
楼主这个问题解决了吗?我现在在用AD7710也发现了这个问题,控制字写不进去,读出的数据时参考电压2.5V

使用特权

评论回复
8
weitongguo| | 2015-8-5 17:21 | 只看该作者
手头刚好有一片拆机的7712,请问楼主解决了没有呢?给个例程参考一下吧

使用特权

评论回复
9
lanbohesky| | 2018-7-11 08:46 | 只看该作者
tcc8073 发表于 2012-9-4 08:58
你的问题有解决吗,如果有的话把解决的过程也给出来一下,让大家学习下,谢谢! ...

你好,我在论坛上看到您用过AD7712,能否把你的程序贴出来,给我看看,我最近遇到个问题,就是采集数据不对呢,很是奇怪。我用的是STM32采集的,小弟邮箱lanbohesky@126.com,不胜感激

使用特权

评论回复
评论
ningling_21 2018-7-11 18:38 回复TA
不如另开新帖讨论 
10
cainiao518| | 2018-7-11 16:07 | 只看该作者
lanbohesky 发表于 2018-7-11 08:46
你好,我在论坛上看到您用过AD7712,能否把你的程序贴出来,给我看看,我最近遇到个问题,就是采集数据不 ...

数据怎么不对了呢?

使用特权

评论回复
11
ningling_21| | 2018-7-11 18:38 | 只看该作者
lanbohesky 发表于 2018-7-11 08:46
你好,我在论坛上看到您用过AD7712,能否把你的程序贴出来,给我看看,我最近遇到个问题,就是采集数据不 ...

数据是怎样的

是不是时序不对?

使用特权

评论回复
12
lanbohesky| | 2018-7-18 17:33 | 只看该作者
ningling_21 发表于 2018-7-11 18:38
数据是怎样的

是不是时序不对?

是控制寄存器写不进去呢?和楼主的问题很像,您用过吗?可否交流一下?小弟邮箱:lanbohesky@126.com

使用特权

评论回复
13
lanbohesky| | 2018-7-18 17:34 | 只看该作者
ningling_21 发表于 2018-7-11 18:38
数据是怎样的

是不是时序不对?

是控制寄存器写不进去呢?和楼主的问题很像,您用过吗?可否交流一下?小弟邮箱:[email]lanbohesky@126.com

使用特权

评论回复
14
lanbohesky| | 2018-7-18 17:34 | 只看该作者
cainiao518 发表于 2018-7-11 16:07
数据怎么不对了呢?

是控制寄存器写不进去呢?和楼主的问题很像,您用过吗?可否交流一下?小弟邮箱:lanbohesky@126.com

使用特权

评论回复
15
ningling_21| | 2018-7-18 18:34 | 只看该作者
lanbohesky 发表于 2018-7-18 17:34
是控制寄存器写不进去呢?和楼主的问题很像,您用过吗?可否交流一下?小弟邮箱:[email]lanbohesky@126. ...

首先要确定硬件没问题,芯片是正常的

使用特权

评论回复
16
ningling_21| | 2018-7-18 18:35 | 只看该作者
lanbohesky 发表于 2018-7-18 17:34
是控制寄存器写不进去呢?和楼主的问题很像,您用过吗?可否交流一下?小弟邮箱: ...

硬件没问题后,再找找芯片的厂家的FAE

使用特权

评论回复
17
tcc8073| | 2018-9-16 10:56 | 只看该作者
不好意思,项目太久了,这个程序早就不在,没有存档

使用特权

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

本版积分规则

0

主题

3

帖子

1

粉丝