我调的ads1115程序,采集到的数据全是1;以下是驱动,望大神指教
static void delay(u16 D)
{
while(--D);
}
//I2C总线启动
void I2CStart(void)
{
SDA1;
delay(50);
SCL1;
delay(50);
SDA0;
delay(50);
SCL0;
delay(50);
}
//I2C停止总线
void I2CStop(void)
{
SDA0;
delay(50);
SCL1;
delay(50);
SDA1;
delay(50);
}
//I2C 写一字节
void I2CWriteByte(u8 DATA)
{
u8 i;
for(i=0;i<8;i++)
{
if(DATA&0x80)
{
SDA1;
}
else
{
SDA0;
}
SCL0;
delay(50);
SCL1;
delay(50);
DATA=DATA<<1;
}
SCL0;
}
//I2C 读一字节
u8 I2CReadByte(void)
{
u8 TData=0,i;
SDA1;
for(i=0;i<8;i++)
{
SCL0;
delay(50);
SCL1;
TData=TData<<1;
if(SDAI)
{
TData|=0x01;
}
}
SCL0;
delay(50);
return TData;
}
/*********************************************************************
*函数名称: ADS1115Config
*描 述: 设置ADS1115包括通道配置,采样时间等等
*参 数: HCMD :命令字高8位(通道,量程,转换模式)
LCMD : 命令字低8位(采样率设置 比较模式 有效电平 信号输出锁存)
*返 回; 无
********************************************************************/
void ADS1115Config()//配置寄存器
{
I2CStart();
I2CWriteByte(WR_REG); // 地址0x90 器件ADR接地 写寄存器
delay(50);
I2CWriteByte(CONF_REG);// 地址0x01 指向配置寄存器
delay(50);
I2CWriteByte(0xd2); //设置配置寄存器的高八位1101 0010,即AINp=AIN1,AINn=GND;满量程FS=+-4.096;连续转换模式
delay(50);
I2CWriteByte(0xe3); //设置配置寄存器的低八位1100 0101
delay(50);
I2CStop();
}
//配置指针寄存器
void PointRegister (void)
{
I2CStart();
I2CWriteByte(0x90);//写
delay(50);
I2CWriteByte(0x00);//指针指向转换寄存器
delay(50);
I2CStop(); // Send I2C Stop Transfer
}
/*******************************************************************
*函数名称: ReadAD_A
*描 述: 获取AD转换的值
*参 数: 获取的值为在前面设置的那个通道
*返 回; 无
********************************************************************/
u16 ReadAD(void)
{
u16 Data[2]={0,0};
I2CStart();
I2CWriteByte(RE_REG);//读
delay(50);
Data[0] = I2CReadByte();
Data[1] = I2CReadByte();
I2CStop();
Data[0] = Data[0]<<8 | Data[1];
return (Data[0]);//&0x7fff
}
u32 getad()
{
u32 value;
ADS1115Config();
delay(50);
PointRegister();
delay(50);
value=ReadAD();
return value;
}
|