This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

TMP102 issue

Other Parts Discussed in Thread: TMP102

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

  • Hi Brian,

    Let's me review this, and get back to you soon.

    Aaron
  • Dear Aaron:

         Sorry! Forgot to put main block of the code. Below is the complete code:

    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;

    }

     

     

    int main(void)

    {

             unsigned char         Data_Msb =0, Data_Lsb =0;

             unsigned int            Data_Msb_i =0, Data_Lsb_i =0;

             unsigned int              Data=0;

             unsigned int            Data_Port_Temp=0;

     

             int                              check=0;

     

             float                           temp=0;

     

             I2c_Config();

     

             while(1)

             {

                      Ic_Tmp102_I2c_Rd (I2C1,0x90, 0x00, &Data_Msb , &Data_Lsb );

                      Data_Msb_i    =       Data_Msb;

                      Data_Lsb_i      =       Data_Lsb;

     

                      Data =((( Data_Msb_i <<8) | (Data_Lsb_i)) >>4);

                      check=( Data &0x800)>>11;

     

                      if(check==1)

                      {

                                                  Data_Port_Temp=(~ Data)&0x07ff;

                                                temp=(float)Data_Port_Temp*(float)0.0625*(float)-1;

                                                  Print_Float(temp);

                      }

                      else

                      {

                                                  Data_Port_Temp=( Data &0x07ff);

                                                  temp=(float)Data_Port_Temp*(float)0.0625;

                                                  Print_Float(temp);

                      }

             }

    }

    Thank you!

    Brian

  • Dear sir:

    Any idea of that? I am urge to find the solution.

    Appreciate!

  • Hi Brian,

    I can see that the slave device acknowledged (ACK) the first I2C transaction where the register pointer was set to zero. However, it did not ACK on the second transaction. It is necessary to debug this second transaction. Can you provide oscilloscope pictures with closer inspection of the STOP, START, and initial address bits? We must ensure the timing specifications are met for these edges.

    Thanks,
    Ren
  • Dear Aaron:

         Sorry! I found that there's another TMP102 on I2C bus with the same slave ID. That's why the readout is abnormal. After changing to

    another address. The readout is OK now.

    Thank you!

    Brian

  • Hi Brian,

    I'm glad that you found the issue. Good luck!

    Aaron