Renesas R7FA8D1BH (Cortex®-M85)控制SHT20

目录

概述

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.cDescription:  user i2c interface Author     :  tangmingfei2013@126.comDate       :  2024/06/03*/
#include "bsp_i2c.h" 
#include "hal_data.h"#define TIME_OUT    10000i2c_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.hDescription:  user i2c interface Author     :  tangmingfei2013@126.comDate       :  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.cDescription:  user sht20 interface Author     :  tangmingfei2013@126.comDate       :  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_HMstatic 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 polynomialfor (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 resultu16sT &= ~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 resultu16sRH &= ~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 herechecksum = 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 herechecksum = 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.hDescription:  user sht20 interface Author     :  tangmingfei2013@126.comDate       :  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=14bitSHT2x_RES_8_12BIT        = 0x01, // RH= 8bit, T=12bitSHT2x_RES_10_13BIT       = 0x80, // RH=10bit, T=13bitSHT2x_RES_11_11BIT       = 0x81, // RH=11bit, T=11bitSHT2x_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 masterTRIG_RH_MEASUREMENT_HM   = 0xE5, // command trig. humidity meas. hold masterTRIG_T_MEASUREMENT_POLL  = 0xF3, // command trig. temp meas. no hold masterTRIG_RH_MEASUREMENT_POLL = 0xF5, // command trig. humidity meas. no hold masterUSER_REG_W               = 0xE6, // command writing user registerUSER_REG_R               = 0xE7, // command reading user registerSOFT_RESET               = 0xFE  // command soft reset
}sht2xCommand_t;typedef enum {SHT2x_EOB_ON             = 0x40, // end of batterySHT2x_EOB_MASK           = 0x40, // Mask for EOB bit(6) in user reg.
} sht2xEob_t;typedef enum {SHT2x_HEATER_ON          = 0x04, // heater onSHT2x_HEATER_OFF         = 0x00, // heater offSHT2x_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 bitI2C_ADR_R                = 129    // sensor I2C address + read bit
}etI2cHeader;typedef struct {unsigned char _step;unsigned char ret;unsigned char finish;     //1: finished, 0: idleunsigned char dataValid;  //1: valid, 0: invalidint _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.rhkb.cn/news/425973.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

持续集成与持续交付CI/CD

CI/CD 是指持续集成&#xff08;Continuous Integration&#xff09;和持续部署&#xff08;Continuous Deployment&#xff09;或持续交付&#xff08;Continuous Delivery&#xff09; 持续集成&#xff08;Continuous Integration&#xff09; 持续集成是一种软件开发实践&…

BFS 解决边权为1的最短路问题

边权为1的最短路问题 最短路问题&#xff1a; 比如说从D->K&#xff0c;找出最短的那条&#xff0c;其中每条路都是有权值&#xff0c;此篇主要讲解的边权为1的最短路问题。 即边权都是一样的。 解法就是从起点开始&#xff0c;做一次BFS&#xff1a; 需要一个队列、一个…

Spring-IOC容器-ApplicationContext

IOC:Inversion of Control 控制反转&#xff0c;是一种设计原则&#xff0c;spring 中通过DI&#xff08;dependency Injection&#xff09;来具体实现。 比如原本对象的实例化&#xff0c;是通过程序主动New出来&#xff0c;IOC中的对象实例交给Spring框架来实例化&#xff0…

后台数据管理系统 - 项目架构设计-Vue3+axios+Element-plus(0917)

七、引入 element-ui 组件库 官方文档&#xff1a; https://element-plus.org/zh-CN/ 安装 $ pnpm add element-plus自动按需&#xff1a; 安装插件 pnpm add -D unplugin-vue-components unplugin-auto-import然后把下列代码插入到你的 Vite 或 Webpack 的配置文件中 ..…

maxcompute使用篇

文章目录 maxcompute使用篇1.mongoDB与maxcompute 进行数据同步1.1 基本类型的数据1.2部分复杂类型的数据 2.maxcompute中复杂数据类型解析2.1 get_json_object2.2 json_tuple2.3 处理json几种失效的情况:2.4 STR_TO_MAP、MAP_KEYS2.5 regexp_replace2.6 FROM_JSON2.7 nvl2.8 t…

【Hot100】LeetCode—51. N 皇后

目录 1- 思路题目识别回溯 2- 实现⭐51. N 皇后——题解思路 3- ACM 实现 原题链接&#xff1a;51. N 皇后 1- 思路 题目识别 识别1 &#xff1a;给定一个整数 n &#xff0c;求解如何放置棋子的问题。 回溯 回溯三部曲 1- 回溯参数和返回值 传参 cheeseBoard、n、row 传递…

C语言:刷题日志(1)

一.阶乘计算升级版 本题要求实现一个打印非负整数阶乘的函数。 其中n是用户传入的参数&#xff0c;其值不超过1000。如果n是非负整数&#xff0c;则该函数必须在一行中打印出n!的值&#xff0c;否则打印“Invalid input”。 首先&#xff0c;知道阶乘是所有小于及等于该数的…

Solidity优质例子(一)食品溯源智能合约

这个智能合约FoodInfoItem的功能是管理食品的追溯信息&#xff0c;包括食品在不同阶段的流转、质量记录、消费者评分等。它通过区块链记录食品的生产、分销和销售过程&#xff0c;确保每一环节的透明和不可篡改性。 实际生活中的用途&#xff1a; 食品安全和质量控制&#xff1…

实时数仓3.0DWD层

实时数仓3.0DWD层 DWD层设计要点&#xff1a;9.1 流量域未经加工的事务事实表9.1.1 主要任务9.1.2 思路9.1.3 图解9.1.4 代码 9.2 流量域独立访客事务事实表9.2.1 主要任务9.2.2 思路分析9.2.3 图解9.2.4 代码 9.3 流量域用户跳出事务事实表9.3.1 主要任务9.3.2 思路分析9.3.3 …

速通汇编(五)认识段地址与偏移地址,CS、IP寄存器和jmp指令,DS寄存器

一&#xff0c;地址的概念 通常所说的地址指的是某内存单元在整个机器内存中的物理地址&#xff0c;把整个机器内存比作一个酒店&#xff0c;内存单元就是这个酒店的各个房间&#xff0c;给这些房间编的门牌号&#xff0c;类比回来就是内存单元的物理地址 在第一篇介绍debug的…

替换 Oracle ,江河信息用 TDengine 解决高基数查询写入问题

在数字经济快速发展的背景下&#xff0c;智慧水利作为重要的基础设施之一&#xff0c;正逐步成为提升水资源管理效率、优化生态环境的重要力量。江西省水投江河信息技术有限公司&#xff08;以下简称“江河信息”&#xff09;作为高新技术国有企业&#xff0c;坚定致力于打造数…

【 html+css 绚丽Loading 】 000052 璇玑转轮

前言&#xff1a;哈喽&#xff0c;大家好&#xff0c;今天给大家分享今天给大家分享一篇文章&#xff01;并提供具体代码帮助大家深入理解&#xff0c;彻底掌握&#xff01;创作不易&#xff0c;如果能帮助到大家或者给大家一些灵感和启发&#xff0c;欢迎收藏关注哦 &#x1f…

Golang | Leetcode Golang题解之第404题左叶子之和

题目&#xff1a; 题解&#xff1a; func isLeafNode(node *TreeNode) bool {return node.Left nil && node.Right nil }func sumOfLeftLeaves(root *TreeNode) (ans int) {if root nil {return}q : []*TreeNode{root}for len(q) > 0 {node : q[0]q q[1:]if no…

springbootadmin源码编译修改001_node版本管理工具nvm_任意切换node版本_没有成功记录过程---VUE工作笔记0026

由于项目需要对springbootadmin的源码进行编译和修改. 但是springbootadmin的源码编译很麻烦,主要是由于,springbootadmin-server-ui这个项目,因为他是一个前后端分离的 vue项目,而且是使用 https://github.com/coreybutler/nvm-windows/releases/tag/1.1.12 首先去下载,发…

无人机培训机构技术股份合作探讨

随着无人机技术的飞速发展&#xff0c;其在航拍、农业、物流、环境监测、应急救援等多个领域展现出巨大潜力&#xff0c;市场对无人机专业人才的需求急剧增加。鉴于此&#xff0c;多家致力于无人机培训教育的机构决定携手合作&#xff0c;通过技术股份合作模式&#xff0c;共同…

C++二叉搜索树学习

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

【Google Chrome Windows 64 version及 WebDriver 版本】

最近升级到最新版本Chrome后发现页面居然显示错乱实在无语, 打算退回原来的版本, 又发现官方只提供最新的版本下载, 为了解决这个问题所有收集了Chrome历史版本的下载地址分享给大家. Google Chrome Windows version 64 位 VersionSize下载地址Date104.0.5112.10282.76 MBhtt…

【HTML】元素的分类(块元素、行内元素、行内块元素)

元素的分类 块元素行内元素行内块元素转换 块元素 独占一行&#xff0c;宽度默认为容器的100%&#xff0c;可以设置宽、高、行高、内外边距&#xff1b;布局时&#xff0c;块元素可以包含块元素和行内元素 <div>div</div><p>p</p><h3>h1-h6</…

C++——内存管理

目录 引言 C/C的内存分布 C语言中动态内存管理方式 C内存管理方式 1.new/delete操作内置类型 2.new与delete操作自定义类型 operator new与operator delete函数 new与delete的实现 1.内置类型 2.自定义类型 定位new表达式 malloc/free和new/delete的区别 结束语 引…

关于Spring Cloud Gateway中 Filters的理解

Spring Cloud Gateway中 Filters的理解 Filters Filters拦截器的作用是&#xff0c;对请求进行处理 可以进行流量染色 ⭐增加请求头 例子 spring:cloud:gateway:routes:- id: add_request_header_routeuri: http://localhost:8123predicates:- Path/api/**filters:- AddR…