Renesas R7FA8D1BH (Cortex®-M85)控制SHT20

news2024/9/21 14:45:38

目录

概述

1 硬件接口介绍

2 SHT20模块

2.1 SHT20简介

2.2 SHT-20模块电路

3 I2C接口实现

3.1 FSP配置I2C

3.2 I2C驱动程序实现

4 SHT20驱动程序

4.1 SHT20驱动代码结构

 4.2 源代码文件

5 测试

5.1 测试功能介绍

5.2 测试代码实现

5.3 运行代码


概述

本文主要介绍使用Renesas R7FA8D1BH (Cortex®-M85)控制SHT20的相关内容,包括SHT20的特性,使用FSP配置Renesas R7FA8D1BH的I2C接口,i2c驱动程序,还介绍了一个简单的应用案例:实时读取SHT20的温湿度数据,显示在OLED上。

1 硬件接口介绍

SHT2X与Renesas R7FA8D1BH通过I2C接口连接起来,其接口关系如下:

2 SHT20模块

2.1 SHT20简介

SHT20是由Sensirion公司推出的一款数字温湿度传感器。它采用先进的CMOSens®技术,具有高精度、低功耗和长期稳定性的特点。

SHT20的测量范围涵盖了-40℃至125℃的温度和0%至100%的湿度,精确度分别为±0.3℃和±3%RH。它使用了数字式输出接口,可以通过I2C总线进行数据通信,并支持温度和湿度的实时测量。

SHT20的封装形式小巧,尺寸为3x3x1.1mm,适合各种应用场景。它具有低功耗特性,工作电压范围为2.1V至3.6V,供电电流在典型条件下为1.2mA。此外,SHT20还具有快速响应时间和强大的抗干扰能力。

2.2 SHT-20模块电路

1)SHT20硬件接口图

2) sensor模块电路

 SHT-20实物图:

3 I2C接口实现

3.1 FSP配置I2C

1) 在Pins面板上配置I2C IO port

2) 创建Stack对象

3)配置Stack的参数

3.2 I2C驱动程序实现

使用FSP完成参数配置后,生成硬件相关的配置代码,接下来需要实现I2C相关的驱动接口

1)创建bsp_i2c.c文件,编写如下代码

 /*
 FILE NAME  :  bsp_i2c.c
 Description:  user i2c interface 
 Author     :  tangmingfei2013@126.com
 Date       :  2024/06/03
 */
#include "bsp_i2c.h" 
#include "hal_data.h"

#define TIME_OUT    10000
 
i2c_master_event_t g_i2c_callback_event;

void sci_b_i2c_master_callback (i2c_master_callback_args_t * p_args)
{
    if (NULL != p_args)
    {
        g_i2c_callback_event = p_args->event;
    }
}  

void i2c2_init_para( uint32_t const slaveAddress )
{
    fsp_err_t err;

    err = R_SCI_B_I2C_Open(&g_i2c0_ctrl, &g_i2c0_cfg);
    assert(FSP_SUCCESS == err);

    err = R_SCI_B_I2C_SlaveAddressSet(&g_i2c0_ctrl, slaveAddress, I2C_MASTER_ADDR_MODE_7BIT);
    assert(FSP_SUCCESS == err);
}

void i2c2_write_bytes(uint8_t *pbuff, uint16_t length )
{
    unsigned int timeout_ms = TIME_OUT;
    fsp_err_t err;
    
    err = R_SCI_B_I2C_Write(&g_i2c0_ctrl, pbuff, length, false);
    assert(FSP_SUCCESS == err);
    
    g_i2c_callback_event = I2C_MASTER_EVENT_ABORTED;
    /* Since there is nothing else to do, block until Callback triggers*/
    while ((I2C_MASTER_EVENT_TX_COMPLETE != g_i2c_callback_event) && timeout_ms)
    {
        R_BSP_SoftwareDelay(1U, BSP_DELAY_UNITS_MILLISECONDS);
        timeout_ms--;;
    }
}

