Renesa Version Board开发RT-Thread 之I2C驱动应用(SHT20)

目录

概述

1 硬件接口介绍

1.1  Version Board上的I2C硬件接口

1.2 SHT20

1.2.1 SHT20简介

1.2.2 SHT-20模块电路

2  软件实现

2.1 软件版本信息

2.2 RT-Thread Studio创建项目

2.3  FSP配置I2C接口

2.4 使能Sensor驱动

3 RT-Thread驱动架构

3.1 接口函数

3.1.1 查找设备函数

3.1.2 数据传输函数

3.3 驱动Demo

4 系统测试

4.1 硬件环境

4.2 软件测试方法介绍

4.2.1 探测传感器

4.2.2 读取数据

4.3 板卡级测试

4.3.1 准备测试环境

 4.3.2 测试


概述

本文主要介绍如何使用Renesa Version Board上的I2C接口在RT -Thread框架下功能的应用。笔者基于SHT-Sensor详细介绍了配置的方法。还介绍了RT -Thread框架下I2C驱动的接口函数。

1 硬件接口介绍

1.1  Version Board上的I2C硬件接口

Renesa Version Board板卡扩展口提供一个标准的I2C接口,其命名如下:

在如下网址能看见该IO所对应的Pin引脚:

https://www.rt-thread.org/document/site/#/rt-thread-version/rt-thread-standard/hw-board/ra8d1-vision-board/ra8d1-vision-board

1.2 SHT20

1.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还具有快速响应时间和强大的抗干扰能力。

1.2.2 SHT-20模块电路

1)SHT20硬件接口图

2) sensor模块电路

 SHT-20实物图:

2  软件实现

2.1 软件版本信息

软硬件信息版本信息
Renesas MCUR7FA8D1BH
RT-Thread Studio2.2.7
FSP 版本5.1.0
调试工具:DAP-linkART-Link CMSIS-DAP: V2.0.0

2.2 RT-Thread Studio创建项目

打开RT-Thread Studio,File->RT-Thread Project,打开之后看见如下页面,输入项目名称,创建项目。

2.3  FSP配置I2C接口

1)选择SCI3接口,配置为I2C模式,该接口对应的IO口为P408和P409

 2)在Stacks面板上配置驱动的相关信息

完成以上两个步骤之后,就可以重新生成项目代码。 

3) RT-Thread Studio打开驱动接口,配置完成后,使用Ctrl+S保存文件。

2.4 使能Sensor驱动

打开RT-Thread Setting,搜索sht2,找到该驱动后使能该驱动。

在项目目录中,packages中已经加载该驱动程序。 

 

3 RT-Thread驱动架构

3.1 接口函数

一般来说,MCU的I2C设备作为主从设备进行通信。在RT-Thread中,I2C主机被虚拟化为I2C总线设备。I2C从站通过I2C设备接口与I2C总线通信。相关接口如下:

FunctionDescription
rt_device_find()Find device handles based on I2C bus device name
rt_i2c_transfer()transfer data

3.1.1 查找设备函数

在使用I2C总线设备之前,需要根据I2C总线设备名称获取设备句柄,以便对I2C总线设备进行操作。设备功能如下:

rt_device_t rt_device_find(const char* name);
ParameterDescription
nameI2C bus device name
Return Value——
device handleFinding the corresponding device will return the corresponding device handle
RT_NULLNo corresponding device object found

举个例子:

注册到系统的I2C设备名称为i2co2、i2c1等。使用示例如下: 

#define AHT10_I2C_BUS_NAME      "i2c1"  /* Sensor connected I2C bus device name */
struct rt_i2c_bus_device *i2c_bus;      /* I2C bus device handle *//* Find the I2C bus device and get the I2C bus device handle */
i2c_bus = (struct rt_i2c_bus_device *)rt_device_find(name);

3.1.2 数据传输函数

可以通过获取I2C总线设备句柄来使用' rt_i2c_transfer() '进行数据传输。函数原型如下:

