1、特性
超小型,超薄 PicoStar™ 封装,尺寸:0.55 × 0.61 × 0.24mm
电源电压范围:1.4V 至 5.5V
16 位分辨率:0.0078125°C (LSB)
1.4μA 平均电流,1Hz 转换周期 -- 睡眠电流 65nA
I2C接口
2、引脚与封装

3、I2C地址

TMP118,不同的后缀,地址不同,本次测试的是TMP118B,所以I2C地址为0x49。
4、寄存器说明

寄存器也很简洁,只有8个寄存器,主要需要关注温度寄存器(0h)、配置寄存器(1h)、器件ID寄存器(Bh)。

读出来的数据是数字量,乘以0.0078125,就是实际测量的温度。

配置寄存器主要配置转换速率、平均使能位等,使用默认配置也可以。

器件ID是0x1180,可以用于检查设备是否在线,验证i2c通讯时序。
5、核心代码
寄存器、i2c地址、设备id等定义如下:
#define TMP118_I2C_BUS 1 /* I2C总线 */
#define TMP118_I2C_ADDR 0x49 /* TTMP118B 0x49 */
#define TMP118_DEV_ID 0x1180 /* 器件ID */
#define TMP118_LSB_VAL 0.0078125 /* 分辨率 */
#define TMP118_REG_RES 0x00 /* 结果寄存器 */
#define TMP118_REG_CONF 0x01 /* 配置寄存器 */
#define TMP118_REG_LOW_LIMIT 0x02 /* 下限寄存器 */
#define TMP118_REG_HIGH_LIMIT 0x03 /* 上限寄存器 */
#define TMP118_REG_DEV_ID 0x0B /* ID寄存器 */
#define TMP118_REG_UNQ_ID0 0x0C /* 唯一ID寄存器0 */
#define TMP118_REG_UNQ_ID1 0x0D /* 唯一ID寄存器1 */
#define TMP118_REG_UNQ_ID2 0x0E /* 唯一ID寄存器2 */
/* TMP118_REG_CONF */
#define TMP118_ONE_SHOT (1 << 15) /* 单次触发 */
/* 故障计数 */
/* 0:1个故障
1:2个故障
2:4个故障
3:6个故障
*/
#define TMP118_FAULT_CNT(x) (((x) & 0x3) << 11)
#define TMP118_ALERT_POLARITY (1 << 9) /* 极性为高电平有效 */
#define TMP118_SHUT_DOWN (1 << 8) /* 关断模式 */
/* 转换速率 */
/* 0:0.25HZ
1:1HZ
2:4HZ
3:8HZ
*/
#define TMP118_CON_RATE(x) (((x) & 0x3) << 6)
/* 平均使能位 */
/* 0:无均值计算
1:4次
2:8次
3:移动4次
*/
#define TMP118_AVE_CNT(x) (((x) & 0x3) << 2)
读写函数实现如下:
//tmp118读
static int tmp118_read(int bus, uint8_t reg, void *buff, int len) {
int ret;
/* 传输开始 */
si2c_start(bus);
/* 传输从设备地址以进行写操作 */
if (si2c_select(bus, TMP118_I2C_ADDR, SI2C_OP_WRITE) != 0) {
si2c_stop(bus);
return 0;
}
/* 写设备地址 */
if (si2c_tx(bus, ®, sizeof(reg)) != sizeof(reg)) {
si2c_stop(bus);
return 0;
}
/* 传输开始 */
si2c_start(bus);
/* 传输从设备地址以进行读操作 */
if (si2c_select(bus, TMP118_I2C_ADDR, SI2C_OP_READ) != 0) {
si2c_stop(bus);
return 0;
}
/* 接收数据 */
ret = si2c_rx(bus, buff, len);
/* 传输停止 */
si2c_stop(bus);
return ret;
}
//tmp118写
static int tmp118_write(int bus, uint8_t reg, void *buff, int len) {
int ret;
/* 传输开始 */
si2c_start(bus);
/* 传输从设备地址以进行写操作 */
if (si2c_select(bus, TMP118_I2C_ADDR, SI2C_OP_WRITE) != 0) {
si2c_stop(bus);
return 0;
}
/* 写寄存器地址 */
if (si2c_tx(bus, ®, sizeof(reg)) != sizeof(reg)) {
si2c_stop(bus);
return 0;
}
/* 写数据 */
ret = si2c_tx(bus, buff, len);
/* 传输停止 */
si2c_stop(bus);
return ret;
}
读设备ID:
static int tmp118_read_id(int bus) {
uint8_t val_8[2];
uint16_t val_16;
tmp118_read(bus, TMP118_REG_DEV_ID, (uint8_t *)&val_8, 2);
val_16=(val_8[0] << 8) + val_8[1];
if (val_16 != TMP118_DEV_ID) {
return -1;
}
return 0;
}
复位tmp118:
static void tmp118_reset(int bus) {
uint8_t val[2];
val[0] = 0x00;
val[1] = 0x06;
si2c_start(bus);
si2c_tx(bus, val, sizeof(val));
si2c_stop(bus);
}
读温度,周期性调用即可:
void tmp118_temp_read(void) {
int8_t val[2];
int bus = TMP118_I2C_BUS;
float temp;
tmp118_read(bus, TMP118_REG_RES, (uint8_t *)&val, 2);
temp = ((val[0] << 8) + val[1]) * TMP118_LSB_VAL;
dbg_info(" %0.2f", temp);
}
初始化:
void tmp118_init(void) {
uint8_t val_8[2];
uint16_t val_16 = 0;
int bus = TMP118_DEV_START;
si2c_init(bus); //i2c接口初始化
tmp118_reset(bus);
delay_ms(10);
if (tmp118_read_id(bus)) {
dbg_info("tmp118B %d err \r\n", bus);
return;
}
tmp118_read(bus, TMP118_REG_CONF, &val_8, 2);
val_16 = (val_8[0] << 8) + val_8[1];
val_16 |= TMP118_CON_RATE(3); //配置转换速率
val_8[0] = (val_16 >> 8) & 0xff;
val_8[1] = (val_16 >> 0) & 0xff;
tmp118_write(bus, TMP118_REG_CONF, &val_8, 2);
}
6、I2C驱动

可以看出TMP118对时序要求不高,在I2C标准模式下,支持1KHZ到100KHZ的速率。因此本文使用软件模拟I2C,抓取时序如下:

7、现象
实际测试的时候,接了3个tmp118,温度测量输出如下:
