【开发历程】STM32F4之SHT31

您所在的位置:网站首页 mlx90615中文手册 【开发历程】STM32F4之SHT31

【开发历程】STM32F4之SHT31

2024-02-25 03:45| 来源: 网络整理| 查看: 265

前言

本人萌新一枚,学习了STM32之后想自己调点什么练练手,于是打开淘宝。本来想买一块DHT11,翻着翻着就发现了这块小板。本着调就调没调过的原则,从店家购买了SHT31模块。买了后才发现,网上相关的中文资料很少,店家给的资料也没有多少中文。于是不得不走上啃英文手册的道路。这是本人第一次STM32F4实战,第一次IIC通信调试,也是第一次通过翻英文手册自主独立调试。前前后后调了好几天,终于写通。写这篇历程,主要是为了回顾调试过程,以便查缺补漏,看看能不能解决一些当时没能解决的疑问。如果我的学习历程能帮助到大家,自然更好。还要感谢许多相关博客也解决了我许多疑问,同时吹一波谷歌翻译。小白进行STM32F4的IIC通信实战,难免有许多问题。如有不足,欢迎指正。如果有实在谬误荒诞之处,就当博诸君一笑。

第一部分 SHT31传感器介绍

1.1芯片简介 SHT3X-DIS系列手册描述 SHT3X系列是由瑞士Sensirion生产的高精度温湿度传感器,也是Sensirion公司目前主打的温湿度传感器系列。现在网上常见的相关资料调试的基本上以SHT30为主,SHT31则较少。当然,现在官网上还有了更高级的SHT35系列,那就是后话了。

这次采用的SHT31-DIS传感器允许宽电压输入,支持2.4V~5.5V(官网标注的实际SHT31系列最低支持电压为2.15V)。采用IIC总线通信,最高可达1MHz的通信速度。并根据ADDR引脚的接法,提供两个可选的地址。传感器的精度为2%RH和0.3℃。传感器最大工作范围-40-125℃,0-100%RH。原装芯片有8个引脚。

还有一点要注意的是SHT31的最佳工作环境是20℃-60℃,20%RH-80%RH已知当传感器暴露在>80%RH的工作环境下超过60小时后,会出现+3%RH的偏差。(不得不吐槽一句,超过80%的空气湿度在南方是分分钟的事,这就顶不住了,难道瑞士很干燥吗?好像确实比较干燥 )不过这个误差是可逆的,在回到最佳工作环境后,还能慢慢校准回来。但是还是会加速传感器老化。

通过查资料,才知道原来还有一个不提供数字接口,直接输出比例模拟电压的SHT3X-ARP系列。如果感兴趣,可以自行搜索。

1.2 引脚介绍 SHT3X芯片引脚 芯片总共有8个引脚 1.SDA :IIC数据线引脚 2.ADDR :地址引脚,可连接VSS或VDD,分别会有不同的地址。不能浮空。 3.ALERT :报警引脚,如果使用,建议接到单片机的外部中断。不用的话建议浮空。 4.SCL :IIC时钟线引脚 5. VDD :电压输入引脚 6.nRESET :复位引脚,低电平有效。如果不用,建议接到VDD。 7.R :没有电气作用的“没卵用“”引脚,连接到VSS 8. VSS :接地

(附上官方推荐的典型应用电路) SHT3X经典应用电路 1.3命令和模式介绍

首先看一下地址 SHT3X地址

很明显,当传感器ADDR引脚接VSS时,采用地址A;当传感器ADDR引脚接VDD时,采用地址B。

传感器支持单次数据采集模式和周期性数据采集模式。其实单次数据采集模式下,可选时钟延伸,而周期性数据采集默认开始数据延伸。这里我们默认采用周期性数据采集模式。

SHT3X工作模式设定命令表和工作流程 SHT3X支持12种工作模式,分别有高,中,低三档可选刷新率。mps=0.5,1,2…时,分别代表每两秒采集一次数据,每秒采集一次数据,每秒采集两次数据…

如希望设定高刷新率,每秒采集一次。那么向传感器写命令0x2130即可。注意当采用mps=10时,会导致传感器自发热,影响测量。

工作顺序为:先发送IIC通信开始标志Start后,写入左移一位的地址,并将空出来的位写0表示写数据。当收到传感器应答后,即可发送命令的高八位,再次等待应答,再发送余下的低八位。然后等待ACK应答即可。

其他命令同理,大部分都是同样的写入模式。

1.4 重要命令及其工作流程

那么我们看几条重要的命令及其工作流程。 抓取数据命令

设置好工作模式后写入此命令,可以准备好接受数据。先发送IIC通信开始标志Start后,写入左移一位的地址,并将空出来的位写1表示读数据。然后等待ACK应答即可接受数据。注意数据传输顺序是先温度后湿度。并且都是十六位数据。并且每个数据后都附8位的CRC校验。在完成湿度的CRC校验后,即可回复NACK,传感器将停止发送数据,释放SDA线,以便于MCU发送Stop标志,结束通信。 Break命令