void i2c2_read_bytes(uint8_t *pbuff, uint16_t length )
{
    unsigned int timeout_ms = TIME_OUT;
    fsp_err_t err;
    
    g_i2c_callback_event = I2C_MASTER_EVENT_ABORTED;
    err = R_SCI_B_I2C_Read(&g_i2c0_ctrl, pbuff, length, false);
    assert(FSP_SUCCESS == err);
    
    /* Since there is nothing else to do, block until Callback triggers*/
    while ((I2C_MASTER_EVENT_RX_COMPLETE != g_i2c_callback_event) && timeout_ms)
    {
        R_BSP_SoftwareDelay(1U, BSP_DELAY_UNITS_MILLISECONDS);
        timeout_ms--;;
    }
}
 
/* End of this file */

 

2)创建bsp_i2c.h文件,编写如下代码:

 /*
 FILE NAME  :  bsp_i2c.h
 Description:  user i2c interface 
 Author     :  tangmingfei2013@126.com
 Date       :  2024/06/03
 */
 #ifndef BSP_I2C_H
 #define BSP_I2C_H
 #include "hal_data.h"

void i2c2_init_para( uint32_t const slaveAddress );
void i2c2_write_bytes(uint8_t *pbuff, uint16_t length );
void i2c2_read_bytes(uint8_t *pbuff, uint16_t length );


#endif   /* BSP_I2C_H */

4 SHT20驱动程序

4.1 SHT20驱动代码结构

1)写寄存器函数

2)读寄存器函数

 

3)sensor初始化函数

4)获取温度值函数

 

5) 获取湿度值函数

 4.2 源代码文件

1)创建sht2x.c文件,编写如下代码

 /*
 FILE NAME  :  sht2x.c
 Description:  user sht20 interface 
 Author     :  tangmingfei2013@126.com
 Date       :  2024/06/03
 */
#include "hal_data.h"
#include "sht2x.h"

/******************************************************************************
* LOCAL MACROS AND DEFINITIONS
******************************************************************************/
#define SHT2X_ADDR           0x40
#define POLY                 0x131          //P(x)=x^8+x^5+x^4+1 = 100110001

#define DELAY_CNT            4500            //for N32G45, sleep time is 6.4 ms 

#define QUERY_TEMP_CMD       TRIG_T_MEASUREMENT_HM
#define QUERY_HUMIDY_CMD     TRIG_RH_MEASUREMENT_HM



static void msleep(unsigned int time)
{
    uint16_t i;
    for (i = 0; i < time; i++);
}

static int sht2xdrv_CheckCrc(unsigned char data[], unsigned char nbrOfBytes, unsigned char checksum)
{
    uint16_t res = 0;
    uint16_t crc = 0;
    uint16_t byteCtr;
    
    //calculates 8-Bit checksum with given polynomial
    for (byteCtr = 0; byteCtr < nbrOfBytes; ++byteCtr)
    {
      crc ^= (data[byteCtr]);
      for (uint8_t bit = 8; bit > 0; --bit)
      {
        if (crc & 0x80)
        {
          crc = (crc << 1) ^ POLY;
        }
        else
        {
          crc = (crc << 1);
        }
      }
    }

    if (crc != checksum)
    {
      res = 1;
    }

    return res;
}

static int sht2xdrv_CalcTemperatureC(int u16sT)
{
    int temperatureC;       // variable for result

    u16sT &= ~0x0003;           // clear bits [1..0] (status bits)

    /*
    * Formula T = -46.85 + 175.72 * ST / 2^16 from data sheet 6.2,
    * optimized for integer fixed point (3 digits) arithmetic
    */

    temperatureC = ((17572 * u16sT) >> 16) - 4685;

    return temperatureC;
}

static int sht2xdrv_CalcRH(int u16sRH)
{
    int humidityRH;       // variable for result

    u16sRH &= ~0x0003;          // clear bits [1..0] (status bits)

    /*
    * Formula RH = -6 + 125 * SRH / 2^16 from data sheet 6.1,
    * optimized for integer fixed point (3 digits) arithmetic
    */

    humidityRH = ((12500 * u16sRH) >> 16) - 600;

    return humidityRH;
}

