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信号是在时钟线的下降沿拉低数据线,代码如下:
    cpp void IIC_ACK(void) { GpioWrite(&SDA, 0); GpioWrite(&SCL, 1); //todo delay 15us GpioWrite(&SCL, 0); }
  4. NOACK 信号
    和ACK信号相反,NOACK是在时钟的下降沿拉高数据线,代码如下:
    cpp 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;
     }
    
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值