• 发文
  • 评论
  • 微博
  • 空间
  • 微信

T117替代TMP117/TMP112应用指南

工采网电子元件 2026-05-15 10:21 发布于广东 发文

高精度数字温度芯片T117系列(以下简称“T117”),硬件上Pin to Pin兼容替代市场上广泛应用的TMP117、功能替代TMP112产品,并在多项关键指标上具备差异化优势。T117在保持I²C通信接口的基础上,针对国内用户使用习惯与系统兼容性进行了优化,助力客户快速完成国产替代方案的切换。

本文档旨在帮助工程师、采购及管理人员快速掌握T117的技术参数、对比优势、设计迁移步骤及量产应用中的注意事项,并提供参考代码,降低移植成本,以实现平滑、高效的产品替代与升级。

T117产品简介

T117是敏源传感推出的一款高精度数字模拟混合信号温度传感芯片,基于CMOS半导体PN结与带隙电压原理,内部集成了信号放大、16-bit ADC和数字校准补偿单元。芯片出厂前经过100%测试与校准,用户无需额外校准即可直接使用。

技术优势:

高精度与宽温区:最高测温精度可达±0.1℃,测温范围覆盖-103℃至+153℃,在同尺寸封装中达到领先水平。低功耗:典型待机电流仅01μA,平均功耗低至2μA(AVG=8,1次/秒),显著降低系统自发热与总功耗。双接口灵活选择:标准I²C接口(最高支持1MHz通信速率)和单总线接口(-OW后缀型号),兼容不同设计需求,便于移植与升级。内置非易失性存储:内置112bit E2PROM(高于TMP117的48bit),可保存芯片ID、报警阈值、校准修正值乃至用户自定义信息(如传感器节点编号),掉电后不丢失。硬件报警引脚:提供ALERT引脚,可实现超限温度硬件报警,无需软件轮询,提高系统响应速度。丰富的产品型号选择:

T117针对不同应用精度区间、接口与成本,提供多款版型选择,方便替代时“按需选型”。

二、T117与TMP117TMP112关键参数对比

T117与TI的TMP117、TMP112主要在以下方面形成差异化优势:

核心选型建议

如果应用集中在医疗级体温测量(+35℃~+42℃),T117在相同±0.1℃精度下,能够提供更窄但更精准的温度区间优化,降低系统误报率。如果系统需求“超低温测温”(如-103℃冷链监测),T117是唯一可在单芯片内覆盖此范围的数字温度芯片。T117支持芯片自诊断功能,可在上电或周期性工作时自测内部关键电路,提前预警潜在失效,该特性尤其适用于工业与汽车级应用。

此外,TI对温度传感器产品线的停产调整周期不固定,而T117作为国产芯片,供应链更稳定、交付周期短,能帮助用户有效规避“无芯可用”的风险。

三、T117Pin-to-Pin替代TMP117软硬件说明

1、硬件兼容性:无缝迁移

引脚对应关系:

2、典型应用电路区别

T117与TMP117/TMP112典型应用电路区别如下表所示。

3、I2C地址区别

T117与TMP117/TMP112的I2C地址分别如下表所示。

4、测温读温指令流程区别

T117与TMP117/TMP112的测温、读温指令流程区别如下表所示。

5、代码修改

(1)修改指令流程函数

#define GPIOI2C_XFER_LASTNACK         ((uint8_t)0x00)      !< No error      

#define GPIOI2C_XFER_ADDRNACK         ((uint8_t)0x01)      !< No Device     

#define GPIOI2C_XFER_ABORTNACK        ((uint8_t)0x02)      !< NACK before last byte

#define GPIOI2C_XFER_LASTACK          ((uint8_t)0x04)      !< ACK last byte

#define GPIOI2C_ACK         ((uint8_t)1)

#define GPIOI2C_NACK    ((uint8_t)0)

#define I2CWRITE_MASK           ((uint8_t)0xFE)

#define I2CREAD_MASK            ((uint8_t)0x01)

*-----------------------------------------------------------------------

  * @brief  T117发送指令函数

  * @param  DeviceAddr:地址  reg:寄存器地址  Data:写入数据

  * @retval 是否传输成功

-------------------------------------------------------------------------

uint8_t T117I2C_Transmit(uint8_t DeviceAddr, uint8_t reg, uint8_t Data)

{

uint8_t ret=GPIOI2C_XFER_LASTACK;

I2C_Start();

if(I2C_master_write((DeviceAddr<<1) & I2CWRITE_MASK)==GPIOI2C_NACK)

{

I2C_Stop();

return GPIOI2C_XFER_ADDRNACK;

}

if(I2C_master_write(reg)==GPIOI2C_NACK)

{

I2C_Stop();

return GPIOI2C_XFER_ABORTNACK;

}

if(I2C_master_write(Data)==GPIOI2C_NACK)

{

I2C_Stop();

return GPIOI2C_XFER_ABORTNACK;

}

I2C_Stop();

return ret;

}

 

