打印

AD7705,为什么DRDY总是高

[复制链接]
14298|15
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
lichuanfa|  楼主 | 2012-1-7 10:02 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
代码如下:
#include "AD7705.H"
#include "systick.h"
unsigned int AD_value1[10] , AD_value;


void AD7705_Configuration(void)
{
  GPIO_InitTypeDef  GPIO_InitStructure;
/* Configure AD7705 pins: PB13->DOUT and PB14->DRDY */
  RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);
  GPIO_InitStructure.GPIO_Pin =  GPIO_Pin_13 | GPIO_Pin_14  ;
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;  
  GPIO_Init(GPIOB, &GPIO_InitStructure);   
  /* Configure I2C2 pins: PB12->DIN and PB15->SCLK */  
  GPIO_InitStructure.GPIO_Pin =  GPIO_Pin_12 | GPIO_Pin_15 ;
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_OD;  
  GPIO_Init(GPIOB, &GPIO_InitStructure);
  DIN_H; SCLK_H;
}
void Write_ad7705 ( uint8_t SendByte )
{
   uint8_t i;
   
   for ( i=0x00; i<8; i++ )
     {
   
    if ( SendByte & 0x80 )
    DIN_H;
    else
    DIN_L;   
    //delay_us ( 3 );
    SCLK_L;
    delay_us ( 3000 );
    SCLK_H;
    delay_us ( 3000 );
    SendByte <<= 1;  
  }
        DIN_H;  
}
uint8_t Read_ad7705reg ( )
{
   uint8_t i,data_read;
  
//判断DRDY是否为低电平
while ( DRDY_read );
for ( i=0x00; i<8; i++ )
  {
    SCLK_L;
    delay_us ( 3000 );
    data_read <<= 1;
    //逻辑或
    if (DOUT_read  )
    data_read |= 1;//( uint8_t )DOUT_read;
    delay_us ( 3000 );
    SCLK_H;
    delay_us ( 3000 );
    }
return ( data_read );
}
void Inti_ad7705 ()
{
   Write_ad7705 ( 0x20 );//写通信寄存器,下一个是写入时钟寄存器 ,通道0
   Write_ad7705 ( 0x09 );//分频,更新率25Hz
   Write_ad7705 ( 0x10 );//写通信寄存器 下一个是写入配置寄存器
   Write_ad7705 ( 0x6a );//自校准模式 双极性工作,增益32
}
uint16_t Read_ad7705 ()
{
   uint8_t Msb_data,Lsb_data;
   uint16_t temp;
   uint8_t i,j,counter = 0x00;
   float aver_ad = 0;
   for ( i=0x00; i<10; i++  )
   {
   Write_ad7705 ( 0x38 );
   Msb_data = Read_ad7705reg ();
   Lsb_data = Read_ad7705reg ();
   temp  = Msb_data;
   temp<<= 8  ;
   AD_value1[i] = temp + Lsb_data;
   }
   delay_us ( 200 );
   //从小到大排序
   for ( i=0x00; i<10; i++ )
    for ( j=i+1; j<10; j++ )
  {
   if ( AD_value1[i] < AD_value1[j] )
    {
      temp = AD_value1[i];
   AD_value1[i] = AD_value1[j];
   AD_value1[j] = temp;   
    }  
  }
delay_us ( 200 );
  //舍去极大值
  for ( i=0x01; i<10; i++ )
   {
     if ( AD_value1[0] > AD_value1[i] )
   {
     AD_value1[0] = 0;
     break;
      }
  else
   {
   AD_value1[i] = 0;
   }
   }
   delay_us ( 200 );
   //舍去极小值
   for ( i=0x09; j>0; j--  )
    {
    if ( AD_value1[9] < AD_value1[i] )
   {
     AD_value1[9] = 0;
     break;
      }
  else
   {
   AD_value1[i] = 0;
   }
    }
    delay_us ( 200 );
    for ( i= 0x00; i<10; i++  )
     {
  if ( AD_value1[i]  != 0x00 )
   {
   aver_ad =  aver_ad + AD_value1[i] ;
   counter++;
   }
  }
       AD_value =  ( unsigned int ) ( aver_ad / ( float) counter ) ;
     
   return 0;
}

头文件:

/* Includes ------------------------------------------------------------------*/
#include "stm32f10x.h"
/* Private define ------------------------------------------------------------*/
#define SCLK_H          GPIOB->BSRR = GPIO_Pin_15  /* GPIO_SetBits(GPIOB , GPIO_Pin_6)   */
#define SCLK_L          GPIOB->BRR  = GPIO_Pin_15   /* GPIO_ResetBits(GPIOB , GPIO_Pin_6) */
   
#define DIN_H           GPIOB->BSRR = GPIO_Pin_12  /* GPIO_SetBits(GPIOB , GPIO_Pin_7)   */
#define DIN_L           GPIOB->BRR  = GPIO_Pin_12  /* GPIO_ResetBits(GPIOB , GPIO_Pin_7) */
#define DOUT_read       GPIOB->IDR  & GPIO_Pin_13  /* GPIO_ReadInputDataBit(GPIOB , GPIO_Pin_7) */
#define DRDY_read       GPIOB->IDR  & GPIO_Pin_14  /* GPIO_ReadInputDataBit(GPIOB , GPIO_Pin_7) */

/* Private function prototypes -----------------------------------------------*/
void AD7705_Configuration(void);
void Inti_ad7705 (void);
uint8_t  Read_ad7705reg (void);
void AD7705_Reset(void);
uint16_t Read_ad7705 ( void );
沙发
nicholasldf| | 2012-1-7 11:58 | 只看该作者
先验证通信是否正常,如果通信不正常,命令都写不进去,ready信号如何变为低呢?
有几个通信操作是不用使用到ready信号的,,可以用来验证SPI通信

使用特权

评论回复
板凳
jiaojian| | 2012-1-8 13:08 | 只看该作者
可以试试通过SPI不断读communications register 看看最高位的DRDY是不是变低 他的状态和DRDY的引脚状态应该一样

使用特权

评论回复
地板
jiaojian| | 2012-1-8 13:09 | 只看该作者
还是应该先确定SPI读写时序对不对 先写个寄存器再读出来 看对不对

使用特权

评论回复
5
lichuanfa|  楼主 | 2012-1-9 09:03 | 只看该作者
估计是IC的问题。昨天找个51的仿真器,用我原来的51程序,DRDY也总是高。准备在买2个测试看看。

使用特权

评论回复
6
lichuanfa|  楼主 | 2012-1-9 09:04 | 只看该作者
估计是IC的问题。昨天找个51的仿真器,用我原来的51程序,DRDY也总是高。准备在买2个测试看看。

使用特权

评论回复
7
lichuanfa|  楼主 | 2012-1-11 11:47 | 只看该作者
顶起来,不是IC的问题,郁闷ing

使用特权

评论回复
8
lichuanfa|  楼主 | 2012-1-11 11:49 | 只看该作者
Write_ad7705 ( 0x00 );//写通信寄存器,下一个是读通信寄存器 ,结果读出的总是FF,没有写进入。AD7705的RESET我是通过10K的上拉电阻连接VCC。

使用特权

评论回复
9
jiaojian| | 2012-1-11 14:55 | 只看该作者
“For a read operation, this bit provides the status of the DRDY flag
from the part. The status of this bit is the same as the DRDY output pin.”
你想读通信寄存器的话 你是不是应该先写Write_ad7705 ( 0x08 );//R/W位为1表明要读通信寄存器然后再判断DRDY  ?

使用特权

评论回复
10
lichuanfa|  楼主 | 2012-1-11 14:58 | 只看该作者
对,读厨初始化的寄存器不需要判断DRDY  ,谢谢9楼!

使用特权

评论回复
11
jiaojian| | 2012-1-11 16:59 | 只看该作者
那你是现在读写还没正确呗?

使用特权

评论回复
12
lichuanfa|  楼主 | 2012-1-12 08:09 | 只看该作者
寄存器读写正确,DRDY 信号有了,但是AD结果不对,谢谢11楼。

使用特权

评论回复
13
lichuanfa|  楼主 | 2012-1-13 08:14 | 只看该作者
昨天晚上搞定了,高兴,结贴。

使用特权

评论回复
14
canghai002| | 2012-4-9 21:44 | 只看该作者
楼主的问题怎么解决的呀

使用特权

评论回复
15
lichuanfa|  楼主 | 2012-4-16 11:25 | 只看该作者
时间太长,忘记了

使用特权

评论回复
16
allantxj| | 2012-5-19 13:30 | 只看该作者
您好~我想问下AD7705可以用内部基准电压源么?应该怎么实现?

使用特权

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

本版积分规则

44

主题

275

帖子

1

粉丝