static uint8_t write_reg( uint8_t *buff, uint8_t len )
{
    fsp_err_t err;
    
    err = R_SCI_B_I2C_SlaveAddressSet( &g_i2c0_ctrl, 
                                       SHT2X_ADDR, 
                                       I2C_MASTER_ADDR_MODE_7BIT);
    assert(FSP_SUCCESS == err);

    i2c2_write_bytes(buff, len);
    
    return 0;
}

static uint8_t read_regs(uint8_t reg,  uint8_t *buf, uint8_t len)
{
    fsp_err_t err;
    uint8_t msgs[2];

    err = R_SCI_B_I2C_SlaveAddressSet( &g_i2c0_ctrl, 
                                       SHT2X_ADDR, 
                                       I2C_MASTER_ADDR_MODE_7BIT);
    assert(FSP_SUCCESS == err);
    
    msgs[0] = reg;
    i2c2_write_bytes(msgs, 1);
    i2c2_read_bytes( buf, len);
    
    return 0;
}

int sht2x_softreset( void )
{
    int           ret = -1;
    unsigned char buf[2] = {0};
    unsigned char cmd = SOFT_RESET;
    
    buf[0] = cmd;
    ret = write_reg(buf, 1);
    if( ret < 0 )
    {
        printf("%s %s write softrest cmd to sht2x failure \n", __FILE__, __FUNCTION__);
        return -1;
    }

    msleep(50);

    return 0;
}

int sht2x_get_temperature( float *temper)
{
    unsigned char   buf[4] = {0}, checksum;
    int             ret = -1;
    int tempval;

    ret = read_regs(QUERY_TEMP_CMD, buf, 3);
    if( ret < 0 )
    {
        printf("get the temper failure.\n");
        return -1;
    }

    // match crc here
    checksum = buf[2];
    ret = sht2xdrv_CheckCrc(buf, 2, checksum);
    if( ret < 0 )
    {
        printf("match check sum error.\n");
        return -1;
    }

    tempval = (buf[0] << 8) | buf[1];
    *temper = (float)sht2xdrv_CalcTemperatureC( tempval );
  
    return 0;
}

int sht2x_get_humidy( float *humidy )
{
    unsigned char   buf[4] = {0}, checksum;
    int             ret = -1;
    int tempval;

    ret = read_regs(QUERY_HUMIDY_CMD, buf, 3);
    if( ret < 0 )
    {
        printf("get the humidy failure.\n");
        return -1;
    }

    // match crc here
    checksum = buf[2];
    ret = sht2xdrv_CheckCrc(buf, 2, checksum);
    if( ret < 0 )
    {
        printf("match check sum error.\n");
        return -1;
    }

    tempval = (buf[0] << 8) | buf[1];
    *humidy = (float)sht2xdrv_CalcRH( tempval );
  
    return 0;
}

void sht2x_Init( void )
{  
    fsp_err_t err;
    
    err = R_SCI_B_I2C_SlaveAddressSet( &g_i2c0_ctrl, 
                                       SHT2X_ADDR, 
                                       I2C_MASTER_ADDR_MODE_7BIT);
    assert(FSP_SUCCESS == err);
    sht2x_softreset();
}


2)创建sht2x.h文件,编写如下代码

 /*
 FILE NAME  :  sht2x.h
 Description:  user sht20 interface 
 Author     :  tangmingfei2013@126.com
 Date       :  2024/06/03
 */
#ifndef __SHT20_H
#define __SHT20_H

