超、超、超小型温度传感器TMP118

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, &reg, 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, &reg, 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,温度测量输出如下:

相关推荐
Coding Peasant20 小时前
GD32E230 I2C从机功能深度解析与实现指南
c语言·stm32·单片机·mcu·arm
214实验室1 天前
STM32串口打印使用printf乱码问题
stm32·单片机·嵌入式硬件
沐欣工作室_lvyiyi1 天前
基于单片机的电厂烟道粉尘浓度检测系统(论文+源码)
单片机·嵌入式硬件·毕业设计
Groundwork Explorer1 天前
异步框架+POLL混合方案应对ESP32 MPY多任务+TCP多连接
python·单片机
d111111111d1 天前
什么是内存对齐?在STM32上面如何通过编辑器指令来实现内存对齐。
笔记·stm32·单片机·嵌入式硬件·学习·编辑器
bai5459361 天前
STM32 CuberIDE 中断
stm32·单片机·嵌入式硬件
小叶子来了啊1 天前
5Arduino 程序结构
单片机·嵌入式硬件
小叶子来了啊1 天前
1Arduino 简介
单片机·嵌入式硬件
雾岛听风眠1 天前
电路板维修
单片机·嵌入式硬件
少一倍的优雅1 天前
hi3863(WS63) 智能小车 (一) 简单介绍
单片机·嵌入式硬件·harmonyos·hi3863