打印
[资料分享]

ads1110驱动程序--msp430x22x4

[复制链接]
1358|24
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
xyz549040622|  楼主 | 2019-12-21 09:56 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 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);
  }





使用特权

评论回复

相关帖子

沙发
xyz549040622|  楼主 | 2019-12-21 09:57 | 只看该作者
#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

使用特权

评论回复
板凳
xyz549040622|  楼主 | 2019-12-21 10:16 | 只看该作者
8475.ADS1110.rar (1.96 KB)

使用特权

评论回复
地板
xyz549040622|  楼主 | 2019-12-21 14:37 | 只看该作者
stm32的ADS1110驱动程序(模拟I2C).pdf (77.66 KB)

使用特权

评论回复
5
externally| | 2019-12-23 19:39 | 只看该作者
感谢楼主分享!学习一下

使用特权

评论回复
6
aspoke| | 2020-1-10 16:43 | 只看该作者

ADS1110怎么不能转换大于2.047V的电压   

使用特权

评论回复
7
232321122| | 2020-1-10 16:44 | 只看该作者
ADS1110为什么这么贵   

使用特权

评论回复
8
ghuca| | 2020-1-10 16:44 | 只看该作者
ADS1110如何将输出码转为电压

使用特权

评论回复
9
soodesyt| | 2020-1-10 16:44 | 只看该作者
ADS1110A0使用430单片机模拟IIC读出的数怎么是65535

使用特权

评论回复
10
mnynt121| | 2020-1-10 16:44 | 只看该作者
要用ADS1110进行AD转换   

使用特权

评论回复
11
plsbackup| | 2020-1-10 16:45 | 只看该作者
ADS1110无法工作           

使用特权

评论回复
12
kmzuaz| | 2020-1-10 16:45 | 只看该作者
可以与 16位 AD 连接么?   

使用特权

评论回复
13
qiufengsd| | 2020-1-10 16:45 | 只看该作者
基准直接用Vcc,会有各种干扰  

使用特权

评论回复
14
wengh2016| | 2020-1-10 16:46 | 只看该作者
取多次的平均值了吗        

使用特权

评论回复
15
sanfuzi| | 2020-1-10 16:46 | 只看该作者
谢谢楼主分享的资料。   

使用特权

评论回复
16
aspoke| | 2020-1-10 16:46 | 只看该作者
AD转换ADS1110与ADS1115的区别   

使用特权

评论回复
17
plsbackup| | 2020-1-10 16:46 | 只看该作者
ADS1110 转换不准   

使用特权

评论回复
18
kmzuaz| | 2020-1-10 16:46 | 只看该作者
ADS1110操作只能读出第一个字节   

使用特权

评论回复
19
mnynt121| | 2020-1-10 16:46 | 只看该作者
将数据通过I2C总线  

使用特权

评论回复
20
qiufengsd| | 2020-1-10 16:46 | 只看该作者
Vcc本身也不是很稳定的?     

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

个人签名:qq群: 嵌入式系统arm初学者 224636155←← +→→点击-->小 i 精品课全集,21ic公开课~~←←→→点击-->小 i 精品课全集,给你全方位的技能策划~~←←

2782

主题

19267

帖子

104

粉丝