rt_size_t rt_i2c_transfer(struct rt_i2c_bus_device *bus,struct rt_i2c_msg         msgs[],rt_uint32_t               num);
ParameterDescription
busI2C bus device handle
msgs[]Message array pointer to be transmitted
numThe number of elements in the message array
Return Value——
the number of elements in the message arraysucceeded
error codefailed

 一个应用实例:

 Message结构体定义

struct rt_i2c_msg
{rt_uint16_t addr;    /* Slave address */rt_uint16_t flags;   /* Reading, writing signs, etc. */rt_uint16_t len;     /* Read and write data bytes */rt_uint8_t  *buf;    /* Read and write data buffer pointer */
}

 读数据函数实现

/* Read sensor register data */
static rt_err_t read_regs(struct rt_i2c_bus_device *bus, rt_uint8_t len, rt_uint8_t *buf)
{struct rt_i2c_msg msgs;msgs.addr = AHT10_ADDR;     /* Slave address */msgs.flags = RT_I2C_RD;     /* Read flag */msgs.buf = buf;             /* Read and write data buffer pointer */msgs.len = len;             /* Read and write data bytes *//* Call the I2C device interface to transfer data */if (rt_i2c_transfer(bus, &msgs, 1) == 1){return RT_EOK;}else{return -RT_ERROR;}
}

3.3 驱动Demo

RT-Thread提供了一个Demo,其详细代码如下:

/** Program listing: This is an I2C device usage routine* The routine exports the i2c_aht10_sample command to the control terminal* Command call format: i2c_aht10_sample i2c1* Command explanation: The second parameter of the command is the name of the I2C bus device to be used. If it is empty, the default I2C bus device is used.* Program function: read the temperature and humidity data of the aht10 sensor and print.
*/#include <rtthread.h>
#include <rtdevice.h>#define AHT10_I2C_BUS_NAME          "i2c1"  /* Sensor connected I2C bus device name */
#define AHT10_ADDR                  0x38    /* Slave address */
#define AHT10_CALIBRATION_CMD       0xE1    /* Calibration command */
#define AHT10_NORMAL_CMD            0xA8    /* General command */
#define AHT10_GET_DATA              0xAC    /* Get data command */static struct rt_i2c_bus_device *i2c_bus = RT_NULL;     /* I2C bus device handle */
static rt_bool_t initialized = RT_FALSE;                /* Sensor initialization status *//* Write sensor register */
static rt_err_t write_reg(struct rt_i2c_bus_device *bus, rt_uint8_t reg, rt_uint8_t *data)
{rt_uint8_t buf[3];struct rt_i2c_msg msgs;buf[0] = reg; //cmdbuf[1] = data[0];buf[2] = data[1];msgs.addr = AHT10_ADDR;msgs.flags = RT_I2C_WR;msgs.buf = buf;msgs.len = 3;/* Call the I2C device interface to transfer data */if (rt_i2c_transfer(bus, &msgs, 1) == 1){return RT_EOK;}else{return -RT_ERROR;}
}/* Read sensor register data */
static rt_err_t read_regs(struct rt_i2c_bus_device *bus, rt_uint8_t len, rt_uint8_t *buf)
{struct rt_i2c_msg msgs;msgs.addr = AHT10_ADDR;msgs.flags = RT_I2C_RD;msgs.buf = buf;msgs.len = len;/* Call the I2C device interface to transfer data */if (rt_i2c_transfer(bus, &msgs, 1) == 1){return RT_EOK;}else{return -RT_ERROR;}
}static void read_temp_humi(float *cur_temp, float *cur_humi)
{rt_uint8_t temp[6];write_reg(i2c_bus, AHT10_GET_DATA, 0);      /* send command */rt_thread_mdelay(400);read_regs(i2c_bus, 6, temp);                /* obtian sensor data *//* Humidity data conversion */*cur_humi = (temp[1] << 12 | temp[2] << 4 | (temp[3] & 0xf0) >> 4) * 100.0 / (1 << 20);/* Temperature data conversion */*cur_temp = ((temp[3] & 0xf) << 16 | temp[4] << 8 | temp[5]) * 200.0 / (1 << 20) - 50;
}static void aht10_init(const char *name)
{rt_uint8_t temp[2] = {0, 0};/* Find the I2C bus device and get the I2C bus device handle */i2c_bus = (struct rt_i2c_bus_device *)rt_device_find(name);if (i2c_bus == RT_NULL){rt_kprintf("can't find %s device!\n", name);}else{write_reg(i2c_bus, AHT10_NORMAL_CMD, temp);rt_thread_mdelay(400);temp[0] = 0x08;temp[1] = 0x00;write_reg(i2c_bus, AHT10_CALIBRATION_CMD, temp);rt_thread_mdelay(400);initialized = RT_TRUE;}
}static void i2c_aht10_sample(int argc, char *argv[])
{float humidity, temperature;char name[RT_NAME_MAX];humidity = 0.0;temperature = 0.0;if (argc == 2){rt_strncpy(name, argv[1], RT_NAME_MAX);}else{rt_strncpy(name, AHT10_I2C_BUS_NAME, RT_NAME_MAX);}if (!initialized){/* Sensor initialization */aht10_init(name);}if (initialized){/* Read temperature and humidity data */read_temp_humi(&temperature, &humidity);rt_kprintf("read aht10 sensor humidity   : %d.%d %%\n", (int)humidity, (int)(humidity * 10) % 10);rt_kprintf("read aht10 sensor temperature: %d.%d \n", (int)temperature, (int)(temperature * 10) % 10);}else{rt_kprintf("initialize sensor failed!\n");}
}
/* Export to the msh command list */
MSH_CMD_EXPORT(i2c_aht10_sample, i2c aht10 sample);

