//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