0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

【英飞凌PSoC 6 RTT开发板试用】通过软件和硬件I2C接口获取数字温湿度传感器SHT30的数据

码工杂记 2023-07-11 09:21 次阅读

本文将会分别介绍——使用软件I2C硬件I2C在PSoC开发板上获取SHT30数字温湿度传感器的数据。本文实验使用的是4线的SHT30模组,通信接口为I2C,对外仅提供四根线,使用起来简单、便捷。本文使用的开发环境为RT-Thread Studio,设备上运行的是RT-Thread实时系统。本文主旨在于,介绍如何在PSoC开发板上使用软件I2C和硬件硬件I2C驱动外设。

如需离线阅读,可以下载本文的完整pdf版本:

*附件:【英飞凌PSoC 6 RTT开发板试用】通过I2C接口读取SHT30传感器的温湿度数据 28a12ba6538e461da5c07d6ff64279b1.pdf

一、环境准备

开始之前,需要准备实验所需的硬件和软件,接下来分别介绍。

1.1 硬件准备

本次实验需要用到的硬件有:

1.2 软件准备

本次实验需要使用的软件主要为:

  • RT-Thread Studio
  • MobaXterm(其他串口调试工具也可以)

假设你已经成功在电脑上安装了以上这些软件。

二、硬件原理分析

2.1 硬件连接

硬件连接分为两部分,一部分是PC和开发板,通过USB Type-C线连接;这个没啥难度,不做过多介绍;需要注意的是,开发板一端接DAP口;否则无法正常下载程序。

另外一部分是,开发板和OLED屏幕之间的连接,具体如下表所示:

SHT30模组 开发板引脚
SCL A0
SDA A1
GND GND
VCC 3V3

开发板和OLED屏幕之间的硬件连接,如下图所示:

Untitled

2.2 开发板原理图

首先,检查开发板原理图的Arduino接口A0/A1部分:

Untitled

这里只能看到标号,看不到主控芯片的引脚名称。

所以,还需要继续搜索这两个引脚的标号,找到主控芯片对应的引脚标号:

Untitled

对照前面的传感器与开发板的连接图,以及这两处原理图,可以知道——传感器模组I2C引脚和主控芯片直接的连接关系为:

  • SCL:P10.0
  • SDA:P10.1

2.3 芯片数据手册

《PSoC 6 MCU: CY8C62x8, CY8C62xA Datasheet》文档的 Pinouts 章节,Table 8. Multiple Alternate Functions 引脚功能服用表,可以查到P10.0和P10.1的功能有:

Untitled

Untitled

可以看到,有scb[1].i2c_scl和scb[1].i2c_sda功能。

也就是说,P10.0和P10.1可以设置为硬件I2C功能。

三、软件I2C获取SHT30数据

接下来,将使用RT-Thread Studio创建项目,并通过添加软件包和修改配置的方式,实现使用软件I2C获取SHT30的温湿度数据。

3.1 创建RT-Thread项目

在RT-Thread Studio中,打开“文件”→“新建”→”RT-Thread项目”菜单,如下图所示:

Untitled

在弹出的创建项目界面中,Project name中填入psoc6_sht30,选中基于开发板的项目,如下图所示:

Untitled

点击“完成”,稍等几秒钟,即可创建名为psoc6_sht30的项目。

3.2 添加ssd1306软件包

创建项目后,双击项目资源管理器视图中,项目下方的“RT-Thread Settings”,主编辑区如下图所示:

Untitled

点击其中的“添加软件包”,弹出的软件包搜索界面,如下图所示:

Untitled

按照图中标注的操作顺序,即可将ssd1306软件包添加到当前项目。

添加完成后,主编辑区如下图所示:

Untitled

此时,按Ctrl+S快捷键,保存对项目配置的修改。如果网络通常,则会在控制台窗口中看到ssd1306软件包正常下载的日志:

Untitled

这样,ssd1306软件包就成功添加到项目中了,位于packages子目录下:

Untitled

3.3 配置软件I2C引脚

接下来,在RT-Thread Studio主编辑器,点击详细配置按钮,按钮位置如下图所示:

Untitled

主编辑器将会显示详细配置:

Untitled

切换到“硬件”标签页,找到“Enable Software I2C”选项,并打开该选项,如下图所示:

Untitled

接着,打开“使能I2C1 BUS”,并将scl和sda中分别改为80和81,如下图所示:

Untitled

