zoukankan      html  css  js  c++  java
  • SHT20 IIC总线驱动概述


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


    1、IIC总线
    1. Start信号

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

      img1

      注意:两根线由高变低的间隔时间大于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信号线再从低电平变高电平,图示如下所示:

      img2

      注意:其中间隔时间大于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,由发送或者接受的数据决定。如下图所示:

      img3
      参考代码实现

      
      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;
       }
      
      
  • 相关阅读:
    该虚拟机似乎正在使用中,请获取所有权
    分配销售区域
    未对销售组织 XXX 分销渠道 00 语言 ZH 定义
    Bash 遍历目录
    plsql 不需配置*.ora就可以访问数据库
    arch linux
    拓端数据tecdat|R语言有限混合模型(FMM,finite mixture model)及其EM算法聚类分析间歇泉喷发时间
    拓端数据tecdat|使用R语言进行多项式回归、非线性回归模型曲线拟合
    拓端数据tecdat|R语言使用ARIMAX预测失业率经济时间序列数据
    拓端数据tecdat|R语言用ARIMA模型,ARIMAX模型预测冰淇淋消费时间序列数据
  • 原文地址:https://www.cnblogs.com/memorypro/p/9549906.html
Copyright © 2011-2022 走看看