温湿度传感器SHTC3驱动开发(一)小白也能轻松理解

  • Post author:
  • Post category:其他




一 、首先了解设备硬件原理图

首先在公司干活,要你开发一个设备驱动,那你的老大必须得给你的东西如下:

  1. 开发板主板硬件原理图
  2. 驱动设备的硬件原理图
  3. 驱动的设备的数据手册(datasheet)
  4. 一个硬件正常的开发板
  5. 一个正常的要驱动的设备
  6. 一份demo驱动代码(一些厂家可能没有linux驱动代码,只有stm32的,这个就会稍微麻烦一点)

好了,现在清算一下,除了第6个,如果缺胳膊少腿儿的,你直接找老大要就完事了,不要怕,直接要



打开主板硬件原理图

找到和温湿度传感器相关部分,可以看到温湿度传感器接在J25口上,并且看到是I2C2_SDA和I2C2_SCL,可以确定的是该设备走的i2c协议,并且是i2c2(通常情况下是i2c2,但是由于我们硬件工程师命名和原厂定义有出入,其实对应的是i2c0)。

到这里我们可以知道两个信息,一个是该设备驱动走的是i2c协议,且是接入的i2c2。

在这里插入图片描述



打开温湿度硬件原理图

在这里插入图片描述

其实这上面没有什么关键信息,不过做开发肯定是得看一眼,结合温湿度传感器datasheet可知其实温湿度传感器设备有四根线,从datasheet上也可以看到,分别是电源线 时钟线 数据线 接地。

在这里插入图片描述



二、打开温湿度传感器datasheet

在这里插入图片描述

在这里插入图片描述

浏览可以得到一个大概信息,SHTC3是一个可以检测温度和湿度的传感器,

温度范围 -40℃~125℃

湿度范围 0%~100%

工作电压 1.6v~3.6v

通讯方式 i2c

时钟频率 三种模式分别是 0 ~ 100kHz 0 ~ 400kHz 0 ~ 1000kHz

找到如下几个关键信息



温湿度设备地址和读写命令
在这里插入图片描述

在实际的使用过程中,SHTC3的设备地址需要与读写数据/命令方向位组成一个字节同时发送,字节的最低位为读写数据/命令方向位,高7位是SHTC3的设备地址。


如果要通过I2C写数据或命令给SHTC3,在I2C起始信号之后,需要发送“1110 0000”,即0xE0给SHTC3,除了通过高7位“1110 000”的设备地址寻址还通过最低位“0”通知SHTC3接下来是写数据或命令操作。


如果要通过I2C读取SHTC3中的数据,在I2C起始信号之后,需要发送“1110 0001”,即0xE1给SHTC3,除了通过高7位“1110 000”的设备地址寻址还通过最低位“1”通知SHTC3接下来是读取数据的操作。


简单来说就是,0xE0表示写数据,0xE1表示读数据。不过这个貌似在linux驱动开发中用不上,可能stm32开发驱动用到。不过当使用逻辑分析仪测试i2c通信是否畅通的时候可以参考,后续会讲解到。



读取温湿度数据

在这里插入图片描述

可知,不同的命令,除了获取的数据顺序不一样,还有一个Clock Stretching Enable 和 Disable的区别。

Clock Stretching是时钟拉伸的意思。如果使用Clock Stretching Enable命令的话,那么发送完测量命令之后,在SHTC3测量温度湿度数据的过程中,SHTC3会拉低I2C的时钟线SCL,通过这样来禁止主机发送命令给SHTC3,只有当SHTC3完成温度湿度数据测量时,SHTC3才会释放时钟线SCL。

如果使用Clock Stretching Disable命令的话,在SHTC3测量数据的过程中,SHTC3并不会拉低I2C的时钟线SCL,只是如果主机在SHTC3测量数据的过程中发送命令或数据的时候,SHTC3是不会响应主机的,主机可以通过SHTC3是否有响应信号来判断SHTC3是否完成数据的测量。

从数据手册可知,一个测量周期包概括四个步骤:

1、发送唤醒命令。

2、发送测量命令

3、读取测量完成之后的数据。

4、发送休眠命令。

以上唤醒命令和休眠命令在数据手册中查询。

在这里插入图片描述

总结如下:

1、唤醒SHTC3:先发送写入指令(0xE0),再发送唤醒指令高位(0x35),再发送唤醒指令低位(0x17)。

2、等待唤醒:数据手册上写的最大唤醒时间是240us,等待的时间大于这个就行了。

3、发送采集指令:先发送写入指令(0xE0),再发送采集指令的高位和低位。采集指令有多个,根据需要自行选择。

4、接收数据:发送读取指令(0xE1),连续接收6个字节数据。如果采集的指令是先存温度,那么这6个字节的第1-2个字节就是温度数值,第3个字节是温度校验。第4-5个字节是湿度数值,第6个字节是湿度校验。如果采集的指令是先存湿度,则前3个字节和后3个字节相反。

5、进入睡眠:发送写入指令,再发送睡眠指令进入睡眠。

这里先对命令使用有个大概了解,后续编码时再详细讲解如何使用



三、数据的计算

由shtc3数据手册可知

在这里插入图片描述

例如:采集到的湿度数值是0x6501,换算成十进制是25857。

则:湿度 = 100 * 25857 / 65536 = 39.45 (单位:%)

采集到的温度数值是0x6600,换算成十进制是26112。

则:温度 = -45 + 175 * 26112 / 65536 = 24.72 (单位:℃)



四、添加设备树节点

根据以上的信息,可以开始在设备树中添加设备节点了,找到你项目使用的设备树文件,一般路径为

arch/arm/boot/dts/xxx/xxx.dts


我这里开发板对应的是i2c0,所以在dts的i2c0下添加节点,具体如下:

在这里插入图片描述


这里有两个要注意的地方


1.为什么是i2c0 ?

上面主板原理图明明写的是I2C2_SDA、I2C2_SCL,这是因为我们硬件工程师命名时没有和原厂保持统一,导致的出入,Domain对应的M几,才是真正对应的哪个i2c。如果你在设备数的i2c2节点下添加,那驱动肯定是不会通的,所以我们开发过程中遇到问题要及时沟通。

在这里插入图片描述

2.pinctrl-0怎么配置?

在主板原理图中找I2C2对应的有哪些引脚,可以看到有GPIOZ_0和GPIOZ_1

在这里插入图片描述

然后在dts的头文件找到这个文件#include “mesonsm1.dtsi”,打开mesonsm1.dtsi,发现i2c0有三个pinctrl配置,pinctrl2对应的是z0和z1,所以应该选择i2c0_master_pins2。

在这里插入图片描述

注意:设备节点中的宏SENSOR_TYPE_TEMPERATURE 需要在头文件中添加<dt-bindings/sensor-dev.h>

添加完设备树之后,编译烧录,启动板子,查看节点是否添加成功,名称是否一致,如下图显示,即表明设备树节点添加成功。

在这里插入图片描述

在这里插入图片描述

注意:

当你准备验证设备节点是否添加成功时,记得一定要把温湿度设备插到主板上,电源供电供上,别只插USB线,忙碌了一大堆,往往基本操作很容易忽略

做完这一步,可以使用逻辑分析仪测试硬件通信是否正常,可参考此文章,后续编写驱动,便不用考虑硬件的问题了。

逻辑分析仪的使用

下一篇继续详细讲解i2c协议的驱动编码过程,如果你觉得有用的话,请点个赞吧~


温湿度传感器SHTC3驱动开发(二)小白也能轻松理解



版权声明:本文为mj475002864原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。