1、STM32CubeMX配置硬件IIC。
sht3x.c
#define __GLOBAL_SHT3X
#include "sht3x.h"
uint8_t SHT30_Send_Cmd(uint16_t cmd)
{
uint8_t cmd_buffer[2];
cmd_buffer[0] = cmd >> 8;
cmd_buffer[1] = cmd;
return HAL_I2C_Master_Transmit(&hi2c1, SHT30_ADDR_WRITE, (uint8_t*)cmd_buffer, 2, 0xFFFF);
}
//SHT35初始化;0-成功,其它-失败;
uint8_t SHT3X_Init(void)
{
return SHT30_Send_Cmd(SOFT_RESET_CMD);
}
/**
* @brief 从SHT30读取一次数据
* @param dat —— 存储读取数据的地址(6个字节数组)
* @retval 成功 —— 返回HAL_OK
*/
uint8_t SHT30_Read_Dat(uint8_t* dat)
{
SHT30_Send_Cmd(MEDIUM_ENABLED_CMD);
return HAL_I2C_Master_Receive(&hi2c1, SHT30_ADDR_READ, dat, 6, 0xFFFF);
}
//主程序定时调用
//读取 Measurement Results
void SHT3x_Read(void)
{
uint16_t temp=0,hum=0;
uint8_t SHT3X_Value[6];
//Measurement Commands for Single Shot Data Acquisition Mode
SHT30_Read_Dat(SHT3X_Value);
temp |= SHT3X_Value[0] << 8;
temp |= SHT3X_Value[1];
hum |= SHT3X_Value[3] << 8;
hum |= SHT3X_Value[4];
// 计算温度和湿度
Sht35_Data.temp = -45.0 + 175.0 * temp/ 65535;
Sht35_Data.humidity = 100.0 * hum/ 65535;
}
sht3x.h
#ifndef __SHT3X_H
#define __SHT3X_H
#ifdef __GLOBAL_SHT3X
#define EXT_SHT3X
#else
#define EXT_SHT3X extern
#endif
#include "i2c.h"
/* ADDR Pin Conect to VSS */
#define SHT30_ADDR_WRITE 0x44<<1 //10001000
#define SHT30_ADDR_READ (0x44<<1)+1 //10001011
typedef enum
{
/* 软件复位命令 */
SOFT_RESET_CMD = 0x30A2,
/*
单次测量模式
命名格式:Repeatability_CS_CMD
CS: Clock stretching
*/
HIGH_ENABLED_CMD = 0x2C06,
MEDIUM_ENABLED_CMD = 0x2C0D,
LOW_ENABLED_CMD = 0x2C10,
HIGH_DISABLED_CMD = 0x2400,
MEDIUM_DISABLED_CMD = 0x240B,
LOW_DISABLED_CMD = 0x2416,
/*
周期测量模式
命名格式:Repeatability_MPS_CMD
MPS:measurement per second
*/
HIGH_0_5_CMD = 0x2032,
MEDIUM_0_5_CMD = 0x2024,
LOW_0_5_CMD = 0x202F,
HIGH_1_CMD = 0x2130,
MEDIUM_1_CMD = 0x2126,
LOW_1_CMD = 0x212D,
HIGH_2_CMD = 0x2236,
MEDIUM_2_CMD = 0x2220,
LOW_2_CMD = 0x222B,
HIGH_4_CMD = 0x2334,
MEDIUM_4_CMD = 0x2322,
LOW_4_CMD = 0x2329,
HIGH_10_CMD = 0x2737,
MEDIUM_10_CMD = 0x2721,
LOW_10_CMD = 0x272A,
/* 周期测量模式读取数据命令 */
READOUT_FOR_PERIODIC_MODE = 0xE000,
}SHT30_CMD;
typedef struct
{
float temp;
float humidity;
}SHT3X_DATA;
EXT_SHT3X SHT3X_DATA Sht35_Data;
uint8_t SHT3X_Init(void);
boolean SHT3x_Read(void);
#endif