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传感器采样的温湿度。

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。
举报投诉
-
传感器
+关注
关注
2578文章
55811浏览量
795403 -
单片机
+关注
关注
6078文章
45629浏览量
675341 -
接口
+关注
关注
33文章
9635浏览量
157801 -
I2C
+关注
关注
28文章
1566浏览量
131941
发布评论请先 登录
相关推荐
热点推荐
新人发帖问关于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麒麟座试用体验】3.OneNET之HAL i2c的使用(SHT20温湿度测量)
与原理这次主要使用STM32F103的HAL 库i2c来进行外设的操作,EEPROM AT24C02,温湿度传感器SHT20。AT24C02
发表于 04-19 18:37
STM32硬件i2c,CubeMX,Hal库
这是基于STM32调试的两个简单的硬件i2c通信的资料,所使用的是hal库,并且文件里面还有相关传感器SHT20,SSD1306屏幕的数据手册
发表于 09-17 09:32
•66次下载
使用STM32F030单片机读取温湿度传感器SHT20的C语言源代码免费下载
本文档的主要内容详细介绍的是使用STM32F030单片机读取温湿度传感器SHT20的C语言源代码免费下载。
发表于 06-10 17:07
•119次下载
SHT20温湿度传感器的数据手册免费下载
标定的数字信号,标准 I2 C 格式。 SHT20 配有一个全新设计的 CMOSens®芯片、一个经过改进的电容式湿度传感元件和一个标准的能隙温度传
发表于 04-26 08:00
•76次下载
STM32CubeMX I2C SHT20的工程文件免费下载
STM32F10x 硬件I2C2读取SHT20温湿度并通过printf重定向到串口输出信息, 基于STM32CubeMX 和 System Workbench。
发表于 03-03 08:00
•23次下载
使用单片机实现I2C接口温度传感器DS1621应用测试的C语言实例
本文档的主要内容详细介绍的是使用单片机实现I2C接口温度传感器DS1621应用测试的C语言实例免费下载。
发表于 03-31 14:45
•10次下载
I2C协议之软件模拟(二)-- 实际应用之SHT20
下面利用软件模拟I2C读写SHT20温湿度传感器。一、SHT20通讯定义(1)设备I2C地址:0x40;(
发表于 11-15 20:06
•25次下载
sht20校验对读出的温度偏高
SHT20是一种常用的温湿度传感器,其精度和稳定性得到了广泛应用。但是,有时候在使用SHT20传感器时,可能会遇到温度读数偏高的问题,这给用户带来了困惑和困扰。本文将详细分析
基于单片机的I2C接口SHT20传感器采样设计
评论