Renesas MCU使用SCI_I2C驱动HS3003

目录

概述

1 软硬件介绍

1.1 软件版本信息

 1.2 认识HS3003

1.2.1 HS3003特性

1.2.2 HS3003寄存器

1.2.2.1 温湿度数据寄存器

1.2.2.2 参数寄存器

1.2.2.3 一个参数配置Demo

1.2.3 温湿度值转换

1.2.4 HS3003应用电路

1.2.4.1 PIN引脚定义

1.2.4.2 sensor 应用电路

1.3 MCU与HS3003对应关系

2 FSP配置项目

2.1 配置项目参数

 2.2 生成项目文件架构

3 代码实现

3.1 I2C的库函数

3.1.1 R_SCI_I2C_Open()

3.1.2 R_SCI_I2C_Read()

3.1.3  R_SCI_I2C_Write()

3.2 应用函数接口

3.2.1 初始化函数

3.2.2 读数据函数

3.2.3 写数据函数

3.2.4 回调函数

3.3 源代码文件

4 HS3003驱动实现

4.1 编写驱动程序

4.2 编写测试代码

5 测试


概述

本文主要介绍使用Renesas MCU之i2c读写数据功能,包括硬件资源介绍,FSP配置项目的方法,还介绍了SCI_I2C的接口函数,笔者使用一款I2C接口类型的Sensor(HS3003)作为Device,使用I2C接口驱动该sensor,还编写测试函数验证其功能。

1 软硬件介绍

1.1 软件版本信息

软硬件信息版本信息
Renesas MCUR7FA4M2AD3C
KeilMDK ARM 5.38
FSP 版本5.3.0
调试工具:st-linkST-LINK/V2-1

 注意:

在Keil MDK中可以更改FSP的版本,方法如下

 1.2 认识HS3003

1.2.1 HS3003特性

HS3003是瑞萨公司出品的一款高精度温湿度传感器,下面看看其主要参数:

1.2.2 HS3003寄存器

       HS3003采用标准的I2C通信方式,对其寄存器的操作必须遵循标准的I2C时序。现在分析如何操作其寄存器,读取数据。

1.2.2.1 温湿度数据寄存器

温湿度数据寄存器的数据位定义如下,其主要由四个字节组成一个32bit数据, bit-0 和 bit-1为Mask,其主要用来标记当前数据是否有效(mask =0 数据有效), 温度数据(低16 bit ): bit-2 ~ bit ~ 15

湿度数据( 高16 bit): bit-8 ~ bit 13 

采样温湿度数据间隔时间根据配置的ADC精度来选取,精度要求越高,采样所需要的时间就越长。那么读取数据时,需要等待的时间就越长。

1.2.2.2 参数寄存器

精度参数如下:

参数寄存器列表

如何配置参数呢?芯片手册给了四个步骤

1.2.2.3 一个参数配置Demo

下面给一个各一个配置参数的范例,配置humidity 的采集精度为12bit, 那么参数设定如下:

  bit-10:  0

  bit-11: 1

typedef struct
{unsigned short res1          : 10;unsigned short tempdata      : 2;unsigned short res2          : 4;
} stru_para_bit;typedef struct{union{unsigned short data;stru_para_bit para_bit;};
}stru_para;int hs300x_init(void)
{int ret;unsigned char   buff[4];stru_para para;// step-1 write data from 0x06buff[0] = 0x06;buff[1] = 0;buff[2] = 0;ret = write(fd, buff, 3);if( ret < 0 ){printf("read temper cmd to hs3003 register failure.\n");return -1;}// step -2: read reg - 0x81buff[0] = 0x81;ret = write(fd, buff, 1);if( ret < 0 ){printf("read cmd to hs3003 register failure. \r\n");return -1;}ret = read(fd, buff, 2);if( ret < 0 ){printf("write cmd to hs3003 register failure.\n");return -1;}printf(" read reg: 0x81 - data0 = %02x data1 = %02x \r\n",buff[0],buff[1]);//step -3:  write data from 0x46para.data = buff[0]<<8 | buff[1];para.para_bit.tempdata = 1; buff[0] = 0x46;buff[1] = (unsigned char)para.data;buff[2] = (unsigned char)(para.data>>8);ret = write(fd, buff, 3);if( ret < 0 ){printf("write cmd to hs3003 register failure. \r\n");return -1;}printf("write reg: 0x46 - data0 = %02x data1 = %02x \r\n",buff[0],buff[1]);return 0;
}

1.2.3 温湿度值转换

datasheet中给的转换公式如下:

下面看看在程序中如何实现温湿度值转换的

首先定义一个数据结构


