【STM32】HDC2080温湿度计驱动
目录
一、简单介绍
典型应用
原理图
二、cubemx配置
三、驱动开发
写入
单字节写
多字节写
读取
单字节读
多字节读
四、驱动附录
HDC2080.h
HDC2080.c
一、工程链接
STM32芯片HAL库驱动HDC2080资源-CSDN下载
二、简单介绍
HDC2080是TI的一款低功耗温湿度数字传感器。

温度采集精度典型值是0.2摄氏度,湿度为2%。
低功耗,供电电压为1.62~3.6V,适合纽扣电池供电的场景。
可以用在物联网及智能家居上。

睡眠功耗为50nA,适合电池供电的场景。芯片有2种测量模式——触发模式和自动模式。
触发模式下,芯片接收I2C指令后转换,转换完毕就继续睡眠。
自动模式下,芯片周期性转换,有7种周期可以配置。
就是下面这7种:


芯片上电后默认进睡眠模式,等待I2C总线上出现配置转换时间/触发转换/读写指令。
如果接收到转换指令,就开始转换,可以监测DRDY引脚的电平作来判断是否转换完毕。转换完毕就又睡眠。

当环境湿度太大,以至于传感器表面有水汽凝结怎么办?芯片贴心地准备了一个加热器,可以加热芯片使水汽蒸发。
加热过程电流较大,谨慎使用。

只有一个引脚对外输出中断状态,但是有4种中断:过温低温,过湿过干。
采取的是中断优先级,四个都开启则只响应过温,按顺序类推。
典型应用


建议在VDD和GND直接增加0.1uF电容,PCB上建议去除HDC2080底下的铜皮,并且在芯片周围开槽来实现热隔离以增强性能。

最好使用免洗焊接,尽量不要返工哦。
原理图

HDC2080的ADDR引脚用于配置HDC2080的I2C总线地址。

DRDY/INT引脚有数据准备和中断的功能,是开漏输出的。
笔者使用STM32L051K8U6单片机作为MCU,是一款低功耗MCU。

三、cubemx配置
开启调试口、系统唤醒PA0

开启I2C

时钟使用内部HSI,16MHz

配置工程路径等后即可生成。
四、驱动开发
芯片使用的是I2C可以单字节读写,也可以多字节读写。

写入
单字节写入和多字节写入比较类似,取绝于发送地址后接着发送多少字节。

单字节写
/* auto measure at 5 hz and set DRDY */HDC2080_WR_Reg(0x0E, 0x77); 
多字节写

一个LSB约为0.644摄氏度,设置低门槛10度,高门槛28度,则寄存器值分别是78和106。
/* configure temperature threhold */HDC2080_WR_Regs(0x0A, tempTh, 2); 
读取
读取寄存器内容,需要先发送一个寄存器地址告诉芯片要从哪里开始读。


单字节读
HDC2080_RD_Reg(0xFF, &HDC2080_Reg.id1_high); 
多字节读
/* read all registers value */HDC2080_RD_Regs(0x00, &HDC2080_Reg.temp_low, 16); 
主循环周期读取温湿度值,在调试界面显示出来。

当芯片温度高于28度时DRDY引脚拉高,低于28度时自动恢复低电平


五、驱动附录
HDC2080.h
#ifndef HDC2080_H
#define HDC2080_H#include "main.h"
#include "stdint.h"
#include "i2c.h"#define HDC2080_I2C hi2c1
#define HDC2080_ADDR 0x80typedef struct
{uint8_t temp_low;uint8_t temp_high;uint8_t humid_low;uint8_t humid_high;uint8_t interrupt;uint8_t temp_max;uint8_t humid_max;uint8_t interrupt_enable;uint8_t temp_offset;uint8_t humid_offset;uint8_t temp_th_low;uint8_t temp_th_high;uint8_t rh_th_low;uint8_t rh_th_high;uint8_t reset;uint8_t config;uint8_t id0_low;uint8_t id0_high;uint8_t id1_low;uint8_t id1_high;
}HDC2080_RegType;uint8_t HDC2080_Init();
void HDC2080_Trigger();
void HDC2080_Reset();
void HDC2080_RD_Temperature(float* temp);
void HDC2080_RD_Humidity(float* humid);#endif HDC2080.c
#include "HDC2080.h"HDC2080_RegType HDC2080_Reg;uint8_t tempTh[2] = {78, 106};void HDC2080_RD_Reg(uint8_t addr, uint8_t* dat)
{HAL_I2C_Mem_Read(&HDC2080_I2C, HDC2080_ADDR, addr, 1, dat, 1, 0xFFFF);
}void HDC2080_WR_Reg(uint8_t addr, uint8_t val)
{HAL_I2C_Mem_Write(&HDC2080_I2C, HDC2080_ADDR, addr, 1, &val, 1, 0x100);
}void HDC2080_RD_Regs(uint8_t addr, uint8_t* dat, uint8_t len)
{HAL_I2C_Mem_Read(&HDC2080_I2C, HDC2080_ADDR, addr, 1, dat, len, 0xFFFF);
}void HDC2080_WR_Regs(uint8_t addr, uint8_t* val, uint8_t len)
{HAL_I2C_Mem_Write(&HDC2080_I2C, HDC2080_ADDR, addr, 1, val, len, 0x100);
}void HDC2080_Reset()
{HDC2080_WR_Reg(0xE, 0x80);
}void HDC2080_Trigger()
{HDC2080_WR_Reg(0xF, 1);
}void HDC2080_Cfg()
{/* RESET */HDC2080_Reset();HAL_Delay(5);/* enable temperature threhold interrupt */HDC2080_WR_Reg(0x07, 0x60);/* configure temperature threhold */HDC2080_WR_Regs(0x0A, tempTh, 2);/* auto measure at 5 hz and set DRDY */HDC2080_WR_Reg(0x0E, 0x77);/* read all registers value */HDC2080_RD_Regs(0x00, &HDC2080_Reg.temp_low, 16);/* read id values */HDC2080_RD_Regs(0xFC, &HDC2080_Reg.id0_low, 4);
}uint8_t HDC2080_Init()
{uint8_t ret = 0;HDC2080_RD_Reg(0xFF, &HDC2080_Reg.id1_high);if (HDC2080_Reg.id1_high != 0x7){ret = 1;}else{HDC2080_Cfg();HDC2080_Trigger();}return ret;
}void HDC2080_RD_Temperature(float* temp)
{HDC2080_RD_Regs(0x00, &HDC2080_Reg.temp_low, 2);*temp = (float)(HDC2080_Reg.temp_low + HDC2080_Reg.temp_high * 256) / 65536.0f * 165.0f - 40.5f;
}void HDC2080_RD_Humidity(float* humid)
{HDC2080_RD_Regs(0x02, &HDC2080_Reg.humid_low, 2);*humid = (float)(HDC2080_Reg.humid_low + HDC2080_Reg.humid_high * 256) / 65536.0f * 165.0f - 40.5f;
} 