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

相关推荐
炸膛坦客7 小时前
单片机/C/C++八股:(二十六)IIC 专题(I²C)---- 上集
c语言·c++·单片机
GeekArch14 小时前
第24讲:Vibe模式代码风格控制——适配Keil/STM32工程规范
人工智能·stm32·单片机·嵌入式硬件·mcu·决策树·ai编程
Freedom_my15 小时前
STM32项目3
stm32·单片机·嵌入式硬件
国科安芯16 小时前
星间光链路:AS32S601型抗辐射MCU在空间激光通信终端控制中的技术实现
服务器·网络·单片机·嵌入式硬件·物联网·安全·信息与通信
小李不困还能学17 小时前
基于 51 单片机的8 路抢答器设计教程
单片机·嵌入式硬件·mongodb·抢答器
萌动的小火苗18 小时前
嵌入式开发中的栈与队列:任务调度为什么依赖数据结构
数据结构·c++·单片机·嵌入式硬件
振浩微433射频芯片18 小时前
工业遥控器总在关键时刻“掉链子”?——433MHz芯片方案如何破局
网络·单片机·嵌入式硬件·物联网·工业遥控
blevoice19 小时前
抖抖燃脂机单 AC6966B 主控调试踩坑:Type-C 整机供电喇叭无声排障
c语言·开发语言·单片机
三易串口屏20 小时前
三易串口屏开发教程:如何使用键盘控件输入参数并发送给单片机
单片机·嵌入式硬件·串口屏·三易串口屏·键盘控件
2CM_Embed21 小时前
F28379D 下载后 VOFA+ 无数据、Reset 后恢复:一次 TZ 中断误触发排查记录
笔记·单片机·sci·c2000·f28379d·vofa·tz