typedef struct
{unsigned int mask          : 2;unsigned int tempdata      : 14;unsigned int humidydata    : 14;unsigned int res           : 2;
} Datafetch_bit;typedef struct{union{unsigned int data;Datafetch_bit fetch_bit;};float tempval;float humival;
}hs300x_data;

       从温湿度的数据寄存器中读取出来有四个分别为8bit的数据, 将该数据拼成一个32bit的数据,在赋值给data, 上述数据结构会自动解析该数据。通过mask位判断数据是否有效。

    phs300x_data->data = ((buff[0] << 24U) |(buff[1] << 16U) |(buff[2] << 8U)|(buff[3]));if( phs300x_data->fetch_bit.mask == HS300X_DATA_VALID){// get temperature value val = phs300x_data->fetch_bit.tempdata;phs300x_data->tempval = (double)val/(double)(HS300X_DATA_FACTOR) * 165.0 - 40;printf(" - TM(C): %.2f \r\n", phs300x_data->tempval);// get humidity value val = phs300x_data->fetch_bit.humidydata;phs300x_data->humival = (double)val/(double)(HS300X_DATA_FACTOR) * 100.0;printf(" - HM(\%): %.2f \r\n", phs300x_data->humival);}

1.2.4 HS3003应用电路

1.2.4.1 PIN引脚定义

传感器封装

pin引脚

1.2.4.2 sensor 应用电路

下面是传感器模块的实际应用电路:

1.3 MCU与HS3003对应关系

MCU接口HS3003功能
P409SDAI2C数据端口
P408SCLI2C时钟接口

2 FSP配置项目

2.1 配置项目参数

1)配置系统时钟,根据硬件特性配置时钟,笔者的板卡上的晶振为12M Hz

 2) 在Pins面板配置SCI3,使能I2C,并且配置IO端口

3)在Stacks面板创建i2c的object

 配置参数

 2.2 生成项目文件架构

点击Generate Project content 按钮,生成项目文件,其文件架构如下:

3 代码实现

3.1 I2C的库函数

3.1.1 R_SCI_I2C_Open()

函数原型:


fsp_err_t R_SCI_I2C_Open	(	i2c_master_ctrl_t *const 	p_api_ctrl,i2c_master_cfg_t const *const 	p_cfg )	

函数功能: 打开I2C设备

返回值介绍:

FSP_SUCCESSRequested clock rate was set exactly.
FSP_ERR_ALREADY_OPENModule is already open.
FSP_ERR_IP_CHANNEL_NOT_PRESENTChannel is not available on this MCU.
FSP_ERR_ASSERTIONParameter check failure due to one or more reasons below:
  1. p_api_ctrl or p_cfg is NULL.
  2. extended parameter is NULL.
  3. Callback parameter is NULL.
  4. Clock rate requested is greater than 400KHz
  5. Invalid IRQ number assigned

3.1.2 R_SCI_I2C_Read()

函数原型:


fsp_err_t R_SCI_I2C_Read	(	i2c_master_ctrl_t *const 	p_api_ctrl,uint8_t *const 	p_dest,uint32_t const 	bytes,bool const 	restart )	

函数功能: 从I2C设备执行读取操作。当操作(成功)完成时,调用者将通过回调中的I2C_MASTER_EVENT_RX_COMPLETE收到通知。

返回值:

FSP_SUCCESSFunction executed without issue.
FSP_ERR_ASSERTIONThe parameter p_ctrl, p_dest is NULL, bytes is 0.
FSP_ERR_INVALID_SIZEProvided number of bytes more than uint16_t size (65535) while DTC is used for data transfer.
FSP_ERR_NOT_OPENDevice was not even opened.

3.1.3  R_SCI_I2C_Write()

函数原型:


fsp_err_t R_SCI_I2C_Write	(	i2c_master_ctrl_t *const 	p_api_ctrl,uint8_t *const 	p_src,uint32_t const 	bytes,bool const 	restart )	

函数功能: 对I2C设备进行写操作,如果相关通道上已经有正在进行的I2C传输,则此函数将失败。否则,将开始I2C写操作。当用户没有提供回调时,该函数执行阻塞写入。否则,写操作是非阻塞的,并且当操作完成时将通过回调中的I2C_EVENT_TX_COMPLETE通知调用者。

返回值:

FSP_SUCCESSFunction executed without issue.
FSP_ERR_ASSERTIONp_ctrl, p_src is NULL.
FSP_ERR_INVALID_SIZEProvided number of bytes more than uint16_t size (65535) while DTC is used for data transfer.
FSP_ERR_NOT_OPENDevice was not even opened.

3.2 应用函数接口

