IIC协议之SHT30温湿度采样

  • 1.IIC协议介绍
    • 1.1 协议简介
    • 1.2 SHT30设备地址
  • 2.协议时序
    • 2.1 IIC通信时序图
    • 2.2 起始信号
    • 2.3 结束信号
    • 2.4 应答信号
    • 2.5 数据位收发
  • 3.协议代码
    • 3.1 起始信号
    • 3.2 结束信号
    • 3.3 应答信号
    • 3.4 非应答信号
    • 3.5 等待从机应答
    • 3.6 主机发送一个字节
    • 3.7 接收从机一个字节
  • 4.SHT30代码
    • 4.1 SHT30初始化
    • 4.2 SHT30获取温湿度

1.IIC协议介绍

1.1 协议简介

IIC由SDA(串行数据线)和SCL(串行时钟线)及上拉电阻组成(总线空闲时是高电平)。IIC是一种主从结构总线,在IIC总线上,每一个设备都可以作为主设备或者从设备,但一个IIC总线上一般只有一个主设备,多个从设备。主设备来产生时钟信号,一般主设备是CPU,而从设备只是用来相应主设备的通信请求,一般从设备是传感器。

1.2 SHT30设备地址

一个IIC总线上可以挂载多个从设备,所以主设备就需要通过从设备的地址来确定与哪个设备进行通信。在IIC总线上每个从设备都有唯一确定的地址,设备地址在芯片内部就固定好了,可以从芯片的datasheet上找到。因为IIC地址全为0时为广播地址,所以IIC总线上最多可以挂载2^7-1=127个从设备。

有时候IIC总线上需要挂载多个同一芯片,为了实现地址的不同,芯片引出了一个或者多个引脚,来使同一芯片具有不同的地址。如SHT30温湿度传感器,芯片引出一个ADDR引脚,当ADDR引脚接VSS时,其7bit地址为0x44,ADDR接VDD时地址为0x45。

2.协议时序

2.1 IIC通信时序图


下面这个图片更好的看出数据的传输。

2.2 起始信号

IIC通信以起始信号开始传输数据,所以在发送数据之前,需要先给个起始信号。由时序图可以知道,总线空闲时SCL和SDA都是高电平,时钟线先拉低,然后数据线拉低,这样就产生了一个起始信号。起始信号是在SCL为高电平时,SDA由高电平向低电平转变,产生一个下降沿,即为起始信号。

2.3 结束信号

IIC通信以结束信号停止传输数据。当收到结束信号后,主从设备停止传输数据。由时序图可以知道,当SCL为高电平时,SDA由低电平向高电平跳转,SDA产生一个上升沿,产生一个结束信号。

2.4 应答信号

在8bit数据传输的后面,紧跟着一个应答信号,用来判断是不是要结束传输数据或者继续传输数据。

当主设备连接从设备时,发送一个地址信号,当在总线上从设备接收到和自己地址相同的地址信息后,给出一个应答信号,表示自己与主设备建立通信。

当主设备接收到从设备的一个字节的数据后,给出自己的应答或者非应答信号,来表示是否需要继续传输数据,给的应答信号,“应答”为低电平,“非应答”为高电平。

2.5 数据位收发

发数据:
先把SCL拉低,然后把SDA拉高,再把SCL拉高,这样就发送一个bit的“1”。
先把SCL拉低,然后把SDA拉低,再把SCL拉高,这样就发送一个bit的“0”。

为什么要这样做?因为数据传输是在SCL为高电平时传输,并且前面讲到起始信号和终止信号的时候,在SCL为高电平时,只要有上升沿或者下降沿的到来,那么就会认为是起始信号或者结束信号。所以在传输bit的时候,得在SCL为低电平时改变SDA的电平,然后在SCL为高电平时,保证SDA的电平稳定,这样才能保证正确发送“0”,“1”。

收数据:同样,接收数据也是在SCL为高电平时接收,因为数据的传输在SCL为高电平,所以在接收数据前,把SCL拉高,然后读取SDA的电平即可。

3.协议代码

3.1 起始信号

void IIC_Start()//产生开始信号
{IIC_SDA_On();//输出模式SCL_H();SDA_H();delay_us(2);SDA_L();delay_us(2);SCL_L();
}

3.2 结束信号

void IIC_Stop()//产生结束信号
{IIC_SDA_On();//输出模式SCL_L();SDA_L();delay_us(2);SCL_H();delay_us(2);SDA_H();delay_us(2);
}

3.3 应答信号