4 系统测试

4.1 硬件环境

将SHT20的电源和通信接口与Version Board连接起来,其连接图如下:

硬件实物图如下:

4.2 软件测试方法介绍

 RT-Thread已经提供了SHT20相关的测试命令,其具体测试方法如下:

4.2.1 探测传感器

sht2x 软件包提供了丰富的测试命令,项目只要在 RT-Thread 上开启 Finsh/MSH 功能即可。在做一些基于 sht2x 的应用开发、调试时,这些命令会非常实用,它可以准确的读取指传感器测量的温度与湿度。具体功能可以输入 sht20 ,可以查看完整的命令列表:

msh /> sht20
Usage:
sht20 probe <dev_name>   - probe sensor by given name
sht20 read                           - read sensor sht20 data
msh />

具体方法如下:

msh />sht20 probe i2c1      #探测成功,没有错误日志
msh />
msh />sht20 probe i2c88     #探测失败,提示对应的 I2C 设备找不到
[E/sht20] can't find sht20 device on 'i2c88'
msh />

4.2.2 读取数据

探测成功之后,输入 sht20 read 即可获取温度与湿度,包括提示信息,日志如下:

msh />sht20 read
read sht20 sensor humidity   : 54.7 %
read sht20 sensor temperature: 27.3 
msh />

4.3 板卡级测试

4.3.1 准备测试环境

1)使用Ctrl+B组合键,编译项目代码,如下编译成功,可以看见如下log:

2)下载代码到板卡中

3)打开串口终端工具,如果代码能正常工作,可以看见如下log:

 

 4.3.2 测试

1)查询I2C驱动接口信息,使用如下命令:

list device

2)检测SHT20在线状态

探测失败状态:

sht20 probe sci3i

 探测成功状态:

sht20 probe sci3i

改变环境温度,观察传感器温湿度的变化情况:

 

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

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

相关文章

增量学习中Task incremental、Domain incremental、Class incremental 三种学习模式的概念及代表性数据集?

