【问题标题】:Interfacing temperature sensor(TMP175) with STM32F407 using I2C Communication protocol使用 I2C 通信协议将温度传感器 (TMP175) 与 STM32F407 连接
【发布时间】:2018-07-29 11:19:13
【问题描述】:

我正在尝试使用 HAL 设置我的 STM32 微控制器 使用 i2c 从 TMP175 温度传感器读取的库。

但是,我可以从单个传感器读取值,但我为 4 个 TMP175 温度传感器编写了代码。

我只得到一个电流传感器值。

我参考了 TMP175 的数据表:http://www.ti.com/lit/ds/symlink/tmp75.pdf

我正在使用 Keil IDE 版本 5 进行编程。

这是迄今为止我使用 HAL 库的方式:

void StartDefaultTask(void const * argument)
{
HAL_I2C_Mem_Write(&hi2c1, (uint8_t) 0x90 , (uint8_t) CONFIG_REG  , (uint8_t) 1,Config, 1, 1000);
HAL_I2C_Mem_Write(&hi2c1, (uint8_t)0x90 , (uint8_t) thigh  , (uint8_t) 1, THigh, 1, 1000);
HAL_I2C_Mem_Write(&hi2c1, (uint8_t) 0x90 , (uint8_t) tlow  , (uint8_t) 1, TLow, 1, 1000);
HAL_I2C_Mem_Read(&hi2c1, (uint8_t) 0x91, (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) 0x91, (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) 0x91, (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) 0x91, (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);

}

/* StartTask02 function */
void StartTask02(void const * argument)
{
HAL_I2C_Mem_Write(&hi2c1, (uint8_t) 0x9a , (uint8_t) CONFIG_REG  , (uint8_t) 1,Config, 1, 1000);
HAL_I2C_Mem_Write(&hi2c1, (uint8_t)0x9a , (uint8_t) thigh  , (uint8_t) 1, THigh, 2, 1000);
HAL_I2C_Mem_Write(&hi2c1, (uint8_t) 0x9a , (uint8_t) tlow  , (uint8_t) 1, TLow, 2, 1000);
HAL_I2C_Mem_Read(&hi2c1, (uint8_t) 0x01, (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) 0x02, (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) 0x03, (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) 0x00, (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);

}

/* StartTask03 function */
void StartTask03(void const * argument)
{
HAL_I2C_Mem_Write(&hi2c1, (uint8_t) 0x9c , (uint8_t) CONFIG_REG  , (uint8_t) 1,Config, 1, 1000);
HAL_I2C_Mem_Write(&hi2c1, (uint8_t)0x9c , (uint8_t) thigh  , (uint8_t) 1, THigh, 2, 1000);
HAL_I2C_Mem_Write(&hi2c1, (uint8_t) 0x9c , (uint8_t) tlow  , (uint8_t) 1, TLow, 2, 1000);
HAL_I2C_Mem_Read(&hi2c1, (uint8_t) 0x01, (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) 0x02, (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) 0x03, (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) 0x00, (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);
}

【问题讨论】:

    标签: embedded keil stm32f4discovery mbed


    【解决方案1】:

    您在对HAL_I2C_Mem_Read() 的调用中使用了错误的从站/设备地址。例如,在 StartTask02() 中,您使用设备地址 0x9a 调用 HAL_I2C_Mem_Write(),但随后您使用设备地址 0x01、0x02、0x03 和 0x00 调用 HAL_I2C_Mem_Read()。为什么你的做法与 StartDefaultTask() 中的做法不同?

    我建议你使用一些#defines,像这样:

    #define TMP175_1_I2C_ADDRESS 0x90
    #define TMP175_2_I2C_ADDRESS 0x9a
    #define TMP175_3_I2C_ADDRESS 0x9c
    
    HAL_I2C_Mem_Write(&hi2c1, TMP175_2_I2C_ADDRESS , (uint8_t) tlow  , (uint8_t) 1, TLow, 2, 1000);
    HAL_I2C_Mem_Read(&hi2c1, TMP175_2_I2C_ADDRESS, (uint8_t)CONFIG_REG , (uint8_t) 1, &ConfigReg[0], 1, 1000);
    

    我相信您可以将相同的原始地址传递给 HAL_I2C_Mem_Write()HAL_I2C_Mem_Read(),因为 HAL 函数会适当地设置最低有效 R/W 位。

    【讨论】:

    • 如果我运行单个温度传感器的代码,我会得到正确的输出,但如果我集成 4 个温度传感器没有得到价值......集成后甚至没有单个值来......我跟着您的设备地址仍未收到的指示
    • @sirisha 您必须发布新代码。并展示如何调用StartTask02StartTask03 函数。
    • #define TMP175_1_I2C_ADDRESS 0x90 #define TMP175_2_I2C_ADDRESS 0x9a #define TMP175_3_I2C_ADDRESS 0x9c #define TMP175_4_I2C_ADDRESS 0x9e 我使用的这个定义函数..
    • 对于startTask02,我使用了以下代码格式:HAL_I2C_Mem_Write(&amp;hi2c1, TMP175_2_I2C_ADDRESS , (uint8_t) CONFIG_REG , (uint8_t) 1,Config, 1,1000);``HAL_I2C_Mem_Write(&amp;hi2c1, TMP175_2_I2C_ADDRESS , (uint8_t) thigh , (uint8_t) 1, THigh, 2, 1000); HAL_I2C_Mem_Write(&amp;hi2c1, TMP175_2_I2C_ADDRESS , (uint8_t) tlow , (uint8_t) 1, TLow, 2, 1000); HAL_I2C_Mem_Read(&amp;hi2c1, TMP175_2_I2C_ADDRESS , (uint8_t)CONFIG_REG , (uint8_t) 1, &amp;ConfigReg[0], 1, 1000); 与地址为 0x9c 的starttask03 类似
    猜你喜欢
    • 1970-01-01
    • 2018-04-08
    • 2021-02-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-06-14
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多