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

相关推荐
FreakStudio9 天前
W55MH32L-EVB 上手测评:硬件 TCP/IP 加持的以太网单片机,MicroPython 零门槛开发
python·单片机·嵌入式·大学生·面向对象·并行计算·电子diy·电子计算机
✎ ﹏梦醒͜ღ҉繁华落℘14 天前
单片机基础知识---stm32单片机的优先级
stm32·单片机·mongodb
zd84510150014 天前
RS485 总线详解
单片机·嵌入式硬件
✎ ﹏梦醒͜ღ҉繁华落℘14 天前
编程基础 --高内聚,低耦合
c语言·单片机
科芯创展14 天前
1A,1MHz,30VIN,XZ4115,降压恒流LED驱动芯片
单片机·嵌入式硬件
集芯微电科技有限公司14 天前
四通道2A输出集成功率电感降压模块专为紧凑型方案设计
人工智能·单片机·嵌入式硬件·生成对抗网络·计算机外设
踏着七彩祥云的小丑14 天前
嵌入式测试学习第 37 天:异常场景测试:断电、拔插、干扰、非法指令
单片机·嵌入式硬件·学习
意法半导体STM3214 天前
【官方原创】如何为STM32CubeMX2配置Visual Studio Code配置方案
vscode·stm32·单片机·嵌入式硬件·策略模式·stm32cubemx·嵌入式开发
雾削木14 天前
B语言经典教程现代化重构
java·前端·stm32·单片机·嵌入式硬件
Hello-FPGA14 天前
Camera Link 与 CoaXPress 技术对比 如何选择你的相机接口
单片机·嵌入式硬件