1 概念 在持续学习领域&#xff0c;Task incremental、Domain incremental、Class incremental 是三种主要的学习模式&#xff0c;它们分别关注不同类型的任务序列和数据分布变化。 1.1 Task Incremental Learning (Task-incremental) 任务增量学习&#xff0c;也称为任务增…

spring 中包自动扫描之 component-scan 解析

在 spring 中&#xff0c;为简化 bean 的配置&#xff0c;在 spring-context 模块下提供了包的自动扫描功能&#xff0c;将配置的包及其子包下的所有符合条件的类都注册到 BeanFactory 中。下面来看下具体是怎么实现的。 配置 <context:component-scan base-package"…

.NET 一款获取主流浏览器存储密码的工具

01阅读须知 此文所提供的信息只为网络安全人员对自己所负责的网站、服务器等&#xff08;包括但不限于&#xff09;进行检测或维护参考&#xff0c;未经授权请勿利用文章中的技术资料对任何计算机系统进行入侵操作。利用此文所提供的信息而造成的直接或间接后果和损失&#xf…

27.jdk源码阅读之ConcurrentLinkedDeque

1. 写在前面 ConcurrentLinkedDeque 是 Java 中一个高效、线程安全的双端队列&#xff08;Deque&#xff09;&#xff0c;使用无锁算法&#xff08;CAS 操作&#xff09;来保证线程安全性。由于其复杂的实现和广泛的应用场景&#xff0c;它常常成为面试中的重点考察对象。不知道…

【C++题解】1069. 字符图形5-星号梯形

问题&#xff1a;1069. 字符图形5-星号梯形 类型&#xff1a;嵌套循环、图形输出 题目描述&#xff1a; 打印字符图形。 输入&#xff1a; 一个整数&#xff08; 0<n<10 &#xff09;。 输出&#xff1a; 一个字符图形。 样例&#xff1a; 输入&#xff1a; 3输…

C#体检系统源码,医院健康体检系统PEIS,C#+VS2016+SQLSERVER

体检中心/医院体检科PEIS系统源码&#xff0c;C#健康体检信息系统源码&#xff0c;PEIS源码 开发环境&#xff1a;C/S架构C#VS2016SQLSERVER 2008 检前&#xff1a; 多种预约方式网站预约、电话预约、微信平台预约及检前沟通&#xff0c;提前制作套餐&#xff0c;客人到达体检…

机器学习(二十三):决策树和决策树学习过程

一、决策树 下面是数据集&#xff0c;输入特征是耳朵形状、脸形状、是否有胡子&#xff0c;输出结果是是否为猫 下图是决策树&#xff0c;根据耳朵形状、脸形状、是否有胡子这几个特征&#xff0c;建立决策树&#xff0c;从根节点一步步预测结果。 上图中&#xff0c;每一个椭…

wkt格式文件详解(包含应用示例)

还是大剑师兰特&#xff1a;曾是美国某知名大学计算机专业研究生&#xff0c;现为航空航海领域高级前端工程师&#xff1b;CSDN知名博主&#xff0c;GIS领域优质创作者&#xff0c;深耕openlayers、leaflet、mapbox、cesium&#xff0c;canvas&#xff0c;webgl&#xff0c;ech…

揭秘CISA:不只是证书,更是信息安全领域的国际通行证

CISA&#xff08;Certified Information Systems Auditor&#xff09;&#xff0c;即国际注册信息系统审计师&#xff0c;是信息系统审计、控制与安全等专业领域中备受认可的认证。它不仅是一张证书&#xff0c;更是信息安全领域的国际通行证。以下是对CISA的全面揭秘&#xff…

Apollo:目录分析, test ok

apollo: Apollo (阿波罗)是一个开放的、完整的、安全的平台,将帮助汽车行业及自动驾驶领域的合作伙伴结合车辆和硬件系统,快速搭建一套属于自己的自动驾驶系统。 - Gitee.comhttps://github.com/ApolloAuto/apolloapollo 目录名称目录作用cyber消息中间件,替换ros作为消息层…

