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. spine

    spine 英 [spʌɪn] 美 [spaɪn]  n.脊柱;[动,植] 棘,刺(如刺猬和海胆的刺);鱼鳍的刺;植物上的刺

  2. Saving Tang Monk II(bfs+优先队列)

    Saving Tang Monk II https://hihocoder.com/problemset/problem/1828 时间限制:1000ms 单点时限:1000ms 内存限制:256MB ...

  3. ECMAScript5新特性之获取对象特有的属性

    'use strict'; // 父类 function Fruit(){ } Fruit.prototype.name = '水果'; // 子类 function Apple(desc){ thi ...

  4. JdbcTemplate实现CRUD操作

    ------------------siwuxie095                                     JdbcTemplate 实现 CRUD 操作         1.J ...

  5. 二叉树的层次遍历 · Binary Tree Level Order Traversal

    [抄题]: 给出一棵二叉树,返回其节点值的层次遍历(逐层从左往右访问) [思维问题]: [一句话思路]: 用queue存每一层 [输入量]:空: 正常情况:特大:特小:程序里处理到的特殊情况:异常情况 ...

  6. 解决python中csv文件中文写入问题

    一.前言 一般来说,为了方便,使用python的时候都会使用csv模块去写数据到csv文件,但是写入中文的时候,经常会报错: UnicodeEncodeError: 'ascii' codec can ...

  7. spring-boot基础概念与简单应用

    1.spring家族 2.应用开发模式 2.1单体式应用 2.2微服务架构 微服务架构中每个服务都可以有自己的数据库  3.微服务架构应当注意的细节 3.1关于"持续集成,持续交付,持续部署 ...

  8. 如何进入/home/user/.wine

    命令行输入 :cd /home/user/.wine/drive_c/windows/fonts /home是linux的用户目录,/user是用户名/.wine是隐藏目录,凡是以.开头的都是隐藏目录 ...

  9. php的opcode缓存原理

    opcode是什么? 它是一种PHP脚本编译后的中间语言,类似java的字节码.   PHP代码执行(Zend引擎)的步骤如下: 1.Scanning(Lexing) ,将PHP代码转换为语言片段(T ...

  10. dbus通信与接口介绍

    DBUS是一种高级的进程间通信机制.DBUS支持进程间一对一和多对多的对等通信,在多对多的通讯时,需要后台进程的角色去分转消息,当一个进程发消息给另外一个进程时,先发消息到后台进程,再通过后台进程将信 ...