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

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

3天内不再提示

基于单片机的I2C接口SHT20传感器采样设计

CHANBAEK 来源:凌云物联网实验室 作者:郭工 2022-12-19 09:23 次阅读

7.1 原理图分析

查看EK-RA6M4的原理图,如下图所示,该开发板上的MikroBus接口上有提供一个I2C接口。

图片

根据原理图可知,I2C1接口的两个引脚分别为:

按键 SDA1 SCL1
引脚 P511 P512

这里我们将在该I2C接口上连接 SHT20 传感器(3.3V供电),实时采样当前环境的温湿度情况。

7.2 I2C接口配置

首先,在FSP配置中将I2C1所用的两个GPIO口配置成I2C模式。

图片

接着选择 Stacks ,点击 "New Stack" -> "Connectivity" -> "I2C Master(r_iic_master)" 添加I2C Master协议栈。

图片

接下来设置I2C Master的相关配置,并重新生成代码。

图片

  • 通过 Name 字段可以修改I2C的设备名称为 g_i2c1_master,它将在IDE自动生成的文件 ra_gen/hal_data.c/h 中定义I2C操作相关的变量;
  • 通过 Channel 字段可以修改I2C的通道号,这里设置为1,下面的 Pins 将自动选择 P511和 P512 这个引脚;
  • 通过 Slava Address 字段可以设置I2C从设备的地址,其中SHT20 的从设备地址为 0x40;
  • 通过 Callback 字段设置I2C收发的中断回调函数,它将配置在 g_i2c1_master_cfg 变量中,该函数需要我们自己实现;
  • 在这里我们也可以修改I2C中断的优先级为2级别;

7.3 源码修改

创建SHT20温湿度传感器操作相关的头文件 src/bsp_sht20.h 如下:

#ifndef BSP_SHT20_H_
#define BSP_SHT20_H_

#include 

int sht20_init(void);

void sht20_deinit(void);

int sht20_read_data(double *temp, double *rh);

#endif /* BSP_SHT20_H_ */

创建SHT20温湿度传感器操作相关的c文件 src/bsp_sht20.c 如下:

#include 
#include "hal_data.h"
#include "bsp_sht20.h"
#include "r_i2c_master_api.h"

#define RESET_VALUE         0x00

static int i2c_write(uint8_t *data, uint32_t bytes, bool const restart);
static int i2c_read(uint8_t *buf, uint32_t size, bool const restart);

