/******************c文件*********************************************/
#include "msp430x26x.h"
#include "ADS1115.h"
uchar value_H,value_L,value_buf; //设置两个接收缓存
/*******************************************
函数名称:ADS1115_delay
功 能:delay延时函数
参 数:xms
返回值 :无
********************************************/
void ADS1115_delay(uint xms)
{
uint i,j;
for(i = xms; i > 0; i--)
for(j = 250; j > 0; j--);
}
/*******************************************
函数名称:ADS1115_delay_us
功 能:delay延时函数
参 数:xms
返回值 :无
********************************************/
void ADS1115_delay_us(uint xus)
{
uint i;
i = xus;
while(i > 0)i--;
}
/*******************************************
函数名称:ADS1115_Init
功 能:初始化ADS1115
参 数:无
返回值 :无
********************************************/
void ADS1115_Init(void)
{
SCLK_DIR; //Init IO port
SDA_OUT_DIR; //setting as output
SCLK_H;
SDA_H; //high
}
/*******************************************
函数名称:ADS1115_START
功 能:开始启动AD
参 数:无
返回值 :无
********************************************/
void ADS1115_START(void)
{
uint i = 0;
SCLK_DIR;
SDA_OUT_DIR;
SCLK_H;
i++;
SDA_H;
i++;
SDA_L;
i++;
SCLK_L; //CLOCK PIN LOW
}
/*******************************************
函数名称:ADS1115_STOP
功 能:停止启动AD
参 数:无
返回值 :无
********************************************/
void ADS1115_STOP(void)
{
uint i = 0;
SCLK_DIR;
SDA_OUT_DIR;
SDA_L;
i++;
SCLK_H;
i++;
SDA_H;
i++;
i++;
}
/*******************************************
函数名称:ADS1115_ACK
功 能:ADS1115应答信号
参 数:无
返回值 :无
********************************************/
void ADS1115_ACK(void)
{
uint i = 0;
SCLK_H;
i++;
SDA_IN_DIR; //BIT1 INPUT
while(((P1IN & BIT1) == BIT1)&&(i<255)) i++; //
i++;
SCLK_L;
}
/*******************************************
函数名称:ADS1115_writebyte
功 能:ADS1115写一个字节
参 数:无
返回值 :无
********************************************/
void ADS1115_writebyte(uchar data)
{
uchar bit_data,j;
uint i = 0;
uchar temp;
SDA_OUT_DIR; //SDA_OUTPUT
temp = data;
for(j = 0; j < 8; j++) //write 1 byte and add one bit for waiting for the response signal from slave
{
bit_data = temp & 0x80;
if(bit_data == 0x80) SDA_H;
else SDA_L;
i++;
SCLK_H;
temp <<= 1; //move left 1 bit
SCLK_L; //MAICHONG
}
SCLK_H;
i++; //release the data wire
SCLK_L;
i++;
}
/*******************************************
函数名称:ADS1115_readbyte
功 能:ADS1115读一个字
参 数:无
返回值 :无
********************************************/
void ADS1115_readbyte(void)
{
uint i = 0,j = 0;
value_buf = 0;
uchar BYTE = 0X80;
SDA_IN_DIR;
for(j = 0; j < 8; j++)
{
SCLK_H;
if(P1IN & 0X02) value_buf = value_buf | BYTE;//1000 00000
else value_buf = value_buf & (~BYTE); //0111 1111
BYTE = BYTE >> 1;
SCLK_L;
}
SCLK_H;
i++;
SDA_IN_DIR;
SDA_L;
i++;
SCLK_L;
i++;
SCLK_H;
i++;
}
/*******************************************
函数名称:ADS1115_config
功 能:ADS1115写配置寄存器
参 数:无
返回值 :无
********************************************/
void ADS1115_config(uchar data)
{
uchar data1;
switch(data)
{
case 0 : data1 = 0xc0;break;
case 1 : data1 = 0xd0;break;
case 2 : data1 = 0xe0;break;
case 3 : data1 = 0xf0;break;
}
ADS1115_START();
ADS1115_writebyte(0x90); //IIC address
ADS1115_ACK();
ADS1115_writebyte(0x01); //point to config register
ADS1115_ACK();
ADS1115_writebyte(data1); //config register 6.144 CONTINUE CONVERSION MODE
ADS1115_ACK();
ADS1115_writebyte(0xE3); //config register DISABLE COMPARTOR
ADS1115_ACK();
ADS1115_STOP();
}
/*******************************************
函数名称:ADS1115_pointer
功 能:ADS1115写指针寄存器
参 数:无
返回值 :无
********************************************/
void ADS1115_pointer(void)
{
ADS1115_START();
ADS1115_writebyte(0x90); //IIC address write
ADS1115_ACK();
ADS1115_writebyte(0x00); //IIC conversion
ADS1115_ACK();
ADS1115_STOP();
}
/*******************************************
函数名称:ADS1115_read
功 能:ADS1115读寄存器
参 数:无
返回值 :无
********************************************/
void ADS1115_read(void)
{
ADS1115_START();
ADS1115_writebyte(0x91); //IIC address read
ADS1115_ACK();
ADS1115_readbyte();
value_H = value_buf;
SDA_OUT_DIR;
SDA_L;
ADS1115_readbyte();
value_L = value_buf;
SDA_OUT_DIR;
SDA_L;
ADS1115_STOP();
value = value_H;
value = value << 8; //move left 8 bits
value = value | value_L; //change completely
value = (uint)(value*0.0001876*1000+0.5);
}
/************************h文件****************************************/
#ifndef __ADS1115_H__
#define __ADS1115_H__
#define uchar unsigned char
#define uint unsigned int
#define SCLK_DIR P1DIR |= BIT0 //时钟设置为输出
#define SDA_OUT_DIR P1DIR |= BIT1 //数据设置为输出
#define SDA_IN_DIR P1DIR &= ~BIT1 //数据设置为输入
#define ADS1115_OUT P1OUT |= 0X03
#define SCLK_H P1OUT |= BIT0
#define SCLK_L P1OUT &= ~BIT0
#define SDA_H P1OUT |= BIT1
#define SDA_L P1OUT &= ~BIT1
extern uint value;
void ADS1115_delay(uint xms);
void ADS1115_delay_us(uint xus);
void ADS1115_Init(void);
void ADS1115_START(void);
void ADS1115_STOP(void);
void ADS1115_ACK(void);
void ADS1115_writebyte(uchar data);
void ADS1115_readbyte(void);
void ADS1115_config(uchar data);
void ADS1115_pointer(void);
void ADS1115_read(void);
#endif
////简要介绍下ADS1115
ADS1115是16位的AD,4通道 I2C通信模式,可以选择不同的内部基准源,可以测正电压和负电压 负电压以补码形式储存,内部开始有个PGA 进行基准源程控,然后16位AD转换存储区,然后就是内部的I2C,通过I2C转换出来的数字量的计算公式是:(data /32768)*FS 。
|