创建bsp_i2c.c文件,实现i2c的应用函数接口

3.2.1 初始化函数

代码第24行:打开端口

代码第27行:设置设备地址

3.2.2 读数据函数

代码第54行:从设备中读取数据

代码第57行:判断接收数据是否完成

 3.2.3 写数据函数

代码第36行:从设备中写数据

代码第41行:判断写数据是否完成

3.2.4 回调函数

代码第16行:接收当前event

 

3.3 源代码文件

 创建 bsp_i2c.c文件,编写以下代码:

 /*FILE NAME  :  bsp_i2c.cDescription:  i2c interface function Author     :  tangmingfei2013@126.comDate       :  2024/06/03*/
#include "bsp_i2c.h" 
#include "hal_data.h"i2c_master_event_t g_i2c_callback_event;void g_i2c2_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_I2C_Open(&g_i2c2_ctrl, &g_i2c2_cfg);assert(FSP_SUCCESS == err);err = R_SCI_I2C_SlaveAddressSet(&g_i2c2_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 = 100;fsp_err_t err;err = R_SCI_I2C_Write(&g_i2c2_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 = 100;fsp_err_t err;g_i2c_callback_event = I2C_MASTER_EVENT_ABORTED;err = R_SCI_I2C_Read(&g_i2c2_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 */

4 HS3003驱动实现

4.1 编写驱动程序

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

  /*FILE NAME  :  hs3003_drv.cDescription:  hs3003 driverAuthor     :  tangmingfei2013@126.comDate       :  2024/06/03*/
#include "bsp_i2c.h" 
#include "hal_data.h"
#include "hs3003_drv.h"int hs300x_init(void)
{unsigned char buff[4];stru_para para;i2c2_init_para(HS300X_ADDR);// step-1 write data from 0x06buff[0] = 0x06;buff[1] = 0;buff[2] = 0;i2c2_write_bytes(buff, 3);// step -2: read reg - 0x81buff[0] = 0x81;i2c2_write_bytes(buff, 1);i2c2_read_bytes(buff, 2);//step -3:  write data from 0x46para.data = (unsigned int)(buff[0]<<8 | buff[1]);para.para_bit.tempdata = 1; buff[0] = 0x46;buff[1] = (unsigned char)para.data;buff[2] = (unsigned char)(para.data>>8);i2c2_write_bytes( buff, 3);return 0;
}int hs300x_read_value(hs300x_data *phs300x_data)
{unsigned char buff[4];unsigned int val;stru_para para;// write data to 0xa0para.data = 0;buff[0] = 0xa0;buff[1] = (unsigned char)para.data;buff[2] = (unsigned char)(para.data>>8);i2c2_write_bytes(buff, 3);R_BSP_SoftwareDelay( 1, BSP_DELAY_UNITS_MILLISECONDS);i2c2_read_bytes(buff, 4);phs300x_data->data = (unsigned int)((buff[0] << 24U) |(buff[1] << 16U) |(buff[2] << 8U)|(buff[3]));if( phs300x_data->fetch_bit.mask == HS300X_DATA_VALID){// get temperature value val = phs300x_data->fetch_bit.tempdata;phs300x_data->tempval = (float)((double)val/(double)(HS300X_DATA_FACTOR) * 165.0 - 40);// get humidity value val = phs300x_data->fetch_bit.humidydata;phs300x_data->humival = (float)((double)val/(double)(HS300X_DATA_FACTOR) * 100.0);}return 0;
}/* End of this file */

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

 /*FILE NAME  :  hs3003_drv.cDescription:  hs3003 driverAuthor     :  tangmingfei2013@126.comDate       :  2024/06/03*/#ifndef HS3003_DRV_H#define HS3003_DRV_H#include "hal_data.h"/* hs3003 i2c address */
#define HS300X_ADDR                          (0x44U)#define HS300X_DATA_VALID                    (0x00U)
#define HS300X_DATA_STALE                    (0x01U)
#define HS300X_STATUS_MASK                   (0xC0000000U)
#define HS300X_STATUS_POS                    (30U)#define HS300X_DATA_MASK                     (0x3FFFFFFCU)
#define HS300X_HUMI_DATA_MASK                (0x3FFF0000U)
#define HS300X_HUMI_DATA_POS                 (16U)
#define HS300X_TEMP_DATA_MASK                (0x0000FFFCU)
#define HS300X_TEMP_DATA_POS                 (2U)#define HS300X_REG_R_TRG                     0X06
#define HS300X_REG_W_TRG                     0X46/* calculation formula, 2^14 - 1 */
#define HS300X_DATA_FACTOR                   (16383U)typedef struct
{unsigned int mask          : 2;unsigned int tempdata      : 14;unsigned int humidydata    : 14;unsigned int res           : 2;
} Datafetch_bit;typedef struct{union{unsigned int data;Datafetch_bit fetch_bit;};float tempval;float humival;
}hs300x_data;typedef struct
{unsigned int res1          : 10;unsigned int tempdata      : 2;unsigned int res2          : 4;
} stru_para_bit;typedef struct{union{unsigned int data;stru_para_bit para_bit;};
}stru_para;int hs300x_init(void);
int hs300x_read_value(hs300x_data *phs300x_data);#endif   /* HS3003_DRV_H */