#ifdef __cplusplus
extern "C" {
#endif

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <errno.h>
#include <assert.h>
#include <string.h>
#include <time.h>

typedef enum sht2xOptErrorCode
{
    SHT2x_RES_I2C_ERR = 0X01,
}sht2xOptErrorCode;

/******************************************************************************
* EXPORTED MACROS AND DEFINITIONS
******************************************************************************/ 
typedef enum sht2xResolution_t
{
  SHT2x_RES_12_14BIT       = 0x00, // RH=12bit, T=14bit
  SHT2x_RES_8_12BIT        = 0x01, // RH= 8bit, T=12bit
  SHT2x_RES_10_13BIT       = 0x80, // RH=10bit, T=13bit
  SHT2x_RES_11_11BIT       = 0x81, // RH=11bit, T=11bit
  SHT2x_RES_MASK           = 0x81  // Mask for res. bits (7,0) in user reg.
} sht2xResolution_t;

typedef enum sht2xStatusCode {
  SHT2x_STATUS_OK                = 0x00,
  SHT2x_STATUS_VALID_DATA        = 0x01,
  SHT2x_STATUS_NO_CHANGE         = 0x02,
  SHT2x_STATUS_ABORTED           = 0x03,
  SHT2x_STATUS_BUSY              = 0x04,
  SHT2x_STATUS_SUSPEND           = 0x05,
  SHT2x_STATUS_ERR_IO            = 0x06,
  SHT2x_STATUS_ERR_BAD_DATA      = 0x07,
  SHT2x_STATUS_ERR_TIMEOUT       = 0x08
}sht2xStatusCode;

// sensor command
typedef enum{
  TRIG_T_MEASUREMENT_HM    = 0xE3, // command trig. temp meas. hold master
  TRIG_RH_MEASUREMENT_HM   = 0xE5, // command trig. humidity meas. hold master
  TRIG_T_MEASUREMENT_POLL  = 0xF3, // command trig. temp meas. no hold master
  TRIG_RH_MEASUREMENT_POLL = 0xF5, // command trig. humidity meas. no hold master
  USER_REG_W               = 0xE6, // command writing user register
  USER_REG_R               = 0xE7, // command reading user register
  SOFT_RESET               = 0xFE  // command soft reset
}sht2xCommand_t;

typedef enum {
  SHT2x_EOB_ON             = 0x40, // end of battery
  SHT2x_EOB_MASK           = 0x40, // Mask for EOB bit(6) in user reg.
} sht2xEob_t;

typedef enum {
  SHT2x_HEATER_ON          = 0x04, // heater on
  SHT2x_HEATER_OFF         = 0x00, // heater off
  SHT2x_HEATER_MASK        = 0x04, // Mask for Heater bit(2) in user reg.
} etSHT2xHeater;

// measurement signal selection
typedef enum{
  HUMIDITY,
  TEMP
}etSHT2xMeasureType;

typedef enum{
  I2C_ADR_W                = 128,   // sensor I2C address + write bit
  I2C_ADR_R                = 129    // sensor I2C address + read bit
}etI2cHeader;


typedef struct {
    unsigned char _step;
    unsigned char ret;
    
    unsigned char finish;     //1: finished, 0: idle
    unsigned char dataValid;  //1: valid, 0: invalid
    
    int _tryCnt;
    int _binValue;   // primordial value from sht20 register 
    int outValue;    // true temperature or humidity
} shtdrv;

typedef struct {
    shtdrv st_Temp;
    shtdrv st_RH;
    int errorCode;
}shtOpt;


void sht2x_Init( void );
int sht2x_get_humidy( float *humidy );
int sht2x_get_temperature( float *temper);

#ifdef __cplusplus
}
#endif

#endif /* __SHT20_H */

5 测试

5.1 测试功能介绍

1) 实时读取SHT2X的数据,并将数据转换为温度和湿度值

2)采样间隔为1 second

3) 在OLED上实时显示温度和湿度数据

5.2 测试代码实现

代码189行: 获取RTC时间值

代码190行:判断1s时间间隔

代码193行:获取湿度数据

代码194行:获取温度数据

代码198~209: 在OLED上实时显示温度和湿度数据

5.3 运行代码

测试环境如下:

 编译代码,并将代码下载到板卡中,其运行结果如下:

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2142802.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

ubuntu虚拟机装载共享文件夹导致的诡异错误

最近使用vmware station 15 安装了 ubuntu22.04 的虚拟机。在装载共享文件夹不久后便会出现诡异的错误。目前在网络上好像没有人把这归结到装载共享文件夹的问题上&#xff0c;故以供参考。 第一次&#xff1a; 在装载之后大概第二次开机&#xff0c;出现报错界面。 提示蓝牙…

