一、简介
TMP75芯片是一款数字温度传感器,由德州仪器生产,它具有高精度、低功耗和小尺寸等优点,广泛应用于电子设备、通信系统、汽车电子、医疗设备等领域的温度测量。
.可选地址:8个(硬件配置)
.接口:兼容I2C和SMBUS,
.分辨率:9~12位,
.精度:-40~125C°
.工作电压:2.7~5.5V
图1.0 芯片引脚框图
TMP75温度寄存器为12位只读寄存器,所以一般要读取两个字节,低12位表示温度值,负数以补码的形式呈现。
图1.1 12位温度值对照表
TMP75芯片有8个地址可选,由硬件配置A1、A2、A3的引脚电平。
图1.2 TMP75硬件可选地址对照表
二、代码
tmp75源文件
#include "tmp75.h"
#include "bsp_iic.h"
#include "esp_log.h"
static const char *TAG = "tmp75";
/**
* @brief 往TEM75写一个字节函数
* @param
* @arg dev_addr: 器件地址
* @arg reg_addr: 寄存器地址
* @arg write_data: 写入的数据
* @retval
* @arg ESP_OK:写入成功 ESP_FAIL:写入失败
**/
static esp_err_t TEM75_WriteByte(uint8_t dev_addr,uint8_t reg_addr,uint8_t write_data)
{
#if I2C_HARDWARE
return I2C_Master_WriteByte(dev_addr,reg_addr,write_data,200);
#else
EspI2cWriteByte(dev_addr,reg_addr,write_data);
return ESP_OK;
#endif
}
/**
* @brief 读取TEM75一个字节函数
* @param
* @arg dev_addr: 器件地址
* @arg reg_addr: 寄存器地址
* @arg read_data: 读取的数据
* @retval
* @arg ESP_OK:读取成功 ESP_FAIL:读取失败
**/
static esp_err_t TMP75_ReadByte(uint8_t dev_addr,uint8_t reg_addr,uint8_t *read_data)
{
#if I2C_HARDWARE
return I2C_Master_ReadByte(dev_addr,reg_addr,read_data,1000);
#else
EspI2cReadByte(dev_addr,reg_addr,read_data);
return ESP_OK;
#endif
}
/**
* @brief 读取TEM75两个字节函数
* @param
* @arg dev_addr: 器件地址
* @arg reg_addr: 寄存器地址
* @arg *read_data: 读取的数据
* @arg read_len: 读取的长度
* @retval
* @arg ESP_OK:读取成功 ESP_FAIL:读取失败
**/
static esp_err_t TMP75_ReadBytes(uint8_t dev_addr,uint8_t reg_addr,uint8_t *read_data)
{
#if I2C_HARDWARE
return I2C_Master_ReadBytes(dev_addr,reg_addr,read_data,2,1000);
#else
EspI2cReadBytes(dev_addr,reg_addr,read_data,2);
return ESP_OK;
#endif
}
/**
* @brief 获取TEM75温度函数
* @param
* @arg dev_addr: 器件地址
* @retval
* @arg 获取的温度值
**/
float TMP75_GetTemprature(uint8_t dev_addr)
{
uint8_t read_data[2] = {0};
uint16_t reg_value = 0;
float temp_value = 0.0;
if(TMP75_ReadBytes(dev_addr,TEMPERATURE_REGISTER,&read_data) == ESP_OK)
{
reg_value = (uint16_t)((read_data[0] << 8) | read_data[1]) >> 4 ;
if(reg_value & 0x800)
{
reg_value = (~reg_value + 1) & 0xfff;
temp_value = reg_value * 0.0625 * -1;
}
else
{
temp_value = reg_value * 0.0625;
}
}
else
{
ESP_LOGI(TAG,"read tmp75 data fail\n");
}
return temp_value;
}
tmp75头文件
#ifndef _TMP75_H_
#define _TMP75_H_
#include "stdio.h"
#define TMP75_SENSOR_ADDR 0X48
#define TEMPERATURE_REGISTER 0X00
#define CONFIGURATION_REGISTER 0X01
float TMP75_GetTemprature(uint8_t dev_addr);
#endif /* TMP75_H_ */