void IIC_Ack()//应答模式,SCL高电平时,SDA=0为应答
{SCL_L();IIC_SDA_On();//输出模式SDA_L();/*SCL__---**SDA_____*传输数据0*/delay_us(2);SCL_H();delay_us(2);SCL_L();
}

3.4 非应答信号

void IIC_NAck()
{SCL_L();IIC_SDA_On();//输出模式SDA_H();/*SCL__---**SDA-----*传输数据1*/delay_us(2);SCL_H();delay_us(2);SCL_L();
}

3.5 等待从机应答

从机无应答时,应结束连接,所以发送IIC终止信号

uint8_t IIC_Wait_Ack()
{uint8_t ucErrTime=0;IIC_SDA_In();SCL_H();while(SDA_Read()){ucErrTime++;if(ucErrTime>250){IIC_Stop();return 1;}}SCL_L();return 0;
}

3.6 主机发送一个字节

void IIC_Send_Byte(uint8_t data)
{uint8_t i,txd;IIC_SDA_On();SCL_L();//拉低时钟线,选择传输的SDA电平,因为数据传输需要在SCL低电平时改变,高电平时输出for(i=0;i<8;i++){txd=(data&0x80)>>7;//把最高位取出来data<<=1;if(txd)SDA_H();elseSDA_L();delay_us(2);SCL_H();//开始传输delay_us(2);SCL_L();delay_us(2);}
}

3.7 接收从机一个字节

在接收从机数据的时候,需要给应答或者非应答信号,来决定是否需要继续传输数据。

uint8_t IIC_Receive_Byte(uint8_t ack)//方便理解,逻辑和从机应答相反,1为应答 0为非应答
{uint8_t i,recevie=0;IIC_SDA_In();for(i=0;i<8;i++){SCL_L();delay_us(2);SCL_H();recevie<<=1;recevie+=SDA_Read();delay_us(2);}if(ack)IIC_Ack();elseIIC_NAck();return recevie;
}

4.SHT30代码

4.1 SHT30初始化

发送测量指令,让SHT30开始循环采集温湿度。我采用的是SHT30的周期性数据采集模式的测量指令。

void Sht30_Init()
{IIC_Start();IIC_Send_Byte(0x44<<1|0);//0为写IIC_Wait_Ack();IIC_Send_Byte(0x21);IIC_Wait_Ack();IIC_Send_Byte(0x30);IIC_Wait_Ack();IIC_Stop();HAL_Delay(150);
}

4.2 SHT30获取温湿度

周期模式测量结果的读出。

在温度湿度后面会紧跟一个检验和数据CRC。