4.2 编写测试代码

代码第48行:初始化hs3003

代码第60行:读取hs3003温湿度值

5 测试

编译代码,然后将代码下载到板卡中,运行代码

当吧手指放到hs3003芯片上,温湿度值就会变化

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

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

相关文章

怎样恢复数据?原来只要3个方法,真是救大命了

无论是工作文件&#xff0c;还是个人的照片、视频&#xff0c;手机数据都承载着我们的记忆和努力。但如果不小心删除了&#xff0c;我们该怎样恢复数据呢&#xff1f;其实&#xff0c;恢复数据并不是一件复杂的事情&#xff0c;只要掌握正确的方法&#xff0c;我们就能有效地找…

腾讯云CVM,CentOS8系统下部署Java-Web项目步骤详解

在CVM中部署项目首先要配置好JDK,Tomcat,Mysql(这里以Tomcat和Mysql为例)。部署JDK和Tomcat的步骤可以参考 CentOS7系统下部署tomcat,浏览器访问localhost:8080/_不积跬步&#xff0c;无以至千里&#xff1b;不积小流&#xff0c;无以成江河。-CSDN博客 我这里从Mysql的安装和设…

十年,亚马逊云科技合作伙伴网络开启AI新征程

“十年之前&#xff0c;你不认识我&#xff0c;我不认识你&#xff0c;因为云计算我们携手并肩&#xff1b;十年之后&#xff0c;我们仍是伙伴&#xff0c;更是朋友&#xff0c;因为人工智能再次起程。”这就是今天的亚马逊云科技与其合作伙伴的真实写照。 2024年是亚马逊云科技…

每日一学(1)

目录 1、ConCurrentHashMap为什么不允许key为null&#xff1f; 2、ThreadLocal会出现内存泄露吗&#xff1f; 3、AQS理解 4、lock 和 synchronized的区别 1、ConCurrentHashMap为什么不允许key为null&#xff1f; 底层 putVal方法 中 如果key || value为空 抛出…

【移动应用开发期末复习】第五/六章

系列文章 第一章——Android平台概述 第一章例题 第二章——Android开发环境 第二章例题 第三章 第三章例题 第四章 系列文章界面布局设计线性布局表格布局帧布局相对布局约束布局控制视图界面的其他方法代码控制视图界面数据存储与共享首选项信息数据文件SQLite数据库Content…

Oracle数据库使用指南基本概念