C++二叉搜索树学习

目录 一、二叉搜索树概念 二、二叉搜索树的性能分析 三、二叉搜索树的构建 一、二叉搜索树概念 二叉搜索树又叫做二叉排序树&#xff0c;它可以是一颗空树&#xff0c;或者是具有以下性质的二叉树&#xff1a; 若该树的左子树不为空&#xff0c;那么左子树上的任一节点都小…

硬件工程师笔试面试——存储器件

目录 16、存储器件 16.1 基础 存储器件实物图 16.1.1 概念 16.1.2 常见的存储器件及其特点 16.2 相关问题 16.2.1 不同类型的存储器件在成本和性能上有哪些具体的差异 16.2.2 如何根据应用需求选择合适的存储器件? 16.2.3 存储器件的耐用性和可靠性是如何影响其在不同…

【Unity】 HTFramework框架(五十六)MarkdownText:支持运行时解析并显示Markdown文本

更新日期&#xff1a;2024年9月15日。 Github源码&#xff1a;[点我获取源码] Gitee源码&#xff1a;[点我获取源码] 索引 MarkdownText支持的Markdown语法标题强调文本表格嵌入图像超链接 使用MarkdownText设置项运行时属性解析使用ID模式嵌入图像 MarkdownText MarkdownText…

【算法思想·二叉搜索树】基操篇

