超、超、超小型温度传感器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,温度测量输出如下:

相关推荐
Meraki.Zhang1 小时前
【STM32实践篇】:STM32CubeMX 的使用
stm32·单片机·嵌入式软件
yuanjj883 小时前
域格移芯平台模块FTP下载应用
单片机·物联网·网络协议
古译汉书4 小时前
嵌入式笔记(个人总结)
数据结构·笔记·stm32·单片机·嵌入式硬件
bai5459365 小时前
STM32 定时器(Timer)
stm32·单片机·嵌入式硬件
Bona Sun18 小时前
单片机手搓掌上游戏机(十四)—pico运行fc模拟器之电路连接
c语言·c++·单片机·游戏机
学生哥-_-18 小时前
STM32点亮WS2812 RGB灯板展示像素图片(一种较方便的取色值数据的方法)
stm32·单片机·嵌入式硬件
西欧伯爵18 小时前
模拟电路入门四
单片机·嵌入式硬件·集成电路
逆小舟19 小时前
【STM32】手把手教你完成“天气预报项目”
stm32·单片机·嵌入式硬件
cjy_Somnr1 天前
keil5报错显示stm32的SWDIO未连接不能烧录
stm32·单片机·嵌入式硬件