*-----------------------------------------------------------------------

  * @brief  T117数据接收函数

  * @param  DeviceAddr:地址  reg:寄存器地址  pData:读取数据

  * @retval 是否传输成功

-------------------------------------------------------------------------

uint8_t T117I2C_Receive(uint8_t DeviceAddr, uint8_t reg,uint8_t *pData)

{

I2C_Start();

if(I2C_master_write((DeviceAddr<<1) & I2CWRITE_MASK)==GPIOI2C_NACK)

{

I2C_Stop();

return GPIOI2C_XFER_ADDRNACK;

}

if(I2C_master_write(reg)==GPIOI2C_NACK)

{

I2C_Stop();

return GPIOI2C_XFER_ABORTNACK;

}

I2C_reStart();

if(I2C_master_write((DeviceAddr<<1) | I2CREAD_MASK)== GPIOI2C_NACK)

{

I2C_Stop();

return GPIOI2C_XFER_ABORTNACK;

}

(*pData)=I2C_master_read(GPIOI2C_NACK);

I2C_Stop();

return GPIOI2C_XFER_LASTNACK;

}

 

(2)修改测温、读温指令

在应用层头文件中加入:

#define I2C_ADDR    0x41   Addr 0x40 0x41 0x42 0x43

AVG_1     //转换时间2.1ms

AVG_8   //转换时间5.2ms

AVG_16    //转换时间8.5ms

AVG_32    //转换时间15.3ms

考虑到不同用户的单片机延时偏差,预留2ms以保证转换时间充分

#define tCon_A1 4 ms.

#define tCon_A8 7 ms.

#define tCon_A16 10 ms.

#define tCon_A32 17 ms.

typedef enum 

{

//Temp_Cmd

//测温模式

CONTI_CONVERT         = 0x00,   //连续测量温度

STOP_CONVERT          = 0x40,   //停止测量温度

SINGLE_CONVERT       = 0xc0,   //单次测量温度

//加热模式

OFF_HEATING           = 0xf0,   //低位清0,加热关闭

ON_HEATING           = 0x0A, //加热开启

//Temp_Cfg

//测温频率

FRE_8times           = 0x00,   //每秒8次

FRE_4times           = 0x20,   //每秒4次

FRE_2times           = 0x40,   //每秒2次

FRE_1times           = 0x60,   //每秒1次

FRE_2s               = 0x80,   //每2秒1次

FRE_4s               = 0xa0,   //每4秒1次

FRE_8s               = 0xc0, //每8秒1次

FRE_16s               = 0xe0, //每16秒1次

//平均次数

AVG_1                = 0xe7,   //位清0,转换时间2.1ms

AVG_8               = 0x08,   //转换时间5.2ms

AVG_16                = 0x10,   //转换时间8.5ms

AVG_32                 = 0x18,   //转换时间15.3ms

//低功耗模式

OFF_PD                 = 0xfe,   //位清0,不进入低功耗模式

ON_PD                 = 0x01,   //进入低功耗模式

//EE_Cmd

EE_DOWN               = 0xb6,   //装载EE值到寄存器

EE_COPY            = 0x08,   //将寄存器中数值保存到EE中

EE_RESET              = 0x6a,   //软复位,装载EE值到寄存器,与EE对应的部分,寄存器值恢复到EE保存值,不与EE对应的部分,寄存器值恢复到默认值

//Alert_Mode

//报警开关

OFF_ALERT              = 0x00,   //清0,报警关

ON_ALERT             = 0x80,   //报警开

//Mode

TL_CLEAR           = 0xbf,   //位清0,TL为报警清除门限阈值

TL_ALERT           = 0x40,   //TL为报警门限下阈值

//极性

ALERT_LO           = 0xdf,   //位清0,低电平有效

ALERT_HI           = 0x20,   //高电平有效

//报警端口模式选择

ALERT_IO           = 0xef,   //位清0,用作温度报警

CONVERT_FINI           = 0x10,   //用作测温完成标志

} I2C_CMD;

 

typedef enum 

{

Temp_lsb              = 0x00,   

Temp_msb              = 0x01,   

Crc_temp              = 0x02,  

Status               = 0x03,   

Temp_Cmd               = 0x04,   //默认值0x40:停止测量,不加热

Temp_Cfg              = 0x05,   //默认值0x69:每秒1次,AVG_8,进入低功耗

Alert_Mode           = 0x06,   //默认值0x00:报警关,报警模式为TL解除报警,报警低电平有效,标志位表示温度报警

Th_lsb               = 0x07,

Th_msb               = 0x08,

Tl_lsb               = 0x09,

Tl_msb               = 0x0A,

Crc_scratch        = 0x0B,

User_define_0           = 0x0C,

User_define_1           = 0x0D,

User_define_2           = 0x0E,

User_define_3           = 0x0F,

User_define_4           = 0x10,

User_define_5           = 0x11,

User_define_6           = 0x12,

User_define_7           = 0x13,

User_define_8           = 0x14,

User_define_9           = 0x15,

Crc_User_define         = 0x16,

EE_Cmd                = 0x17,   //默认值0x00:无操作

Romcode1              = 0x18,

Romcode2              = 0x19,

Romcode3              = 0x1A,

Romcode4              = 0x1B,

Romcode5              = 0x1C,

Romcode6              = 0x1D,

Romcode7              = 0x1E,

crc_romcode          = 0x1F,

} REG;

 