int sht20_init(void)
{
    fsp_err_t err     = FSP_SUCCESS;

    /* Open I2C master */
    err = R_IIC_MASTER_Open(&g_i2c1_master_ctrl, &g_i2c1_master_cfg);
    if (FSP_SUCCESS != err)
    {
        printf("** R_IIC_MASTER_Open API failed ** 
");
        return err;
    }

#if 0
    /* SHT20 sensor soft reset */
    uint8_t           buf[1] = 0xfe;
    err = i2c_write(buf, 1, true);
    if (FSP_SUCCESS != err)
    {
        printf("** SHT20 sensor soft reset failed ** 
");
        return err;
    }

    R_BSP_SoftwareDelay(50, BSP_DELAY_UNITS_MILLISECONDS);
#endif

    return 0;
}

void sht20_deinit(void)
{
    R_IIC_MASTER_Close (&g_i2c1_master_ctrl);
    return ;
}

int sht20_read_data(double *temp, double *rh)
{
    fsp_err_t err     = FSP_SUCCESS;
    uint8_t           buf[4];

    /* send trigger temperature measure command and read the data */
    buf[0]=0xF3;
    err = i2c_write(buf, 1, true);
    if (FSP_SUCCESS != err)
    {
        printf("** SHT20 send trigger temperature measure command failed ** 
");
        return err;
    }

    /* datasheet: typ=66, max=85 */
    R_BSP_SoftwareDelay(85, BSP_DELAY_UNITS_MILLISECONDS);

    /* read temperature measure data */
    memset(buf, 0, sizeof(buf) );
    err = i2c_read(buf, 3, false);
    if (FSP_SUCCESS != err)
    {
        printf("** SHT20 read ID from Location 1 failed ** 
");
        return err;
    }
    *temp = 175.72 * (((((int) buf[0]) << 8) + buf[1]) / 65536.0) - 46.85;

    /* send trigger humidity measure command and read the data */
    buf[0] = 0xF5;
    err = i2c_write(buf, 1, true);
    if (FSP_SUCCESS != err)
    {
        printf("** SHT20 send trigger humidity measure command failed ** 
");
        return err;
    }

    /* datasheet: typ=22, max=29 */
    R_BSP_SoftwareDelay(29, BSP_DELAY_UNITS_MILLISECONDS);

    /* read humidity measure data */
    memset(buf, 0, sizeof(buf) );
    err = i2c_read(buf, 3, false);
    if (FSP_SUCCESS != err)
    {
        printf("** SHT20 read ID from Location 1 failed ** 
");
        return err;
    }
    *rh = 125 * (((((int) buf[0]) << 8) + buf[1]) / 65536.0) - 6;

    return 0;
}


/* Reading I2C call back event through i2c_Master callback */
static volatile i2c_master_event_t i2c_event = I2C_MASTER_EVENT_ABORTED;

void i2c1_master_callback(i2c_master_callback_args_t *p_args)
{
    if (NULL != p_args)
    {
        /* capture callback event for validating the i2c transfer event*/
        i2c_event = p_args->event;
    }
}
static fsp_err_t validate_i2c_event(void)
{
    uint16_t local_time_out = UINT16_MAX;

    /* resetting call back event capture variable */
    i2c_event = (i2c_master_event_t)RESET_VALUE;

    do
    {
        /* This is to avoid infinite loop */
        --local_time_out;

        if(RESET_VALUE == local_time_out)
        {
            return FSP_ERR_TRANSFER_ABORTED;
        }

    }while(i2c_event == RESET_VALUE);

    if(i2c_event != I2C_MASTER_EVENT_ABORTED)
    {
        i2c_event = (i2c_master_event_t)RESET_VALUE;  // Make sure this is always Reset before return
        return FSP_SUCCESS;
    }

    i2c_event = (i2c_master_event_t)RESET_VALUE; // Make sure this is always Reset before return
    return FSP_ERR_TRANSFER_ABORTED;
}

static int i2c_write(uint8_t *data, uint32_t bytes, bool const restart)
{
    fsp_err_t err     = FSP_SUCCESS;

    if( !data || bytes<=0 )
        return FSP_ERR_INVALID_ARGUMENT;

    err = R_IIC_MASTER_Write(&g_i2c1_master_ctrl, data, bytes, restart);
    if (FSP_SUCCESS != err)
    {
        printf("** R_IIC_MASTER_Write API failed ** 
");
        return err;
    }

    err = validate_i2c_event();
    if (FSP_SUCCESS != err)
    {
        printf("** I2C write validate failed, err=%d ** 
", err);
        return err;
    }

    return FSP_SUCCESS;
}

static int i2c_read(uint8_t *buf, uint32_t size, bool const restart)
{
    fsp_err_t err     = FSP_SUCCESS;

    if( !buf || size<=0 )
        return FSP_ERR_INVALID_ARGUMENT;

    err = R_IIC_MASTER_Read(&g_i2c1_master_ctrl, buf, size, restart);
    if (FSP_SUCCESS != err)
    {
        printf("** R_IIC_MASTER_Write API failed ** 
");
        return err;
    }

    err = validate_i2c_event();
    if (FSP_SUCCESS != err)
    {
        printf("** I2C read validate failed, err=%d ** 
", err);
        return err;
    }

    return FSP_SUCCESS;
}

修改 src/hal_entry.c 源文件,在里面添加 sht20 温湿度传感器采样的代码。

... ...
#include "bsp_sht20.h"
... ...
void hal_entry(void)
{
    double      temp = 0.0;
    double      rh = 0.0;    
    ... ...
    sht20_init();
    while (1)
    {
        ... ...
        sht20_read_data(&temp, &rh);
        printf("temp: %.3f  RH: %.3f
", temp, rh);        
    }
}

7.4 编译运行

代码修改完成后,在开发板上编译运行。

图片

这时串口终端上将会实时打印SHT20传感器采样的温湿度。

图片

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 传感器
    +关注

    关注

    2518

    文章

    47911

    浏览量

    739473
  • 单片机
    +关注

    关注

    5996

    文章

    43941

    浏览量

    620336
  • 接口
    +关注

    关注

    33

    文章

    7603

    浏览量

    148355
  • I2C
    I2C
    +关注

    关注

    28

    文章

    1343

    浏览量

    120711
收藏 人收藏

    评论

    相关推荐

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

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

    使用PSOC I2C获取SHT20温湿度

    本帖最后由 724807280 于 2016-3-31 13:28 编辑 在做一个项目时用到了一个温湿度传感器SHT20,这颗芯片有着非常高的精度0.3%,业界普遍认同它。因为之前单片机开发
    发表于 03-31 13:25

    【OneNET麒麟座试用体验】7.温湿度传感器SHT20的使用

    `SHT20是一种支持IIC协议的数字温湿度传感器。 能测量的温度范围是-20~100度,湿度范围是5%~90% 既然它是一个IIC协议期间,那么肯定符合IIC协议。IIC协议中,SHT2
    发表于 04-01 12:51

    【OneNET麒麟座试用体验】3.OneNET之HAL i2c的使用(SHT20温湿度测量)

    与原理这次主要使用STM32F103的HAL 库i2c来进行外设的操作,EEPROM AT24C02,温湿度传感器SHT20。AT24C02
    发表于 04-19 18:37

    基于I2C总线的CMOS图像传感器接口电路设计

    分辨率的图像,并接受多种规格的液晶显示,取景速度达到 30 帧/s。 根据上述功能要求将 CMOS 图像传感器接口划分为三个模块:主 I2C 总线
    发表于 11-30 11:27

    基于I2C控制总线的CMOS图像传感器接口电路

    ,并接受多种规格的液晶显示,取景速度达到 30 帧/s。   根据上述功能要求将 CMOS 图像传感器接口划分为三个模块:主 I2C 总线接口
    发表于 04-11 07:00

    如何利用软件模拟I2C读写SHT20温湿度传感器

    下面利用软件模拟I2C读写SHT20温湿度传感器。一、SHT20通讯定义(1)设备I2C地址:0x40;(
    发表于 11-24 07:12

    i2c总线接口设备地址0x40读取温度原理

    sht20主要是i2c总线接口设备地址0x40读取温度原理:读取0xe3寄存地址两个字节读取温度原理:读取0xe5寄存地址两个字节以下是
    发表于 12-17 08:29

    怎样去设计一种基于SHT20的云上OneNET智慧大棚呢

    SHT20温湿度传感器是什么?怎样去设计一种基于SHT20的云上OneNET智慧大棚呢?
    发表于 01-26 07:23

    【昉·星光 2 高性能RISC-V单板计算机体验】I2C调试记录

    的设备,这个40就是我们的SHT20温湿度传感器的地址。 然后我们需要下载gcc工具,通过gcc工具编译出我们需要的测试文件。 上面就是我们编译和执行的效果,其程序功能也是比较简单的。我们简单看下
    发表于 08-03 20:39

    使用STM32F030单片机读取温湿度传感器SHT20的C语言源代码免费下载

    本文档的主要内容详细介绍的是使用STM32F030单片机读取温湿度传感器SHT20的C语言源代码免费下载。
    发表于 06-10 17:07 115次下载
    使用STM32F030<b class='flag-5'>单片机</b>读取温湿度<b class='flag-5'>传感器</b><b class='flag-5'>SHT20</b>的C语言源代码免费下载

    dfrobotSHT20 I2C防水型温湿传感器简介

    SHT20 I2C防水型温湿传感器,采用新一代Sensirion湿度和温度传感器,配有4代CMOSens®芯片。除了配有电容式相对湿度传感器
    的头像 发表于 01-03 09:43 2678次阅读
    dfrobotSHT<b class='flag-5'>20</b> <b class='flag-5'>I2C</b>防水型温湿<b class='flag-5'>传感器</b>简介

    SHT20温湿度传感器的数据手册免费下载

    SHT20, 新一代 Sensirion 湿度和温度传感器在尺寸与智能方面建立了新的标准:它嵌入了适于回流焊的双列扁平无引脚 DFN 封装, 底面 3 x 3mm ,高度 1.1mm。传感器输出经过
    发表于 04-26 08:00 70次下载
    <b class='flag-5'>SHT20</b>温湿度<b class='flag-5'>传感器</b>的数据手册免费下载

    I2C协议之软件模拟(二)-- 实际应用之SHT20

    下面利用软件模拟I2C读写SHT20温湿度传感器。一、SHT20通讯定义(1)设备I2C地址:0x40;(2)命令:测量温度和湿度都有两种模
    发表于 11-15 20:06 25次下载
    <b class='flag-5'>I2C</b>协议之软件模拟(二)-- 实际应用之<b class='flag-5'>SHT20</b>

    sht20校验对读出的温度偏高

    SHT20是一种常用的温湿度传感器,其精度和稳定性得到了广泛应用。但是,有时候在使用SHT20传感器时,可能会遇到温度读数偏高的问题,这给用户带来了困惑和困扰。本文将详细分析
    的头像 发表于 01-04 11:01 466次阅读