本帖最后由 xyz549040622 于 2019-12-21 15:45 编辑
#include "msp430x22x4.h"
#include "uart.h"
#include "ads1110.h"
#include "delay.h"
void ads_initial(void)
{
SDA_1;
SCL_1;
P2DIR |= 0X03;
delay_ms(1);
ads_config(0x1C);
}
/***************************************************************************/
/* 函数原型: void ads_start (void) */
/* 功 能: 提供I2C总线工作时序中的起始位。 */
/***************************************************************************/
void ads_start (void) //在SCL高的情况下,SDA由高到低的变化造成START。
{
SDA_1;
delay_5us();
SCL_1;
delay_5us();
SDA_0;
delay_5us();
SCL_0;
delay_5us();
}
/**************************************************************************/
/* 函数原型: void ads_stop(void) */
/* 功 能: 提供I2C总线工作时序中的停止位。 */
/**************************************************************************/
void ads_stop(void) //在SCL高的情况下,SDA由低到高的变化造成STOP。
{
SDA_0;
delay_5us();
SCL_1;
delay_5us();
SDA_1;
delay_5us();
}
/*****************************************************************************/
/* 函数原型: unsigned char ack_check(void) */
/* 功 能: 提供I2C总线的时钟信号, 并返回在时钟电平为高期间SDA 信号线上状*/
/* 态。本函数用于数据发送时的确认检查。 */
/*****************************************************************************/
unsigned char ack_check(void) // 检查应答信号
{
unsigned char ack_temp=0;
SDA_IN;
delay_5us();
SCL_1;
delay_5us();
if (SDA == 1)
{
ack_temp = 1;
}
else
{
ack_temp = 0;
}
delay_5us();
SCL_0;
delay_5us();
SDA_0;
SDA_OUT;
return(ack_temp); // 如果收到ACK应答则返回0, 否则返回1。
}
/*****************************************************************************/
/* 函数原型: void ack(void) */
/* 功 能: 提供I2C总线的时钟信号。本函数可用于数据接受时的确认。 */
/*****************************************************************************/
void ack(void)
{
SDA_OUT;
SDA_0;
delay_5us();
SCL_1;
delay_5us();
delay_5us();
SCL_0;
delay_5us();
}
/****************************************************************************/
/* 函数原型: unsigned char ads_sendbyte(unsigned char data) */
/* 功 能: 向I2C总线发送8位数据。 */
/****************************************************************************/
unsigned char ads_sendbyte(unsigned char data) // 发送一个字节
{
unsigned char bitcount = 8; // 发送8位数据。
do
{
if((data&0x80)==0x80) // 从左到右选送D7,屏蔽D0~D6。
{
SDA_1; //写 1
}
else
{
SDA_0; //写 0
}
delay_5us();
SCL_1;
delay_5us();
delay_5us();
SCL_0;
delay_5us();
data=data<<1; // 待送数据左移一位.
bitcount--;
} while(bitcount);
if( ack_check() == 0 )
{
return 0;
}else
{
return 1; //返回值为0表示正确发送
}
}
/***************************************************************************/
/* 函数原型: unsigned char ads_recivebyte(void) */
/* 功 能: 从I2C总线上接收8位数据信号, 并将接收到8位数据作为一个字节 */
/* 返回, 不回送应答信号ACK。主函数在调用本函数之前应保证SDA信 */
/* 号线处于浮置状态, 即使8052的Px.x脚置1。 */
/***************************************************************************/
unsigned char ads_recivebyte(void) //接受一个字节
{
SDA_IN;
unsigned char data=0X00;
unsigned char bitcount=8;
do
{ SCL_1;
delay_5us();
if(SDA != 0) //读 1
{
data = data|0x01;
}
else //读 0
{
data = data&0xfe;
}
delay_5us();
SCL_0;
delay_5us();
delay_5us();
if(bitcount-1)
{
data=data<<1;
}
bitcount--;
}
while(bitcount);
ack();
return(data);
}
/****************************************************************************/
/* 函数原型: void ads_config(unsigned char data) */
/* 功 能: 写器件地址和配置字。 */
/****************************************************************************/
void ads_config(unsigned char data)
{
ads_start(); //开始写
ads_sendbyte(0x94); //写器件地址(写) 1001xxx1 写 1001xxx0 读
//添加调试信息,判断是否发送成功
ads_sendbyte(data); //写配置字
ads_stop(); //结束写
}
/****************************************************************************/
/* 函数原型: unsigned int ads_result(void) */
/* 功 能: 数据读取。 */
/****************************************************************************/
unsigned int ads_result(void)
{
unsigned int result = 0;
unsigned char result_hi=0;
unsigned char result_lo=0;
ads_start(); //开始读
ads_sendbyte(0x95); //写器件地址(读) 1001xxx0 写 1001xxx1 读
result_hi = ads_recivebyte(); // 读高8位
result_lo = ads_recivebyte(); //读低8位
ads_recivebyte(); //读配置字
ads_stop(); //结束读
result = (((unsigned int)result_hi) << 8) + ((unsigned int)result_lo) ;
return result;
}
void ads_convert(void)
{
ads_config(0x9C);
}
|