在源文件中加入:

*-----------------------------------------------------------------------

  * @brief  启动温度测量

  * @param  无

  * @retval I2C发送状态

-------------------------------------------------------------------------

int MY_ConvertTemp(void)

{  

主发送16位命令,从以ACK响应命令的最后字节

if(T117I2C_Transmit(I2C_ADDR, Temp_Cmd, SINGLE_CONVERT) != GPIOI2C_XFER_LASTACK)

{

return 0;

}

return 1;

}

 

*-----------------------------------------------------------------------

  * @brief  等待转换结束后读测量结果

  * @param  iTemp:返回的16位温度测量结果

  * @retval I2C接收状态

-------------------------------------------------------------------------

int MY_ReadTempWaiting(uint16_t *iTemp)

{

uint8_t data[3];

读3个字节。前两个是温度转换结果,最后字节是前两个的校验和--CRC。

if(T117I2C_Receive(I2C_ADDR,  Temp_lsb, &data[0]) != GPIOI2C_XFER_LASTNACK)

{

return 0;  I2C地址头应答为NACK

}

if(T117I2C_Receive(I2C_ADDR,  Temp_msb, &data[1]) != GPIOI2C_XFER_LASTNACK)

{

return 0;  I2C地址头应答为NACK

}

if(T117I2C_Receive(I2C_ADDR,  Crc_temp, &data[2]) != GPIOI2C_XFER_LASTNACK)

{

return 0;  I2C地址头应答为NACK

}

计算接收的前两个字节的校验和,并与接收的第3个CRC字节比较。

if(data[2] != MY_CRC8(data, 2))

{

PR("CRC ERROR,%X,%X,%Xrn",data[0],data[1],data[2]);

return 0;  CRC验证失败

}

*iTemp=(uint16_t)data[1]<<8 | data[0];

return 1;

}

 

*-----------------------------------------------------------------------

  * @brief  把16位二进制补码表示的温度输出转换为以摄氏度为单位的温度读数

  * @param  out:有符号的16位二进制温度输出

  * @retval 以摄氏度为单位的浮点温度

-------------------------------------------------------------------------

float MY_OutputtoTemp(int16_t out)

{

return ((float)out/256.0 + 25.0);

}

 

*-----------------------------------------------------------------------

  * @brief  测量读取温度

  * @param  addr:IIC地址

  * @retval 无

-------------------------------------------------------------------------

void MY_Convert(void)

{

float Temp_f; uint16_t Temp_u16;

测温

MY_ConvertTemp();

MY_DELAY_MS(tCon_A8);//与配置的Temp_Cfg中的avg参数相关,Temp_Cfg默认值为0x69,AVG=8

读温

MY_ReadTempWaiting(&Temp_u16);

Temp_f = MY_OutputtoTemp((int16_t)Temp_u16);

PR("nTemp: %.2f ", Temp_f);

}

 

主函数调用示例:

#include "T117_MTS4_I2C.h"IIC地址在T117_MTS4_I2C.h文件中定义,当前定义为0x41,ADDR引脚接VDD

#include "MY_I2C_DRV.h"

int main(void)

{

GPIOI2C_Bus_Init();

数据重装载

if (T117I2C_Transmit(I2C_ADDR, EE_Cmd, 0xB8) != GPIOI2C_XFER_LASTACK)

{

T117I2C_Transmit(I2C_ADDR, EE_Cmd, 0xB8);

}

Delay_ms(2);

while (1)

{

MY_Convert();

}

}

数字温度传感芯片 - T117系列广泛应用在智能穿戴、空调、温室大棚、电子体温计、动物体温检测、医疗电子、冷链物流、热表气表水表等多领域,欢迎致电联系133 9280 5792(微信同号)

声明:本文为OFweek维科号作者发布,不代表OFweek维科号立场。如有侵权或其他问题,请及时联系我们举报。
2
评论

评论

    相关阅读

    暂无数据

    工采网电子元件

    工采电子提供关于电子元器件、模组...

    推荐商品

      举报文章问题

      ×
      • 营销广告
      • 重复、旧闻
      • 格式问题
      • 低俗
      • 标题夸张
      • 与事实不符
      • 疑似抄袭
      • 我有话要说
      确定 取消

      举报评论问题

      ×
      • 淫秽色情
      • 营销广告
      • 恶意攻击谩骂
      • 我要吐槽
      确定 取消

      用户登录×

      请输入用户名/手机/邮箱

      请输入密码