【问题标题】:Use i2C interface to read from ADT7420 temperature sensor使用 i2C 接口读取 ADT7420 温度传感器
【发布时间】:2018-04-08 08:16:47
【问题描述】:

我正在尝试使用 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 设置的一些配置设置?谢谢。

【问题讨论】:

    标签: microcontroller stm32 i2c temperature


    【解决方案1】:

    您需要将寄存器地址作为 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 毫秒(精度较低),正常模式下的每次转换需要 240 毫秒。

    【讨论】:

    • 感谢您的回复。请问TEMP_CONFIG如果要在正常模式下运行应该有什么值?
    • 正常模式(连续转换)由#5 和#6 位中的零值设置,因此默认(零)配置寄存器就足够了。其他位取决于您的应用程序和需求。这些与输出信号和警报等有关,与转换模式无关。 (我刚刚把你在代码中的内容放在这里,实际上不向配置寄存器写入任何内容也应该可以。)
    • 顺便说一句。如果您没有以您的片段(回调?)中未显示的方式处理错误,您还应该在请求任何 I2C xfer 后检查错误。它可能因各种原因而失败,包括错误的地址、接线问题等。据我了解,这是检查返回码并调用 HAL_I2C_GetError() 和/或 HAL_I2C_GetState() 以获取详细信息。
    【解决方案2】:

    这里使用的是温度传感器 (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);
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-07-29
      • 2021-02-25
      • 2021-09-23
      • 1970-01-01
      • 1970-01-01
      • 2020-06-17
      • 1970-01-01
      相关资源
      最近更新 更多