SHT20温湿度传感器使用iic总线的驱动方式,以下资料参考SHT20 datasheet总结


1、IIC总线
  1. Start信号

    IIC总线的起始信号以SDA由高电平变为低电平,等待5us以上,再由SCL从高电平变低电平,发出起始信号,图示如下所示:

    注意:两根线由高变低的间隔时间大于4.7us,建议延时15us

    example:

    	void IIC_Start(void)
    {
    GpioWrite(&SDA, 1);
    GpioWrite(&SCL, 1);
    //todo :delay 15us
    GpioWrite(&SDA, 0);
    //todo "delay 15us
    GpioWrite(&SCL, 0);
    }
  2. Stop信号

    IIC总线的停止信号以SCL信号线从低电平变为高电平,等待0.6us以上SDA信号线再从低电平变高电平,图示如下所示:

    注意:其中间隔时间大于0.6us,建议15us

    example:

    void IIC_Stop(void)
    {
    GpioWrite(&SDA, 0);
    GpioWrite(&SCL, 1);
    //todo :delay 15us
    GpioWrite(&SDA, 1);
    //todo :delay 15us
    GpioWrite(&SCL, 0);
    }
  3. ACK 信号

    ACK信号是在时钟线的下降沿拉低数据线,代码如下:

    void IIC_ACK(void)
    {
    GpioWrite(&SDA, 0);
    GpioWrite(&SCL, 1);
    //todo delay 15us
    GpioWrite(&SCL, 0);
    }
  4. NOACK 信号

    和ACK信号相反,NOACK是在时钟的下降沿拉高数据线,代码如下:

    void IIC_NOACK(void)       //6. 非应答信号
    {
    GpioWrite(&SDA, 1);
    GpioWrite(&SCL, 1);
    //todo delay 15us
    GpioWrite(&SCL, 0);
    }
  5. 发送数据和接受数据

    通常发送数据还是接受数据是由 IIC Addr + Write/Read Byte决定的,所以我们在读取数据或者发送数据之前一定会发送一个 Addr + W/R,,在No Hold Master模式下面,MCU具有主导地位,即时钟信号线由MCU掌握,在发出Start信号之后,开始接受或者发送数据,通常是在时钟的下降沿进行数据的收发操作。收发结束之后需要等待ACK或者Nack,由发送或者接受的数据决定。如下图所示:



    参考代码实现


    bool IIC_SendByte(unsigned char dat) //3.写数据
    {
    unsigned char i;
    bool ack;
    for (i = 0; i < 8; i++)
    {
    if((dat<<i)&0x80)
    {
    GpioWrite(&SDA, 1);
    }
    else
    {
    GpioWrite(&SDA, 0);
    }
    GpioWrite(&SCL, 1); //开始让数据维持稳定
    //todo :delay 15us
    GpioWrite(&SCL, 0);
    //todo :delay 15us
    }
    GpioWrite(&SDA, 1);
    GpioWrite(&SCL, 1);
    //todo :delay 15us
    IIC_SDAMode(PIN_INPUT);
    if (GpioRead(&SDA)) //SDA 低电平 从机回馈低电平
    {
    ack = false;//ack = 0; //0 == ack 代表无ack信号, 从机不应答,发送不成功
    }
    else
    {
    ack = true;// ack = 1; //从机应答,发送成功
    }
    IIC_SDAMode(PIN_OUTPUT);
    GpioWrite(&SCL, 0);
    return ack;
    //todo :delay50us
    }
    unsigned char IIC_RecvByte(void) //4. 读数据
    {
    unsigned char i, temp = 0;
    GpioWrite(&SDA, 1);
    // todo delay 15us
    IIC_SDAMode(PIN_INPUT);
    for (i = 0; i < 8; i++)
    {
    GpioWrite(&SCL, 0);
    //todo delay 15us
    GpioWrite(&SCL, 1);
    //todo delay 15us
    temp<<=1;
    if (GpioRead(&SDA))
    {
    temp = temp + 1;
    }
    }
    GpioWrite(&SCL, 0);
    IIC_SDAMode(PIN_OUTPUT);
    //todo delay 15us
    return temp;
    }

