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;
       }
      
      
  • 相关阅读:
    Numpy基础
    Numpy基础
    Java复习之数组
    Java复习之数组
    Python基础2
    第六章 3 列表生成式
    第六章 1 列表(创建,特点)
    IEEE(电气和电子工程师协会)会议排名
    第五章 3 流程控制语句break和continue
    第五章 2 循环结构
  • 原文地址:https://www.cnblogs.com/memorypro/p/9549906.html
Copyright © 2011-2022 走看看