【ESP32-C3-DevKitM-1】ESP32-C3的硬件I2C+SHT30
[复制链接]
4、I2C的评测
ESP32-C3有一组硬件I2C,支持主机和从机模式,速度可支持标准模式和快速模式,最高可达800Kbit/s,但受限于SDA和SDL的上拉强度,芯片内部的SDA和SDL脚有上拉电阻可以配置。同时,引脚可以任意映射,如下图
接下来我将使用硬件I2C来驱动温湿度传感器SHT30
1、初始化I2C
因为GPIO没有默认,所以要指定GPIO作为SDA和SCL,还要选择I2C的mode,这里我们选择Master,同时使能内部上拉,还要配置I2C的时钟速度,这里我们选用100KHz,最后调用i2c_param_config和i2c_driver_install来完成配置,这里注意一下I2C的端口i2c_master_port我这里是I2C_NUM_0,具体程序见下图。
还有一些宏定义
2、配置I2C的相关函数
这里直接调用API就行了,同时为了提高移植性,我将官方的API封装了一下,这样SHT30在调用的时候可以灵活切换软硬件I2C驱动函数,见下图
下图是在SHT30头文件里的宏定义,可以实现软硬件I2C灵活切换
3、配置SHT30的函数
SHT30的驱动函数网上也比较多,我就不细讲了,讲一些核心函数,我这里选用Singleshot模式来采集数据,首先要初始化SHT30,这里比较简单,就是I2C的初始化,见下图
4、配置读取SHT30数据的函数
首先要讲一下ESP32-C3的I2C的一些基本操作,包括主机向从机写入数据和主机从从机读取数据,具体的在官方编程指南了写的很明白了,见下图
这里需要注意一点,上边的步骤缺一不可
具体要怎么通过I2C来操作SHT30呢,当然是参考官方数据手册,下图是Singleshot模式的操作时序图
1、首先,发送开始信号,再发送write header,我这里是0x88,然后再发送16位的配置命令,比如配置成高重复性或者低重复性,这个可以参考数据手册或者互联网,我就不细讲了,最后发送停止信号,见下图的程序
这里的Sht30_WriteCommand就是发送两次8位数据,依次是高8位和低8位
同时,因为发送的3组8位数据都是有ACK响应的,所以要将使能主机检查ACK,也就是设置ACK_CHECK_EN
2、延时至少1ms,也就是SCL free,这时候SHT30正在测量
3、发送开始信号,写入read header,我这里的值为0x89,根据时序图,SHT30会返回一个NACK,所以可以不使能主机检查ACK,也就是设置ACK_CHECK_DIS,最后发送停止信号
4、再延时大于1ms
5、再次发送开始信号,再写入read header,如果转换好了,SHT30会发送一个ACK,没有的话可以稍微延长延时时间,然后依次读写6组8位的SHT30返回的数据,这里注意一下,收到前5组数据时要发送ACK,最后1组不需要(虽然加了也没什么关系),然后再发送停止信号就好了。这里还需要注意一点,在读数据时一定要将从设备发送过来的数据全部读完,不然会莫名出问题的,踩了坑)
6、最后要验证收到的数据的正确性,要进行CRC验证,具体算法我就不讲了,大家可以看数据手册。其中temp[2]和humi[2]是CRC数据,如果数据验证正确,再对原始数据进行转换成真实数据。
下图为CRC验证算法和数据转换算法
最后在主函数调用如下函数
用串口打印如下结果,成功驱动
|