MSP430的AD7705驱动程序

//2014年8月4日

//在网上找了半天MSP430的7705的驱动程序,没一个能用!现在贴出一个能用的

#ifndef __AD7705 
#define __AD7705 

#define uint unsigned int 
#define uchar unsigned char

#define ADCLK_H   P3OUT |= BIT6         // CLK--->P3.6
#define ADCLK_L   P3OUT &= ~BIT6
#define CS_H      P3OUT |= BIT7         // CS--->P3.7
#define CS_L      P3OUT &= ~BIT7
#define ADDIN_H   P3OUT |= BIT5         // DIN--->P3.5
#define ADDIN_L   P3OUT &= ~BIT5
#define DOUT    P3IN & BIT3         // DOUT--->P3.3
#define DRDYIN  P3IN & BIT1         // DRDY--->P3.1,实时查询DRDY的状态

// 延时
void delay(void)
{
  uint i;
  for(i=3000;i>0;i--);         // 需根据时钟配置参数
}
  
// 写入指令,配置AD7705,写入八位
void write_cmd(uchar cmd)
{
  int i;
  ADCLK_H;        // 时钟置高
  delay();
  for(i=1;i<=8;i++)
  {
    if(cmd & 0x80)
      ADDIN_H;
    else
      ADDIN_L;
    cmd <<=1;
    delay();
    ADCLK_L;
    delay();delay();        // delay()函数数目间隔相同
    ADCLK_H;
    delay();
  }
  ADCLK_H;
  ADDIN_H;
} 

// 读出数据,读出十六位
uint read_data(int data)
{
  int i;
  uint digit=0;
  while(DRDYIN);
  ADCLK_H;
  delay();
  for(i=1;i<=data;i++)
  {
    digit<<=1;
    ADCLK_L;
    delay();delay();
    if(DOUT)
      digit|=0x01;
    delay();
    ADCLK_H;
    delay();
  }
  ADCLK_H;
  ADDIN_H;
  return digit;
}

// 初始化AD7705
void InitAD7705(void)
{
  int i;
  P3DIR |= (BIT5+BIT6+BIT7);
  P3DIR &= ~(BIT1+BIT3);
  CS_L;
  ADCLK_H;
  ADDIN_H;
  for(i=0;i<5000;i++)       // 防止接口迷失,Communications Register返回到等待写状态
  {
    ADCLK_L;
    ADCLK_H;
  }
  write_cmd(0x20);    // 向Clock Register写,通道1
  //write_cmd(0x21);  // 向Clock Register写,通道2
  write_cmd(0x0B);    // 时钟 MCLK为 2MHz,CLK 位置零(采样频率<---8(20Hz),9(25Hz),A(100Hz),B(200Hz))
  
  write_cmd(0x10);    // 向Setup Register写
  //write_cmd(0x11);  // 向Setup Register写,通道2
  write_cmd(0x44);    // 校正模式,增益为1,单极性

}

void choose(uint x)
{
  int i;
  ADCLK_H;
  ADDIN_H;
  for(i=0;i<5000;i++)       // 防止接口迷失,Communications Register返回到等待写状态
  {
    ADCLK_L;
    ADCLK_H;
  }
  write_cmd(0x20+x);
  write_cmd(0x0B); 
  
  write_cmd(0x10+x);    // 向Setup Register写
  write_cmd(0x44);    // 校正模式,增益为1,单极性
  
}

unsigned int duqu(void)
{
    unsigned int memory;
    while(DRDYIN);
    write_cmd(0x38);      // 从 Data Register读,通道1
    memory = read_data(16);
    return memory;
}

#endif


  • 5
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值