打印
[STM32F1]

很奇怪的AD7705

[复制链接]
1559|5
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
liu1004010308|  楼主 | 2015-9-14 19:45 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
试着用stm32去模拟spi来控制AD7705,可是发现DRDY居然读完数据后还是低电平,为什么呢?总是低电平。程序如下:
#include "sys.h"
#include "usart.h"               
#include "delay.h"       
#include "led.h"
#include "AD7705.h"
int main(void)
{               
          u16 tempB;
          u16 ADVaule=0;       
          float SJZ;       
                Stm32_Clock_Init(9);         //系统时钟设置
                delay_init(72);                     //延时初始化
                LED_Init();                                   //初始化与LED连接的硬件接口  
    uart_init(72,9600);         //串口初始化为9600  
                LED0=0;
    AD7705_Init();
          AD7705_Write(0x20);  //下一个写时钟寄存器
                AD7705_Write(0x04);   //2.4M所以不需要分频,并且必须是逻辑1
          while(DRDY==0);             
                AD7705_Write(0x10);   //写设置寄存器
    AD7705_Write(0x40);    //0100 00000设置寄存器,1、自校准模式放大倍数是1
    while(1)
          {
                           while(DRDY==1);
         AD7705_Write(0x38);
         tempB=AD7705_read();        //DRDY逻辑低电平,表示可以从数据寄存器获取字
         delay_us(1);
                           while(DRDY==0);//????????问题来了                //完成对一个字的读操作后,立即输出高电平
                     if(tempB&0x8000)     //当DRDY处于高电平时,不能进行读操作,数据更新完成后
               {                    //数据更新后,DRDY是0
                      ADVaule=tempB;
                            ADVaule=~ADVaule;
                            ADVaule+=1;
                            SJZ=ADVaule*2.5/32768;
                            printf("-%4.3f\t",SJZ );
                     }
                           else
                           {
                                         SJZ= tempB*2.5/32768;
                                         printf("%4.3f\t",SJZ);
                           }       
         printf("\r\n");//换行
                                delay_ms(300);
                    LED0=~LED0;
   }                                  
}
#include "sys.h"   
#include "led.h"
#include "AD7705.h"
#include "delay.h"
u8 A;
u8 i;
u16 TempA;
void AD7705_Init(void)
{
        RCC->APB2ENR|=1<<3;      //使能PORTB时钟       
        GPIOB->CRL&=0X000FF000;
        GPIOB->CRL|=0X38800333;  //PB8推挽输出 上拉输入模式
        GPIOB->ODR=0XFF;
        RES=1;
        delay_us(1);
        RES=0;
        delay_us(1);
        RES=1;
        delay_us(1);
}
void AD7705_Write(u8 date)
{
          CS=1;
          delay_us(1);
          SCLK=1;
          delay_us(1);
          CS=0;
    for(i=8;i>0;i--)
         {
      SCLK=0;
                  delay_us(1);
                  SCLK=1;
                  delay_us(1);
                  A=((date&(0x01<<i))!=0);
      DIN=A;
         }
         // while(!DRDY);
    CS=1;         
          
}
u16 AD7705_read(void)
{
          TempA=0;
                CS=1;
          SCLK=1;
                delay_us(1);
          while(DRDY);//等待DRDY变成0.数据更新完成
          delay_us(1);
    CS=0;
                delay_us(1);
    for(i=0;i<16;i++)
                {
                         TempA<<=1;
                         SCLK=0;
                         delay_us(1);
                         SCLK=1;
                         delay_us(1);
       if(DOUT)
                         TempA|=0x0001;
                         else
             TempA&=0xfffe;   
     }
    CS=1;       
                delay_us(1);    //当数据读取完后,DRDY变成高电平
                //while(!DRDY);   //卡死???数据读完后,没有变成高电平???????
    return TempA;                 
}





沙发
mmuuss586| | 2015-9-14 21:23 | 只看该作者
仔细对下DATASHEET,时序是否正确;
另外读的数据对吗?

使用特权

评论回复
板凳
liu1004010308|  楼主 | 2015-9-15 16:48 | 只看该作者
后来我用spi直接来读写数据,调通了这个AD,上面的程序也是有问题的,修改了void AD7705_Write(u8 date)
{
          CS=1;
          delay_us(1);
          SCLK=1;
          delay_us(1);
          CS=0;
    for(i=8;i>0;i--)
         {
      SCLK=0;
                  delay_us(1);
                  SCLK=1;
                  delay_us(1);
                  A=((date&(0x01<<i))!=0);//修改成i-1
      DIN=A;
         }
         // while(!DRDY);
    CS=1;         
         
}
最后读出来的数据是有问题的,比如输入1.6V输出2v     输入0.8v,输出是1.6v  输入2.5V输出是:2.5v    输入0V则输出是1.25V,好奇怪的现象,时序之类的确实没问题啊

使用特权

评论回复
地板
liu1004010308|  楼主 | 2015-9-15 16:49 | 只看该作者
最后修改成单极性。用spi可以调通,但是io口模拟时序的时候就出问题了。

使用特权

评论回复
5
liu1004010308|  楼主 | 2015-9-15 17:12 | 只看该作者
问题解决,写的时序出现问题了

使用特权

评论回复
6
歇斯底里| | 2016-8-29 07:15 | 只看该作者
你好可以问一下你这个后来怎么解决的吗 我也在调这个 出现了问题

使用特权

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

本版积分规则

12

主题

41

帖子

0

粉丝