首页 > 行业资讯 > 正文

7.1 原理图分析

查看EK-RA6M4的原理图,如下图所示,该开发板上的MikroBus接口上有提供一个I2C接口。

基于单片机的I2C接口SHT20传感器采样设计-单片机传感器种类大全

根据原理图可知,I2C1接口的两个引脚分别为:

按键 SDA1 SCL1 引脚 P511 P512

这里我们将在该I2C接口上连接 SHT20 传感器(3.3V供电),实时采样当前环境的温湿度情况。

7.2 I2C接口配置

首先,在FSP配置中将I2C1所用的两个GPIO口配置成I2C模式。

基于单片机的I2C接口SHT20传感器采样设计-单片机传感器种类大全1

接着选择 Stacks ,点击 “New Stack” -> “Connectivity” -> “I2C Master(r_iic_master)” 添加I2C Master协议栈。

基于单片机的I2C接口SHT20传感器采样设计-单片机传感器种类大全2

接下来设置I2C Master的相关配置,并重新生成代码。

基于单片机的I2C接口SHT20传感器采样设计-单片机传感器种类大全3

通过 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 编译运行

代码修改完成后,在开发板上编译运行。

基于单片机的I2C接口SHT20传感器采样设计-单片机传感器种类大全4

这时串口终端上将会实时打印SHT20传感器采样的温湿度。

基于单片机的I2C接口SHT20传感器采样设计-单片机传感器种类大全5

猜你喜欢