void Read_IIC_Data(float *Temperature,float *Humidity)
{uint16_t data[6];uint16_t temp,humi;IIC_Start();IIC_Send_Byte(0x44<<1|0);//0为写IIC_Wait_Ack();IIC_Send_Byte(0xe0);IIC_Wait_Ack();IIC_Send_Byte(0x00);IIC_Wait_Ack();IIC_Start();IIC_Send_Byte(0x44<<1|1);IIC_Wait_Ack();
//温度数据data[0]=IIC_Receive_Byte(1);data[1]=IIC_Receive_Byte(1);
//CRCdata[2]=IIC_Receive_Byte(1);
//湿度数据data[3]=IIC_Receive_Byte(1);data[4]=IIC_Receive_Byte(1);data[5]=IIC_Receive_Byte(0);IIC_Stop();
//校验和就不计算了temp=(data[0]<<8)|data[1];humi=(data[3]<<8)|data[4];/*转换实际温度*/*Temperature=(175.0*(float)temp/65535.0-45.0) ;// T = -45 + 175 * tem / (2^16-1)*Humidity=(100.0*(float)humi/65535.0);// RH = hum*100 / (2^16-1)}

IIC协议之SHT30温湿度采样相关推荐

  1. I2C协议介绍以及HAL库实现I2C对SHT30温湿度采样

    文章目录 1- I2C协议介绍 (1)I2C协议简介 (2)I2C从设备地址 2- I2C通信时序 (1)起始位 (2)读写地址 (3)I2C应答信号 (4)数据位发送与接收 3- I2C协议主机收发 ...

  2. STM32之IIC通讯升级版--SHT30温湿度读取

    针对上篇文章对于程序可移植性不强的问题进行优化,基本思路是首先搭建好IIC底层驱动程序,该程序可用于任何IIC通讯设备,然后针对不同的IIC设备单独编写应用程序,本篇文章仍以SHT30为例. 一.II ...

  3. 【STM32】【STM32CubeMX】STM32CubeMX的使用之四:IIC总线协议驱动SHT30温湿度传感器

    文章目录 0.前言 1.传感器介绍 1.1.传感器简介 1.2.传感器板原理图 1.3.传感器引脚定义 1.4.数据采集工作流程 1.4.1.单次数据采集模式 1.4.2.周期型数据采集模式 1.5. ...

  4. 模拟IIC读取SHT30温湿度传感器数据

    文章目录 1 i2c.c 2 i2c.h 3 crc.c 4 crc.h 1 i2c.c /*** @brief SHT30温湿度传感器相关,使用模拟IIC进行数据的读取*/#include < ...

  5. nRF52笔记(8) IIC读取sht30温湿度传感器

    1.平台的条件 1.1 软件平台:sdk14.2 1.2 硬件平台: nrf52832 2 说明: 只是介绍代码怎么使用,直接点 QQ: 1297311998 ,如果有什么问题,请高手不吝赐教 2.n ...

  6. STM32F103使用硬件IIC驱动SHT30温湿度传感器

    文章目录 前言 一.SHT30温湿度传感器原理图 二.代码部分 1.SHT30.c文件 2.SHT30.h文件 总结 前言 SHT30是一种常见的温湿度传感器,该传感器广泛应用于各种场景,小米的温湿度 ...

  7. STM32物联网项目-SHT30温湿度采集(IIC通信)

    SHT30温湿度采集(IIC通信) SHT30数字温湿度传感器 SHT3x湿度传感器系列包括低成本版本SHT30.标准版本SHT31,以及高端版本SHT35. SHT3x湿度传感器系列结合了多种功能和 ...

  8. STM32F103完成基于I2C协议的AHT20温湿度传感器的数据采集

    文章目录 一.I2C总线通讯协议 1.I2C总线简介 2.I2C 协议的物理层和协议层 2.1物理层 2.2协议层 3.I2C的两种方式--硬件I2C和软件I2C 3.1硬件I2C 3.2软件I2C ...

  9. 传感器:SHT30温湿度传感器检测环境温湿度实验(底部附代码)

    一.导言 SHT30温湿度传感器模块是通过IIC驱动,所以大家使用该模块时,需要具备IIC的基本知识,这篇文章带领大家一起使用SHT30模块进行温湿度的测量,当然DHT10/DHT10原理都一样,好了 ...

最新文章

  1. 史上最全最常用批处理260多个打包下载
  2. linux下kill指令默认信号,Linux基础命令之kill命令
  3. [Leetcode][第216题][JAVA][数组之和3][回溯]
  4. 指尖上的艺术——如何运用代码发挥无限创意
  5. 特斯拉上调电动汽车预订订金:由100美元上调至250美元
  6. 深圳大学计算机科学考研,深圳大学考研计算机专业要多少分数会被百分百录取...
  7. 事务的隔离级别与锁的申请和释放
  8. 【Java从0到架构师】Maven - 依赖冲突、分模块构建项目
  9. uniapp全局传值方式总结
  10. 微信取消分享后还是执行成功函数
  11. oracle 查询default,oracle分区表检查--是否带有max或default分区
  12. 15分钟破解保险箱!美国小哥200美元自制开锁机器人
  13. java 使用 ehcache_Java Ehcache简单使用
  14. 记录这一刻:开通原创保护功能
  15. matlab求矩阵特征值的最大值,[转载]MATLAB用eig()函数求【特征值】【特征向量】【归一化...
  16. MATLAB2018a解压文件损坏,教大家解压压缩包提示已损坏的解决方法
  17. webpack雪碧图生成
  18. 记录下我磕磕碰碰的三个月找工作经历,offer拿到手软
  19. 目标检测学习笔记——SSD以及改进模型DSSD的原理解读及SSD的Tensorflow代码实现(图文并茂)
  20. 4.1 行列式的定义

热门文章

  1. SAP的萨班斯法案SOA解决方案
  2. 台式计算机怎么强制关机,台式电脑怎么强制关机
  3. python时间模块 datetime (datetime、timedelta和timezone部分)
  4. 互联网名称与数字地址分配机构ICANN简介
  5. 如何利用Vue3管理系统实现动态路由和动态侧边菜单栏
  6. 怎么提取视频中的音频?教你快速学会这三个方法
  7. 最简易的Cfree代码,cfree爱心代码。
  8. 《春·蜂》processing下的动画技术交互应用
  9. java 初始化数组_Java中数组的初始化
  10. 目标检测:二维码检测方案