Vscode报错:line too long (84 > 79 characters)

原因&#xff1a;不允许一行超过79个字母&#xff0c;但是该行代码超出该范围。 参考博客&#xff1a;解决Vs CodeFlake8 报错line too long (108 &#xff1e; 79 characters)Flake8(E501)_flake8 line too long-CSDN博客

Javascript前端面试基础(八)

window.onload和$(document).ready区别 window.onload()方法是必须等到页面内包括图片的所有元素加载完毕后才能执行$(document).ready()是DOM结构绘制完毕后就执行&#xff0c;不必等到加载完毕 window.onload 触发时机&#xff1a;window.onload 事件会在整个页面&#xf…

微服务面试-分布式 注册中心 远程调用 保护

标红的原理还是不太熟悉 重新看 分布式事务 CAP理论 Consistency&#xff08;一致性&#xff09; Availability&#xff08;可用性&#xff09; Partition tolerance &#xff08;分区容错性&#xff09; BASE 理论 就是做取舍 cap三选二 AT模式脏写 TCC模式 注册中…

2024年7月29日(web nginx)

web 一、web基本概念和常识 Web:为用户提供的一种在互联网上浏览信息的服务,Web服务是动态的、可交互的、跨平台的和图形化的。 Web 服务为用户提供各种互联网服务,这些服务包括信息浏览服务,以及各种交互式服务,包括聊天、购物、学习等等内容。 Web 应用开发也经过了几代技术…

MySQL 执行计划详解

文章目录 一. 概念二. 语法三. 详解各字段1. id2. select_type3. table4. partitions5. type6. possible_keys与key7. key_len8. ref9. rows10. filtered11. Extra 一. 概念 有了慢查询后&#xff0c;需要对慢查询语句进行分析。一条查询语句经过MySQL查询优化器后&#xff0c…

最新 【Navicat Premium 17.0.8】简体中文版破解激活永久教程

官方下载地址&#xff1a; https://www.navicat.com.cn/download/navicat-premium 百度网盘补丁链接 链接: https://pan.baidu.com/s/11hu414Honi3Y9dPQ6-07JQ?pwd04mu 提取码: 04mu 未安装过的用户可直接跳过该步骤&#xff0c;如果已安装Navicat&#xff0c;记得先卸载干净…

阿里云主机 安装RabbitMQ

一、操作系统 用的是Alibaba Cloud Linux release 3 (Soaring Falcon)系统&#xff0c;可以通过命令&#xff1a;lsb_release -a 查看系统信息。 二、安装RabbitMQ RabbitMQ 是基于 Erlang 语言构建的&#xff0c;要安装RabbitMQ&#xff0c;需先安装Erlang环境。通过Erlang V…

【图解网络】学习记录

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 TCP/IP 网络模型有哪几层&#xff1f;键入网址到网页显示&#xff0c;期间发生了什么&#xff1f;Linux 系统是如何收发网络包的&#xff1f;NAPIHTTP 是什么&#…

Win10出现错误代码0x80004005 一键修复指南

对于 Windows 10 用户来说&#xff0c;错误代码 0x80004005 就是这样一种迷雾&#xff0c;它可能在不经意间出现&#xff0c;阻碍我们顺畅地使用电脑。这个错误通常与组件或元素的缺失有关&#xff0c;它可能源自注册表的错误、系统文件的损坏&#xff0c;或者是软件的不兼容。…

PyTorch 的 .pt 文件是什么?以及都能存储什么样的数据格式和复合数据格式?加载 train.pt 文件的一个代码示例

&#x1f349; CSDN 叶庭云&#xff1a;https://yetingyun.blog.csdn.net/ 一、PyTorch 的 .pt 文件是什么&#xff1f; .pt 文件的基本概念&#xff1a; .pt 文件是 PyTorch 中特有的一种文件格式&#xff0c;用于保存和加载各类数据。.pt为 PyTorch 的缩写。此文件格式极其灵…