SHT20 IIC总线驱动概述的更多相关文章

  1. Exynos4412 IIC总线驱动开发(一)—— IIC 基础概念及驱动架构分析

    关于Exynos4412 IIC 裸机开发请看 :Exynos4412 裸机开发 —— IIC总线 ,下面回顾下 IIC 基础概念 一.IIC 基础概念 IIC(Inter-Integrated Ci ...

  2. 对 IIC 总线的理解、调用函数以及常见面试问题

    一.IIC 总线概述: IIC 即Inter-Integrated Circuit(集成电路总线) I2C总线是PHLIPS公司推出的一种串行总线, I2C总线只有两根双向信号线.一根是数据线SDA, ...

  3. 18、IIC总线驱动程序

    i2c_s3c2410.c是内核自带dev层(adapt)驱动程序,知道怎么发收数据,不知道含义 在与i2c_s3c2410.c(在其probe函数中的s3c24xx_i2c_init函数会初始化ii ...

  4. linux-2.6.38 总线驱动分析

    一.IIC总线驱动代码 IIC总线控制器通常是在内存上的,连接在platform总线上,所以需要通过platform_driver和platform_device的匹配.我想大概根据总线设备驱动模型的 ...

  5. Linux驱动之IIC总线

    <作用> 电子设备中有很多IIC设备之间需要进行相互通信,这样就产生了IIC总线,常用来实现设备之间的数据通信.   <IIC总线结构> IIC总线只有两条线,一条是串行数据线 ...

  6. RT-thread 设备驱动组件之IIC总线设备

    本文主要介绍RT-thread中IIC总线设备驱动,涉及到的主要文件有:驱动框架文件(i2c_core.c,i2c_dev.c,i2c-bit-ops.c,i2c_dev.h,i2c.h):底层硬件驱 ...

  7. IIC总线

    一. 概述 1. IIC总线是PHILIPS公司推出的一种串口总线,是具备多主机系统所需的包括总线裁决和高低速器件同步功能的高性能串口总线. 2. IIC总线只有两根双向信号线.一根是数据线SDA,一 ...

  8. linux内核SPI总线驱动分析(一)(转)

    linux内核SPI总线驱动分析(一)(转) 下面有两个大的模块: 一个是SPI总线驱动的分析            (研究了具体实现的过程) 另一个是SPI总线驱动的编写(不用研究具体的实现过程) ...

  9. linux之i2c子系统架构---总线驱动

    编写i2c设备驱动(从设备)一般有两种方式: 1.用户自己编写独立的从设备驱动,应用程序直接使用即可. 2.linux内核内部已经实现了一个通用的设备驱动,利用通用设备驱动编写一个应用程序(用户态驱动 ...

随机推荐

  1. Codeforces Beta Round#2

    Codeforces Beta Round#2 http://codeforces.com/contest/2 A 模拟题 #include<bits/stdc++.h> using na ...

  2. 使用jsonp跨域发送请求

    如果获取的数据文件存放在远程服务器上(域名不同,也就是跨域获取数据),则需要使用jsonp类型. 使用这种类型的话,会创建一个查询字符串参数 callback=? ,这个参数会加在请求的URL后面. ...

  3. Tomcat端口被占用解决方法

    端口被绑定,在命令提示符运行wmic process where "Caption='javaw.exe' and CommandLine like '%%bootstrap.jar%%'& ...

  4. Linux升级Ruby

    一.简介 Ruby 是一种开源的面向对象程序设计的服务器端脚本语言,在 20 世纪 90 年代中期由日本的松本行弘(まつもとゆきひろ/Yukihiro Matsumoto)设计并开发.在 Ruby 社 ...

  5. db2 批处理

    db2在Windows下执行批处理,需要使用两个.bat文件 1)把以下命令保存为first_do.bat@echo off@@ECHO ------------------------------- ...

  6. Linux的简单介绍和开发基本运维时候用到的命令

    先简单介绍下Linux文件夹目录 1./ linux下的根目录 实际上等同于window的我的电脑点进去 2./etc /usr 一个是系统配置文件存放的地方,一个是系统资源(应用程序)放的地方这俩文 ...

  7. python之基础补充

    一 bit,和bytes的关系 bit:就是计算机的最小的表示单位. bytes:就是计算机的最小的储存单位. 1  字节(bytes) = 8 位(bit) 格式: print(bytes('字符' ...

  8. sqlserver中怎么查询字段为空的记录

    sqlserver中怎么查询字段为空的记录的两种方法: 详细介绍请查看全文:https://cnblogs.com/qianzf/ 原文博客的链接地址:https://cnblogs.com/qzf/

  9. 详解Windows Service Wrapper(winsw.exe)及应用场景

    winsw.exe可以帮助nginx作为windows服务自启动,不需要每次都输入命令,很方便,使用到目前为止这种做法的效果很完美.你得到了 Windows 服务的支持,而且在服务重启时没有遗留孤立的 ...

  10. 2018.09.16 bzoj1176: [Balkan2007]Mokia(cdq分治)

    传送门 调了半天发现是输出优化打错了求心理阴影体积233 这题很简单啊. 一个修改操作x如果对一个询问操作y有贡献那么有. tx<ty,Xx<=Xy,Yx<=Yy" rol ...