使用i2C接口从ADT7420温度传感器读取数据

时间:2017-10-26 20:10:09

标签: microcontroller stm32 i2c temperature

我正在尝试将带有HAL库的STM32微控制器设置为使用i2c从ADT7420温度传感器读取。但是,当我运行代码时,我无法从传感器读取正确的值。

以下是我到目前为止使用HAL库的方法:

uint8_t I2C_ADDR = 0x48;
uint8_t TEMP_CONFIG = 0x03;

uint8_t data[2];

HAL_I2C_Master_Transmit(&hi2c1, I2C_ADDR, &TEMP_CONFIG , 1, 10000);

HAL_I2C_Master_Receive(&hi2c1, I2C_ADDR, data, 2, 10000);

uint16_t temp_raw = (uint16_t)((data[0]<<8) | data[1]);
int temp_value = calc_celcius(temp_raw); //TODO: convert to Celsius

使用此代码,温度保持为零,表示某些内容无法正常工作。我是否缺少i2c设置的一些配置设置以读取温度值?感谢。

2 个答案:

答案 0 :(得分:2)

您需要将寄存器地址作为I2C写入的第一个字节发送,然后将数据写入该寄存器,或者重复启动I2C并读取该值。有关详细信息,请参见数据表中的第18页和第19页,已链接。

似乎HAL_I2C_Mem_Write()HAL_I2C_Mem_Read()函数应该为您处理此地址。所以,这部分代码看起来像

HAL_I2C_Mem_Write(&hi2c1, I2C_ADDR, 0x03, I2C_MEMADD_SIZE_8BIT, &TEMP_CONFIG , 1, 10000);
HAL_I2C_Mem_Read(&hi2c1, I2C_ADDR, 0x00, I2C_MEMADD_SIZE_8BIT, data, 2, 10000);

免责声明:我没有HAL库的经验,所以我的回答是基于快速阅读文档和仅提供的源代码。

另请注意,在为IC上电后,您需要等待第一次转换完成才能获得非零值。根据数据表,第一次转换应仅在6 ms内完成(低精度),正常模式下的每次转换需要240 ms。

答案 1 :(得分:0)

这里使用温度传感器(TMP175)

static void temp_Init(void)
{
HAL_I2C_Mem_Write(&hi2c1, (uint8_t) W_ADDR, (uint8_t) CONFIG_REG  , 
          (uint8_t) 1,Config, 1, 1000);
HAL_I2C_Mem_Write(&hi2c1, (uint8_t) W_ADDR, (uint8_t) thigh  , (uint8_t) 1, 
       THigh, 1, 1000);
HAL_I2C_Mem_Write(&hi2c1, (uint8_t) W_ADDR, (uint8_t) tlow  , (uint8_t) 1, TLow, 1, 1000);
}

以上命令基于HAL_Drive ...最初给出I2C地址.. 然后在主程序中创建一个任务。然后在创建的任务中调用该函数然后你将获得温度值..请使用以下代码。

 void StartDefaultTask(void const * argument)
{

  HAL_I2C_Mem_Read(&hi2c1, (uint8_t) R_ADDR, (uint8_t)CONFIG_REG , (uint8_t) 1, 
 &ConfigReg[0], 1, 1000);

 printf("   configreg==%x\t \r",ConfigReg[0]);

 HAL_I2C_Mem_Read(&hi2c1, (uint8_t) R_ADDR, (uint8_t) tlow, (uint8_t) 1,TLowReg, 
 2, 1000);
TLow1=(TLowReg[0]<<4);
TLow1|=(TLowReg[1]>>4);
TL=TLow1*0.0625;
printf(" Lower Limit Temperature=%f deg celsius \r ", TL);

HAL_I2C_Mem_Read(&hi2c1, (uint8_t) R_ADDR, (uint8_t) thigh, (uint8_t) 1,THighReg, 2, 1000);
THigh1=(THighReg[0]<<4);
THigh1|=(THighReg[1]>>4);TH=THigh1*0.0625;
printf(" upper Limit Temperature=%f deg celsius \r", TH);
HAL_I2C_Mem_Read(&hi2c1, (uint8_t) R_ADDR, (uint8_t) TEMPERATURE, (uint8_t) 1, TempReg, 2, 1000);
Shift= TempReg[0]<<4;
Shift|= TempReg[1]>>4;

Temp=Shift*0.0625;
printf("Temperature=%f deg Celsius \r",Temp);
}