一 、首先了解设备硬件原理图
首先在公司干活,要你开发一个设备驱动,那你的老大必须得给你的东西如下:
- 开发板主板硬件原理图
- 驱动设备的硬件原理图
- 驱动的设备的数据手册(datasheet)
- 一个硬件正常的开发板
- 一个正常的要驱动的设备
- 一份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驱动开发(二)小白也能轻松理解