最后,按Ctrl+S保存对所有配置项的修改。

3.4 编译和下载程序

首先,点击工具栏的锤子图标,或者按Ctrl+B快捷键,触发项目构建(全部编译):

Untitled

项目构建完成后,可以在控制台窗口看到生成了elf文件,以及预计Flash和RAM占用情况:

Untitled

接着,点击工具栏上的下载图标,或者Ctrl+Alt+D快捷键,触发下载程序二进制文件到开发板上,如下图:

Untitled

下载过程中以及下载完成后,控制台窗都可以看到日志输出:

Untitled

PS:开始下载之前,需要确认开发板以及和PC正确连接了(开发板要连在DAP口上,并能够正常识别)。

3.5 运行和测试程序

为了方便在串口中进行命令控制,运行之前,需要先打开MobaXterm(或者其他串口调试工具):

Untitled

如上图所示,选中对应的COM号,串口参数设置为:

  • 波特率 115200
  • 数据位 8
  • 停止位 1
  • 校验 None
  • 流控 None

之后,点OK确认连接。

连接成功后,按开发板的复位键,可以看到串口连接中输出:

Untitled

可以看到i2c1成功注册的日志。

此时输入help命令并回车:

Untitled

可以看到,有sht3x命令了。

输入sht3x命令并回车,将会输出用法提示:

Untitled

可以看到,使用 sht3x probe 加上i2c设备名称,可以探测传感器;

我们先用list device看看有哪些设备:

Untitled

可以看到i2c1设备了。

接下来,使用 sht3x probe i2c1 探测设备:

Untitled

已经成功探测到了。

紧接着,使用sht3x read尝试读取传感器温湿度值:

Untitled

成功读取到了温湿度数据!

接下来,我把手指放在传感器上,多读几次(上下键翻历史命令,再回车,可以避免重复复输入),应该可以看到温度和湿度都在不断升高:

Untitled

说明传感器是正常工作的。

四、硬件I2C获取SHT30数据

前面通过查询原理图,我们知道开发板Arduino接口的A0/A1引脚可以设置为I2C1功能,接下来将在前面创建的项目的基础上,修改代码,实现通过硬件I2C1获取SHT30的温湿度数据。

4.1 增加硬件I2C1配置和代码

RT-Thread Studio默认创建的项目不支持硬件I2C1,不能实现硬件I2C1驱动SHT30。因此,需要先添加I2C4配置和代码,才能进行后续操作。

首先,修改 board/Kconfig 文件,在config BSP_USING_HW_I2C3之前添加如下代码行:

config BSP_USING_HW_I2C1
                bool "Enable I2C1 Bus (User I2C)"
                default n
                if BSP_USING_HW_I2C1
                    comment "Notice: P10_0 -- > 80; P10_1 -- > 81"
                    config BSP_I2C1_SCL_PIN
                        int "i2c4 SCL pin number"
                        range 1 113
                        default 80
                    config BSP_I2C1_SDA_PIN
                        int "i2c4 SDA pin number"
                        range 1 113
                        default 81
                endif

接着,修改 libraries/HAL_Drivers/SConscript 文件,找到 src += ['drv_i2c.c'] ,将其前面的条件修改为:

if GetDepend('BSP_USING_HW_I2C1') or GetDepend('BSP_USING_HW_I2C3') or GetDepend('BSP_USING_HW_I2C6'):
    src += ['drv_i2c.c']

最后,修改 libraries/HAL_Drivers/drv_i2c.c 文件,具体修改内容为:

--- a/libraries/HAL_Drivers/drv_i2c.c
+++ b/libraries/HAL_Drivers/drv_i2c.c
@@ -11,9 +11,19 @@
 #include "board.h"

 #if defined(RT_USING_I2C)
-#if defined(BSP_USING_HW_I2C3) || defined(BSP_USING_HW_I2C6)
 #include 

+#include "drv_log.h"
+
+#ifndef I2C1_CONFIG
+#define I2C1_CONFIG \\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\
+    {                                \\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\
+        .name = "i2c1",              \\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\
+        .scl_pin = BSP_I2C1_SCL_PIN, \\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\
+        .sda_pin = BSP_I2C1_SDA_PIN, \\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\
+    }
+#endif
+
 #ifndef I2C3_CONFIG
 #define I2C3_CONFIG                  \\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\
     {                                \\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\
@@ -22,7 +32,7 @@
         .sda_pin = BSP_I2C3_SDA_PIN, \\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\
     }
 #endif /* I2C3_CONFIG */
