Part Number:TMP112Other Parts Discussed in Thread: TMP102
在手册中描述的是比Thigh高时,LSB为1(slave address返回0x91),比Tlow低时,LSB为0(slave address返回0x90)。
请问为什么我在使用中是比Thigh高时,LSB为0(slave address返回0x90),比Tlow低时,LSB为1(slave address返回0x91)。(配置TM=1,POL=0, 配置寄存器为0x62A0)
同时读取温度寄存器中的值为正常值。 0x1f00>0x1e90.(设置高温阈值为0x1f00,低温阈值为0x1ea0)
谢谢
Kailyn Chen:
您好,是的,您理解的没错,datasheet中描述的意思是当温度大于Thigh时,LSB应该为1,即0x91,如果温度低于Tlow,LSB为0,返回值为0x90.
Thigh=0x1f00,Tlow=0x1ea0。
实际读取的寄存器的值为多少?0x1e90吗?如果是的话,那就将0x1e90 与Thigh和Tlow对比。
实际温度 0x1e90<Tlow. 所以LSB=0,读取为0x90是没问题的。
,
Kailyn Chen:
换句话说,温度寄存器的值如果大于Thigh,那肯定也是大于Tlow的,此时返回值就为0x91.
如果温度寄存器的值小于Tlow,那肯定也是低于Thigh的,此时返回值就为0x90.
您目前读取的值为0x1e90<Tlow, 那肯定也是小于Thigh的,此时应该返回0x90.
,
t sw:
您好,实际温度为0x1e90时,此时数值比设置的Tlow低,返回的值却为0x91,LSB为1,如问题的第二张图所示(第二个红框0x91)。 当数值比Thigh高时,返回的则是0x90(LSB为0)。
这与手册和您描述的规则相反,(配置位TM=1,POL=0)。请问这是哪里出了问题? 谢谢!
#define Config_REG 0x01 #define ADDR_TMP_WRITE 0x90 #define ADDR_TMP_READ 0x91 #define TEMP_REG 0x00 #define TEMPH_REG 0x03 #define TEMPL_REG 0x02 #define ALERT_COM 0x19uint8_t Config[2]={0x62,0xA0}; uint8_t TEMPH_con[2]={0x1f,0x00}; uint8_t TEMPL_con[2]={0x1e,0xA0}; uint8_t slave_address[1]; uint8_t TEMP_READ[2];int main(void){HAL_Init(); MX_GPIO_Init(); SystemClock_Config(); MX_I2C2_Init(); HAL_I2C_MspInit(&hi2c2);HAL_I2C_Mem_Write(&hi2c2,ADDR_TMP_WRITE,Config_REG,I2C_MEMADD_SIZE_8BIT,Config,2,2000);HAL_I2C_Mem_Write(&hi2c2,ADDR_TMP_WRITE,TEMPH_REG,I2C_MEMADD_SIZE_8BIT,TEMPH_con,2,2000);HAL_I2C_Mem_Write(&hi2c2,ADDR_TMP_WRITE,TEMPL_REG,I2C_MEMADD_SIZE_8BIT,TEMPL_con,2,2000);}void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin)\\下降沿检测检测检测,PULL-UP {if(GPIO_Pin==ALERT_Pin){HAL_I2C_Master_Receive(&hi2c2, ALERT_COM,slave_address,1,1000);HAL_I2C_Master_Transmit(&hi2c2, ADDR_TMP_WRITE,TEMP_REG,1,1000);//TMP return slave address 8-bit lengthHAL_I2C_Master_Receive(&hi2c2, ADDR_TMP_READ,TEMP_READ,2,1000);printf("0x%02x",slave_address[0]);if(slave_address[0]==0x91){printf("High Temperature");for(i=0;i<2;i++){printf("0x%02x",TEMP_READ[i]);printf("\n\r");}}if(slave_address[0]==0x90){printf("low Temperature:");for(i=0;i<2;i++){printf("0x%02x",TEMP_READ[i]);printf("\n\r");}}__HAL_GPIO_EXTI_CLEAR_IT(ALERT_Pin); }
,
Kailyn Chen:
好的,有时序图吗?类似FIgure 13的这种时序图。读取SMBus ALERT command (0001 1001) 地址之后,看收到的slave address是多少?
,
t sw:
你好,我是软件的同学,没有示波器能读取波形。上图是我的串口log读取信息
1.配置寄存器配置为:0x62a0 (其中OS设置为0,R1,R2 bit是只读bit,F1,F0设置为0,POL设置为0,TM设置为1(表示设置为interrupt mode),SD设置为0,CR1设置为1,CR0设置为0,AL为只读bit位,EM设置位0)
2.高温阈值寄存器设置为:0x1f00
3.低温阈值寄存器设置为:0x1ea0
我用手触碰TMP112表面会使温度升高且当温度超过高温阈值的时候,MCU会进入中断,slave address 返回值却为0x90(LSB为0,根据手册应该为1),当我松开手指,TMP112会缓慢降温直至低于低温阈值,通过ALERT COMMAND=0x19读取slave address返回值为0x91(LSB为1,根据手册应该为0)。上图log信息中也能看出当slave address返回0x90时,当前温度是超过高温阈值的。当返回0x91时,温度低于低温阈值。这与手册和您描述的相反
请问能否帮我解决这个LSB返回错误的问题么,谢谢
,
Kailyn Chen:
抱歉回复晚了,您的这个问题我这边再看一下。 尽快回复给您。
,
t sw:
你好,请问问题解决了吗,或者有什么思路可以分享?
,
Kailyn Chen:
抱歉回复晚了, 我想问下TMP112上电时,SCL或SDA没有信号吧?如果上电还没起来到稳定,主机已经提供给SCL信号了那有可能会导致通信失败。
建议是等上电起来稳定之后再给SCL。
,
t sw:
你好,不知道你是否能够理解之前我的描述:
如图所示:我通过写入并读取对应寄存器的值,并将读取的寄存器值打印在log信息中以确定对应寄存器中的值被我成功写入
TMP112温度寄存器配置为0x62a0
高温阈值配置为:0x1f00
低温阈值配置:0x1ea0
当前温度读取:0x1db0 (温度读取随TMP112环境温度变化而变化)
当我在外部使TMP112周围环境温度升温并超过之前设置的高温阈值时,TMP112的ALERT管脚能够成功进行高温报警(拉低ALERT管脚,使得host能够监测到这一动作以进入中断),在中断里,我通过读取ALERT ADDRESS的地址,能够得到返回的slave address:0x90(LSB为0), 但这个值与手册中所描述的不相符,手册中描述为0x91,对应的是此时高温报警的ALERT COMMAND返回值
当撤掉外部热源使TMP112周围环境温度低于设置的低温阈值时,TMP112的ALERT管脚能够进行低温报警,此时读取ALERT COMMAND返回值为0x91.手册中描述为低温报警的AELRT COMMAND返回值却为0x90.
这个现象与预期不符。
请问这样描述你能够理解么或者说有说什么问题不清楚的请随时回复我, 谢谢!
,
Kailyn Chen:
能明白您的问题,就是说当测试温度高于Thigh阈值时,slave address 的LSB应该返回1,但测试的温度低于Tlow阈值时,LSB应该为0。
目前您测试正好相反,读取的值和数据手册相符,我前几天查看了下前几版的数据手册,也都是这样描述的。
I2C返回值不对,还是I2C的时序或者通讯问题。
关于您的问题,
1. 初始化的时候配置寄存器的POL bit 是默认配置0还是1?
2. ALert 模式下,当温度超过Thigh或者低于Tlow的时候,ALert pin 是否拉低?(POL=0,Alert=0. POL=1的话,ALert极性相反=H)
3. 读取配置寄存器byte2的AL bit,这是个只读位。看下面的介绍,当POL=0, Alert bit读取的值为1,直到测量的温度大于或等于Thigh时,AL bit读取为0.
并且AL bit保持为0直到测量的温度低于Tlow时,ALbit 读取的值为1. 所以 我想这是为什么当温度大于Thigh时读取LSB为0, 小于Tlow时读取的LSB为1,返回值的状态位应该就是AL bit的值。
,
t sw:
您好,
1.初始化的时候配置寄存器的POL bit为0,配置时没有改动
2.因为默认的POL=0,当温度超过阈值时,ALert pin是拉低的
3.AL bit的行为会随着POL配置变化而变化。当POL=0时,温度大于Thigh时LSB为0,温度小于Tlow时LSB为1
当POL=1时,温度大于Thigh时LSB为1,温度小于Tlow时LSB为0.
我想问的是,图片内红框内描述的是POL=0的场景还是POL=1的场景?
因为POL=0是默认的,我觉得描述的是POL=0的场景,所以会对LSB返回值有疑问。
如果描述的是POL=0的场景,那么目前的现象与手册相反,请问有什么方法可以解决这个问题么?
谢谢
,
Kailyn Chen:
您好,这个描述是POL =0默认情况下的配置。
另外,根据您的描述,Alert pin的状态也是没问题的,和datasheet相符。
AL bit读取的也是 和datasheet 描述一致,当POL=0时,温度大于Thigh时LSB为0,温度小于Tlow时LSB为1
只有LSB的返回值这里和datasheet描述不符, 这样的话,我需要和编撰datasheet的team去核实一下,是不是datasheet这里描述反了。
我翻看了之前几个版本的TMP112的数据手册,这里的描述都是一样的,所以我需要去确认一下。
,
Kailyn Chen:
关于这个问题,我们需要测试实际验证一下,一旦得到结果,会及时给您回复。
给您带来不便非常抱歉。
,
Kailyn Chen:
您好,抱歉这个问题由于实际验证,再加上国庆假期,回复晚了。
您的理解是正确的,这里是POL=0默认的情况,我们参考TMP102的数据手册,可以看到当POL =0时,温度大于Thigh时LSB为0。这是正确的。
所以您的结论是正确的, 因为您使用的也是默认配置POL=0.所以LSB为零。 TMP112的数据手册这里写的模糊,后续我们会更新最新版本的数据手册。给您带来不便非常抱歉。