#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); }
收藏0 举报
#ifndef __ADS_H // #define __ADS_H // #define SDA_1 P2OUT|=0X01 //SDA线置高 #define SDA_0 P2OUT&=0XFE //SDA线置低 #define SCL_1 P2OUT|=0X02 //SCL线置高 #define SCL_0 P2OUT&=0XFD //SCL线置低 #define SDA P2IN&0X01 //SDA线 #define SCL P2IN&0x02 #define SDA_IN P2DIR&=0XFE //SDA线 输入 #define SDA_OUT P2DIR|=0X01 //SDA线 输出 void ads_config(unsigned char); unsigned int ads_result(void); void ads_initial(void); void ads_convert(void); #endif
您需要 登录 才可以下载或查看,没有账号?注册
本版积分规则 发表回复 回帖并转播 回帖后跳转到最后一页
等级类勋章
发帖类勋章
时间类勋章
人才类勋章
2841
19330
110
扫码关注 21ic 官方微信
扫码关注嵌入式微处理器
扫码关注电源系统设计
扫码关注21ic项目外包
扫码浏览21ic手机版
本站介绍 | 申请友情链接 | 欢迎投稿 | 隐私声明 | 广告业务 | 网站地图 | 联系我们 | 诚聘英才
京公网安备 11010802024343号