Dear Expert:
I have question using TMP102. When measuring temperature, originally, the captured temp. value starts from room temperature (25 degree).
The captured value varies with temperature rise till the temperature over 29 degree to 30 degree. The readout becomes 0 after temperature
readout over ~30 degree. The stm32f arm source code is as attached.
void I2c_Config(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
I2C_InitTypeDef I2C_InitStructure;
/* I2C1 GPIO Config
PB6 -------> I2C1 SCL
PB7 -------> I2C1 SDA
*/
RCC_AHBPeriphClockCmd( RCC_AHBPeriph_GPIOB , ENABLE);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6 | GPIO_Pin_7;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;
GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOB, &GPIO_InitStructure);
GPIO_PinAFConfig(GPIOB, GPIO_PinSource6, GPIO_AF_4);
GPIO_PinAFConfig(GPIOB, GPIO_PinSource7, GPIO_AF_4);
RCC_I2CCLKConfig(RCC_I2C2CLK_SYSCLK);
RCC_APB1PeriphClockCmd( RCC_APB1Periph_I2C1 | RCC_APB1Periph_I2C2, ENABLE);
I2C_InitStructure.I2C_Mode = I2C_Mode_I2C;
I2C_InitStructure.I2C_AcknowledgedAddress = I2C_AcknowledgedAddress_7bit;
I2C_InitStructure.I2C_AnalogFilter = I2C_AnalogFilter_Enable;
I2C_InitStructure.I2C_DigitalFilter = 0x00;
I2C_InitStructure.I2C_OwnAddress1 = 0x00;
I2C_InitStructure.I2C_Ack = I2C_Ack_Enable;
I2C_InitStructure.I2C_Timing = 0x00201D2B;
I2C_Init(I2C1, &I2C_InitStructure);
I2C_Cmd(I2C1, ENABLE);
}
void Ic_Tmp102_I2c_Rd (I2C_TypeDef* I2Cx,unsigned char Slave_Addr, unsigned char Command_Addr, unsigned char *data0,unsigned char *data1)
{
/* Test on BUSY Flag */
gI2C_Timeout = dI2C_TIMEOUT;
while(I2C_GetFlagStatus(I2Cx, I2C_ISR_BUSY) != RESET)
{
if((gI2C_Timeout--) == 0)
return dI2C_CHECK_FAIL;
}
I2C_TransferHandling(I2Cx, Slave_Addr, 1, I2C_SoftEnd_Mode, I2C_Generate_Start_Write);
gI2C_Timeout = dI2C_TIMEOUT;
while(I2C_GetFlagStatus(I2Cx, I2C_ISR_TXIS) == RESET)
{
if((gI2C_Timeout--) == 0)
return dI2C_CHECK_FAIL;
}
I2C_SendData(I2Cx, (uint8_t)Command_Addr);
gI2C_Timeout = dI2C_TIMEOUT;
while(I2C_GetFlagStatus(I2Cx, I2C_ISR_TC) == RESET)
{
if((gI2C_Timeout--) == 0)
return dI2C_CHECK_FAIL;
}
I2C_TransferHandling(I2Cx, Slave_Addr, 2, I2C_AutoEnd_Mode, I2C_Generate_Start_Read);
gI2C_Timeout = dI2C_TIMEOUT;
while(I2C_GetFlagStatus(I2Cx, I2C_ISR_RXNE) == RESET)
{
if((gI2C_Timeout--) == 0)
return dI2C_CHECK_FAIL;
}
*data0= I2C_ReceiveData(I2Cx);
gI2C_Timeout = dI2C_TIMEOUT;
while(I2C_GetFlagStatus(I2Cx, I2C_ISR_RXNE) == RESET)
{
if((gI2C_Timeout--) == 0)
return dI2C_CHECK_FAIL;
}
*data1= I2C_ReceiveData(I2Cx);
gI2C_Timeout = dI2C_TIMEOUT;
while(I2C_GetFlagStatus(I2Cx, I2C_ISR_STOPF) == RESET)
{
if((gI2C_Timeout--) == 0)
return dI2C_CHECK_FAIL;
}
I2C_ClearFlag(I2Cx, I2C_ICR_STOPCF);
return dI2C_CHECK_OK;
}
The waveform seems no problem
Thank you!
Brian