这个Break命令不能Break别的,就是只能Break周期性采集模式。写入后将进入单次采集模式。手册建议,在开启周期性采集模式下,如果要写入命令,先写入Break命令,再写入其他命令。

软复位命令 软复位命令

1.5 SHT3X状态寄存器

SHT3X的状态寄存包含了许多相关状态,可以方便我们查看传感器状态以及命令的执行情况。 读寄存器状态

读寄存器状态将会返回一个16位的数据。这个数据包含许多信息状态,我们不一一赘述,这里我们关注两个信息。 先上表: 状态寄存器表 这里我关注的是第0位和第1位

0 命令状态 : 读为0时,说明上一条命令执行成功;读为1时,说明上一条命令执行失败。 1 CRC状态 : 读为0时,说明CRC校验成功;读为1时,说明CRC校验失败。

至于为什么关注这两位,下面再说。

还有一个命令 状态清除命令 这个命令可以清除寄存器的4,10,11,15位。

第二部分 代码分解

IIC部分,由于我也是初学IIC,IIC通信代码都还是对着正点原子的照猫画虎。而且这是SHT3X的学习历程,而非IIC的学习历程,时序图也并没有什么好说的。索性直接贴上代码,以作参考。

#include "iic.h" #include "delay.h" /********************************************************* 函数名:IIC_Init() 描述:IIC初始化 入口参数:无 出口参数;无 附加信息: 说明: *********************************************************/ void IIC_Init() { GPIO_InitTypeDef GPIO_InitStructure; RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOB, ENABLE);//使能GPIOB时钟 GPIO_InitStructure.GPIO_Pin= GPIO_Pin_8|GPIO_Pin_9; GPIO_InitStructure.GPIO_Mode=GPIO_Mode_OUT; GPIO_InitStructure.GPIO_OType=GPIO_OType_PP; GPIO_InitStructure.GPIO_PuPd=GPIO_PuPd_UP; GPIO_InitStructure.GPIO_Speed=GPIO_Speed_100MHz; GPIO_Init(GPIOB,&GPIO_InitStructure); IIC_SCL=1; //先拉高 IIC_SDA=1; } /********************************************************* 函数名:IIC_Start() 描述:IIC起始信号 入口参数:无 出口参数;无 附加信息: 说明: *********************************************************/ void IIC_Start() { SDA_OUT(); //SDA输出 IIC_SDA=1; IIC_SCL=1; delay_us(4); IIC_SDA=0; delay_us(4); IIC_SCL=1; //钳住I2C总线,准备发送或接收数据 } /********************************************************* 函数名:IIC_Stop() 描述:IIC结束信号 入口参数:无 出口参数;无 附加信息: 说明: *********************************************************/ void IIC_Stop() { SDA_OUT(); IIC_SDA=0; IIC_SCL=1; delay_us(4); IIC_SDA=1; delay_us(4); //发送总线结束信号 } /********************************************************* 函数名:IIC_Send_Ack() 描述:发送应答信号Ack 入口参数:无 出口参数;无 附加信息: 说明: *********************************************************/ void IIC_Send_Ack() { SDA_OUT(); IIC_SCL=0; IIC_SDA=0; delay_us(2); IIC_SCL=1; delay_us(2); IIC_SCL=0; } /********************************************************* 函数名:IIC_Send_NAck() 描述:发送不应答信号NAck 入口参数:无 出口参数;无 附加信息: 说明: *********************************************************/ void IIC_Send_NAck() { SDA_OUT(); IIC_SCL=0; IIC_SDA=1; delay_us(2); IIC_SCL=1; delay_us(2); IIC_SCL=0; } /********************************************************* 函数名:IIC_Wait_Ack(void) 描述:等待Ack应答 入口参数:无 出口参数;接受失败返回1,成功返回0 附加信息: 说明: *********************************************************/ u8 IIC_Wait_Ack(void) { u8 ucErrTime=0; SDA_IN(); //SDA设置为输入 IIC_SCL=1;delay_us(1); IIC_SDA=1;delay_us(1); while(READ_SDA) { ucErrTime++; if(ucErrTime>250) { IIC_Stop(); return 1; } } IIC_SCL=0; return 0; } /********************************************************* 函数名:IIC_Write_Byte(u8 date) 描述:IIC写入一个字节 入口参数:需要写入的字节 出口参数;无 附加信息: 说明: *********************************************************/ void IIC_Write_Byte(u8 date) { u8 a,b; u8 i; a=date; SDA_OUT(); IIC_SDA=0; for(i=0;i>7; a=a


【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3