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.
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
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 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