学习总结 1、掌握 JAVA入门到进阶知识(持续写作中……&#xff09; 2、学会Oracle数据库入门到入土用法(创作中……&#xff09; 3、手把手教你开发炫酷的vbs脚本制作(完善中……&#xff09; 4、牛逼哄哄的 IDEA编程利器技巧(编写中……&#xff09; 5、面经吐血整理的 面试技…

【前端】HTML+CSS复习记录【2】

文章目录 前言一、img&#xff08;图片标签&#xff09;二、a&#xff08;链接标签&#xff09;三、ul&#xff08;无序列表&#xff09;四、ol&#xff08;有序列表&#xff09;系列文章目录 前言 长时间未使用HTML编程&#xff0c;前端知识感觉忘得差不多了。通过梳理知识点…

【可控图像生成系列论文(二)】MimicBrush 港大、阿里、蚂蚁集团合作论文解读2

【可控图像生成系列论文&#xff08;一&#xff09;】简要介绍了论文的整体流程和方法&#xff0c;本文则将就整体方法、模型结构、训练数据和纹理迁移进行详细介绍。 1.整体方法 MimicBrush 的整体框架如下图所示。为了实现模仿编辑&#xff0c;作者设计了一种具有双扩散模型…

【vue3】【vant】 移动本草纲目案例发布收藏项目源码

【vue3】【vant】 移动本草纲目案例发布收藏项目源码 获取源码方式项目说明&#xff1a;其中功能包括 项目包含&#xff1a;项目运行环境文件截图 获取源码方式 加Q群&#xff1a;632562109项目说明&#xff1a; 本系统是使用vue3语法结合vant开发的移动端的本草纲目案例。 用…

制作一个智能体:抖音热点话题文案制作助手

文章目录 第一步&#xff0c;添加助手第二步&#xff0c;选择语聚GPT第三步&#xff0c;填写相关信息第四步&#xff0c;工具中选择抖音(普通号)第五步&#xff0c;选择“查询热门视频数据”第六步&#xff0c;测试总结 这篇文章&#xff0c;我们手把手的演示开发一个智能体&am…

Objects and Classes (对象和类)

Objects and Classes [对象和类] 1. Procedural and Object-Oriented Programming (过程性编程和面向对象编程)2. Abstraction and Classes (抽象和类)2.1. Classes in C (C 中的类)2.2. Implementing Class Member Functions (实现类成员函数)2.3. Using Classes References O…

MyPostMan:按照项目管理接口,基于迭代生成接口文档、执行接口自动化联合测试

MyPostMan 是一款类似 PostMan 的接口请求软件&#xff0c;不同于 PostMan 的是&#xff0c;它按照 项目&#xff08;微服务&#xff09;、目录来管理我们的接口&#xff0c;基于迭代来管理我们的接口文档&#xff0c;可导出或者在局域网内共享&#xff0c;按照迭代编写自动化测…

微信小程序-自定义组件checkbox

一.自定义Coponent组件 公共组件&#xff1a;将页面内公共的模块抽取为自定义组件&#xff0c;在不同页面复用。 页面组件&#xff1a;将复杂页面进行拆分&#xff0c;降低耦合度&#xff0c;有利于代码维护。 可以新建文件夹component放组件&#xff1a; 组件名为custom-che…

【Unity】Timeline的倒播和修改速度(无需协程)

unity timeline倒播 一、核心: 通过playableDirector.playableGraph.GetRootPlayable(i).SetSpeed(speed)接口,设置PlayableDirector的速度。 二、playableGraph报空 若playableDirector不勾选Play On Awake,则默认没有PlayableGraph,需执行playableDirector…RebuildGr…

mysql备份和恢复

目录 一、数据库备份的分类 二、常见的备份方法 三、MySQL完全备份 1&#xff09;数据库完全备份与恢复 2&#xff09;mysqldump备份与恢复 1、完全备份一个或多个完整的库&#xff08;包括其中所有的表&#xff09; 2、完全备份 MySQL 服务器中所有的库 3、完全备份某…

Qt Quick Effect Maker 工具使用介绍

一、介绍 随着 Qt 版本的不断升级,越来越多的功能被加入 Qt,一些新的工具也随之应运而生,Qt Quick Effect Maker 工具是 Qt 6.5 之后才新添加的工具,之前的名字应该是叫做 Qt shader tool 这个模块。 以下是官方的释义:Qt Quick Effect Maker是一个用于为Qt Quick创建自定…

DC/AC电源模块一种效率与可靠性兼备的能源转换解决方案

DC/AC电源模块都是一种效率与可靠性兼备的能源转换解决方案 DC/AC电源模块是一种能够将直流电源&#xff08;DC&#xff09;转换为交流电源&#xff08;AC&#xff09;的设备。它在现代电子设备中扮演着非常重要的角色&#xff0c;因为许多设备需要交流电源才能正常运行。无论…

金融科技行业创新人才培养与引进的重要性及挑战

金融科技行业作为金融与科技的深度融合产物&#xff0c;正以前所未有的速度改变着传统金融业的格局。在这一变革中创新人才的培养与引进成为了行业发展的核心驱动力。然而&#xff0c;尽管其重要性不言而喻&#xff0c;但在实际操作中却面临着诸多挑战。 一、创新人才培养与引进…

echarts 5.5.0版本下的层叠柱形图,每个值都从0开始,会有覆盖情况

需求&#xff1a; 1、每个公司&#xff0c;需要两个柱子去展示&#xff08;stack: 1是第一个柱子&#xff0c;stack:2,是第二个柱子&#xff09;&#xff1b; 2、必须每个数据都是从0开始&#xff0c;不在上一个值上累加&#xff1b; 3、鼠标滑上去的时候&#xff0c;最大值…

ffmpeg音视频开发从入门到精通——ffmpeg日志及目录操作

文章目录 FFMPEG1. 操作日志2. 文件移动和删除3. 操作目录重要函数 FFMPEG 1. 操作日志 日志级别 AV LOG ERROR AV LOG WARNING AV LOG INFO AV LOG DEBUG cmake_minimum_required(VERSION 3.27) project(FFmpeg_exercise) set(CMAKE_CXX_STANDARD 14)# 定义FFmpeg的安装路…