-#endif
+
 #ifndef I2C6_CONFIG
 #define I2C6_CONFIG                  \\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\
     {                                \\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\
@@ -34,6 +44,9 @@

 enum
 {
+#ifdef BSP_USING_HW_I2C1
+    I2C1_INDEX,
+#endif
 #ifdef BSP_USING_HW_I2C3
     I2C3_INDEX,
 #endif
@@ -59,6 +72,10 @@ struct ifx_i2c

 static struct ifx_i2c_config i2c_config[] =
     {
+#ifdef BSP_USING_HW_I2C1
+    I2C1_CONFIG,
+#endif
+
 #ifdef BSP_USING_HW_I2C3
         I2C3_CONFIG,
 #endif
@@ -145,8 +162,7 @@ void HAL_I2C_Init(struct ifx_i2c *obj)

 int rt_hw_i2c_init(void)
 {
-    rt_err_t result;
-    cyhal_i2c_t mI2C;
+    rt_err_t result = RT_EOK;

     for (int i = 0; i < sizeof(i2c_config) / sizeof(i2c_config[0]); i++)
     {
@@ -157,18 +173,18 @@ int rt_hw_i2c_init(void)
         i2c_objs[i].mI2C_cfg.address = 0;
         i2c_objs[i].mI2C_cfg.frequencyhal_hz = (400000UL);

-        i2c_objs[i].mI2C = mI2C;
-
         i2c_objs[i].i2c_bus.ops = &i2c_ops;

         HAL_I2C_Init(&i2c_objs[i]);

         result = rt_i2c_bus_device_register(&i2c_objs[i].i2c_bus, i2c_config[i].name);
         RT_ASSERT(result == RT_EOK);
+
+        LOG_I("Hardware I2C device %s registered!", i2c_config[i].name);
     }

     return 0;
 }
 INIT_DEVICE_EXPORT(rt_hw_i2c_init);

-#endif /* defined(BSP_USING_I2C1) || defined(BSP_USING_I2C2) */
+#endif /* defined(RT_USING_I2C) */

4.1 修改硬件I2C1配置

首先,打开RT-Thread Settings的详细配置,切换到硬件标签页,关闭“Enable Software I2C Bus”配置项,如下图所示:

Untitled

接着,打开“Enable Hardware I2C Bus”配置项,再打开其中的“Enable I2C4 Bus (Arduino I2C)”配置项,如下图所示:

Untitled

完成修改后,按Ctrl+S保存配置。

4.2 编译、下载、运行

重新Ctrl+B编译,Ctrl+Alt+D下载,按RESET键复位之后,按RESET键重启系统,可以看到,硬件I2C驱动代码中添加的日志已经正常输出了。

Untitled

再次运行 list device ,可以看到:

Untitled

类似的,这次也可以读到温湿度值:

Untitled

把手放在传感器上,多读几次,也可以看到温度升高:

Untitled

说明我们修改的硬件I2C代码也可以正常工作了。

文章就到这里,感谢阅读,下次再会~

五、参考链接

  1. RTT PSoC开发板原理图:IFX-PSoC6-RT-Thread-sch.pdf (gitee.com)
  2. CY8C624A 芯片数据手册:Infineon-PSOC_6_MCU_CY8C62X8_CY8C62XA-DataSheet-v18_00-EN.pdf
  3. CY8C624A 架构参考手册: Infineon-PSoC_6_MCU_CY8C6xx8_CY8C6xxA_Architecture_Technical_Reference_Manual_(TRM)-AdditionalTechnicalInformation-v08_00-EN.pdf
  4. CY8C624A 寄存器参考手册: Infineon-PSoC_6_MCU_CY8C62x8_CY8C62xA_Registers_Technical_Reference_Manual-AdditionalTechnicalInformation-v06_00-EN.pdf
  5. Cypress HAL接口参考: Redirecting to Infineon GitHub (cypresssemiconductorco.github.io)
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 英飞凌
    +关注

    关注

    65

    文章

    1903

    浏览量

    136912
  • 单片机
    +关注

    关注

    6001

    文章

    43973

    浏览量

    620836
  • PSoC
    +关注

    关注

    12

    文章

    167

    浏览量

    91114
  • I2C
    I2C
    +关注

    关注

    28

    文章

    1346

    浏览量

    120816
  • 温湿度传感器

    关注

    5

    文章

    549

    浏览量

    35241
  • 开发板
    +关注

    关注

    25

    文章

    4429

    浏览量

    93993
  • RTT
    RTT
    +关注

    关注

    0

    文章

    63

    浏览量

    16882
  • RT-Thread
    +关注

    关注

    31

    文章

    1148

    浏览量

    38872
收藏 人收藏

    评论

    相关推荐

    新人发帖问关于i2c温湿度传感器SHT20在蓝牙协议栈的问题

    接引用了命令,原谅我基础不够,把代码一层一层看下去,后面看的不很明白,往下就是i2c接口的东西,看的似懂非懂的。 我自己的想法是自己通过换一个i2c
    发表于 11-28 22:51

    SHT30温湿度传感器的51程序

    SHT30温湿度传感器的51程序
    发表于 05-16 22:22

    ROC-RK3308-CC开发实例总结-SHT30温湿度模块调试

    sht30是盛世瑞恩出产的一款温湿度传感器,去年小米发布的一款温湿度测量笔用的也是这款传感器。关于这款
    发表于 01-05 16:13

    SHT21数字温湿度传感器

    型号:SHT21名称:数字温湿度传感器数据总线:I2C资料包括详细的
    发表于 02-08 10:59

    如何快速设计一款温湿度产品原型(MCU接入)

    三明治开发板温湿度传感套件主要包含:温湿度传感器功能,板载
    发表于 06-27 11:00

    【DFRobot TinkerNode NB-IoT 物联网开发板试用连载】通过I2C接口读取温湿度传感器

    `TinkerNode提供了一组I2C接口通过I2C接口可以完成设备参数获取。1、
    发表于 08-24 08:19

    怎样去使用基于AVR的SHT30温湿度传感器

    怎样去使用基于AVR的SHT30温湿度传感器SHT30温湿度传感器的软
    发表于 09-23 06:58

    【合宙Air820开发板试用体验】SHT30温湿度传感器

    SHT30我看了一下源码,I2C时序都给免了,我都没改啥,API获取数据,往服务里扔就完事了。--- 模块功能:
    发表于 12-30 22:42

    【1024平头哥开发套件开发体验】CB6201/W800开发板串口读取温湿度传感器SHT30数据

    本帖最后由 HonestQiao 于 2022-1-16 17:13 编辑 我们平时使用的SHT30温湿度传感器,一般都是I2C接口
    发表于 01-16 17:02

    如何使用STM32CubeMX配置STM32L431RCT6硬件I2C外设

    本篇详细的记录了如何使用STM32CubeMX配置STM32L431RCT6硬件I2C外设,读取SHT30温湿度
    发表于 02-09 07:08

    SHT30温湿度模块怎么使用

    的STH30一般是用IIC(I2C)通信使用的,所以我们打开一个IIC通道,IIC默认配置就可以了。4、因为我们需要看见她的效果是什么,我开了一个串口,所有数据通过串口打印出来。5、然后我们配置我的工程
    发表于 02-15 06:28

    【赛昉科技昉·星光RISC-V单板计算机试用体验】SHT3X温湿度计使用

    】使用硬件I2C读取温湿度传感器数据SHT30)读取数据
    发表于 06-05 10:04

    温湿度传感器SHT30参考代码资料

    温湿度传感器SHT30参考代码资料
    发表于 08-30 16:40 34次下载

    【STM32Cube_15】使用硬件I2C读取温湿度传感器数据SHT30

    本篇详细的记录了如何使用STM32CubeMX配置STM32L431RCT6的硬件I2C外设,读取SHT30温湿度传感器
    发表于 12-05 16:21 34次下载
    【STM32Cube_15】使用<b class='flag-5'>硬件</b><b class='flag-5'>I2C</b>读取<b class='flag-5'>温湿度</b><b class='flag-5'>传感器</b><b class='flag-5'>数据</b>(<b class='flag-5'>SHT30</b>)

    SHT30温湿度模块使用

    的STH30一般是用IIC(I2C)通信使用的,所以我们打开一个IIC通道,IIC默认配置就可以了。4、因为我们需要看见她的效果是什么,我开了一个串口,所有数据通过串口打印出来。5、然后我们配置我的工程6、打开我们的工程文件夹,
    发表于 12-16 16:53 71次下载
    <b class='flag-5'>SHT30</b><b class='flag-5'>温湿度</b>模块使用