高精度数字温度芯片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与TMP117、TMP112关键参数对比
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(微信同号)