本文参考labuladong算法笔记[二叉搜索树心法&#xff08;基操篇&#xff09; | labuladong 的算法笔记] 1、概述 我们前文 东哥带你刷二叉搜索树&#xff08;特性篇&#xff09; 介绍了 BST 的基本特性&#xff0c;还利用二叉搜索树「中序遍历有序」的特性来解决了几道题目&am…

OpenAI的o1模型与Transformer的无限潜力:数学证明推理算力无上限

近期&#xff0c;斯隆奖得主马腾宇和Google Brain推理团队创始人Denny Zhou合作&#xff0c;提出了一项引人注目的数学证明&#xff1a;只要思维链&#xff08;CoT&#xff09;足够长&#xff0c;Transformer就有能力解决各种复杂问题。这一发现引发了广泛关注&#xff0c;因为…

驱动器磁盘未格式化难题:深度剖析与恢复实践

驱动器磁盘未格式化的深层探索 在数据存储与管理的日常中&#xff0c;驱动器作为我们数字生活的基石&#xff0c;其稳定性直接关系到数据的安全与可用性。然而&#xff0c;当屏幕上赫然出现“驱动器中的磁盘未被格式化”的提示时&#xff0c;许多用户往往感到手足无措&#xf…

把设计模式用起来!(3)用不好模式?之时机不对

上一篇&#xff1a;《把设计模式用起来&#xff08;2&#xff09;——用不好&#xff1f;之实践不足》 本篇继续讲设计模式用不好的常见原因&#xff0c;这是第二个&#xff1a;使用设计模式的时机不对。 二、时机不对 这里说的时机并不是单纯指软件研发周期中的时间阶段&…

C++11新增特性:lambda表达式、function包装器、bind绑定

一、lambda表达式 1&#xff09;、为啥需要引入lambda&#xff1f; 在c98中&#xff0c;我们使用sort对一段自定义类型进行排序的时候&#xff0c;每次都需要传一个仿函数&#xff0c;即手写一个完整的类。甚至有时需要同时实现排升序和降序&#xff0c;就需要各自手写一个类&…

基于SSM的社区爱心捐赠管理系统

作者&#xff1a;计算机学姐 开发技术&#xff1a;SpringBoot、SSM、Vue、MySQL、JSP、ElementUI、Python、小程序等&#xff0c;“文末源码”。 专栏推荐&#xff1a;前后端分离项目源码、SpringBoot项目源码、SSM项目源码 系统展示 【2025最新】基于JavaSSMVueMySQL的社区爱…

任嘉伦新剧《流水迢迢》:卫昭多层人设引关注

近日&#xff0c;由晋江文学城同名小说改编的武侠古装爱情传奇剧《流水迢迢》即将开播&#xff0c;这部由任嘉伦主演的新剧&#xff0c;在原著和阵容的双双加持下热度直线上涨&#xff0c;宣传阶段就已备受网友期待&#xff0c;预约人数截止9月13日已达到206万&#xff0c;上升…

通信工程学习:什么是GPON吉比特无源光网络

GPON&#xff1a;吉比特无源光网络 GPON&#xff08;Gigabit-Capable Passive Optical Network&#xff0c;吉比特无源光网络&#xff09;是一种基于ITU-T G.984.x标准的最新一代宽带无源光综合接入技术。该技术以其高带宽、高效率、大覆盖范围和用户接口丰富等特点&#xff0c…

ubuntu服务器版NVIDIA驱动失效解决方案

ubuntu服务器版NVIDIA驱动失效解决方案 1. 问题描述2. 解决方法--卸载并重新安装最新版显卡驱动cudacudnn2.1 卸载显卡驱动2.2 重新安装最新版显卡驱动cudacudnn2.2.1 显卡驱动2.2.2 cuda2.2.3 cuda安装cudnn 1. 问题描述 在终端输入nvidia-smi&#xff0c;输出如下&#xff1…

Leetcode—移除元素

移除元素 题目描述 思路 思路&#xff1a;定义两个指针变量指向数组第一个位置&#xff0c;判断nums[scr]是否等于val case1:相等&#xff0c;scr; case2:不相等&#xff0c;nums[dst]nums[scr],scr,dst; 时间复杂度&#xff1a;O&#xff08;n&#xff09;&#xff1b;空间复杂…

微信支付开发-后台统计工厂实现

一、数据库设计图 二、后端统计工厂逻辑 1、统计父抽象类 a、StatisticsHandle.php 2、统计工厂通道类 a、StatisticsFactory.php 3、查询实现类 a、答题统计(Answer.php) 三、后端统计工厂代码实现 1、统计父抽象类(StatisticsHandle.php) <?php /*** 统计父抽象类* Use…

基于密码的大模型安全治理的思考

文章目录 前言一、大模型发展现状1.1 大模型技术的发展历程1.2 大模型技术的产业发展二、大模型安全政策与标准现状2.1 国外大模型安全政策与标准2.2 我国大模型安全政策与标准前言 随着大模型技术的迅速发展和广泛应用,其安全性问题日益凸显。密码学作为网络空间安全的核心技…

Linux搭建邮箱服务器(简易版)

本章是上一文档的简易版本搭建方式更为快速简洁&#xff08;只需要两条命令即可搭建&#xff09;&#xff0c;如果想了解更详细一些可以看我上一文档 Linux接发邮件mailx_linux mailx o365-CSDN博客文章浏览阅读857次&#xff0c;点赞25次&#xff0c;收藏19次。本文详细描述了…

计算机组成原理-3.1储存系统

现代结构 1.储存器的层次结构 辅存的数据要调入主存后才能被CUP&#xff0c;与操作系统的进程进行联动 运行速度&#xff1a;CPU>寄存器>Cache>主存>磁盘>磁盘和光盘 主存-辅存:实现了虚拟系统&#xff0c;解决了主存容量不够的问题。 Cache-主存&#xff1a…

二叉树的前中后序遍历(递归法)( 含leetcode上三道【前中后序】遍历题目)

文章目录 深入理解递归思想递归三要素 leetcode上三道题目&#xff1a;144.二叉树的前序遍历145.二叉树的后序遍历94.二叉树的中序遍历 深入理解递归思想 这次我们要好好谈一谈递归&#xff0c;为什么很多同学看递归算法都是“一看就会&#xff0c;一写就废”。 主要是对递归…

宝塔部署python项目

宝塔部署-python项目文章浏览阅读559次&#xff0c;点赞11次&#xff0c;收藏9次。在添加项目后&#xff0c;选择项目所在的路径&#xff0c;然后命令行启动主py文件。具体先看项目日志&#xff0c;根据日志在环境管理处下载包。首先下载项目需要的python版本。_宝塔部署python…