Embedded 使用I2C通信协议将温度传感器(TMP175)与STM32F407连接

Embedded 使用I2C通信协议将温度传感器(TMP175)与STM32F407连接,embedded,keil,stm32f4discovery,mbed,Embedded,Keil,Stm32f4discovery,Mbed,我正在尝试用HAL设置我的STM32微控制器 使用i2c从TMP175温度传感器读取的库 但是,我能够从单个传感器读取值,但我为4个TMP175温度传感器编写了代码 我只得到一个电流传感器值 我参考了TMP175的数据表: 我使用KeilIDEVersion5进行编程 以下是迄今为止我使用HAL库所做的工作: void StartDefaultTask(void const * argument) { HAL_I2C_Mem_Write(&hi2c1, (uint8_t) 0x90 ,

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

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

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

我参考了TMP175的数据表:

我使用KeilIDEVersion5进行编程

以下是迄今为止我使用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);
}

在对HAL_I2C_Mem_Read的调用中使用了错误的从属/设备地址。例如,在StartTask02中,您使用设备地址0x9a调用HAL_I2C_Mem_Write,然后使用设备地址0x01、0x02、0x03和0x00调用HAL_I2C_Mem_Read。为什么这样做与在StartDefaultTask中不同

我建议您使用一些定义,如:

#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个温度传感器,我将无法获得值。。。积分后,甚至没有一个值出现。。我按照您的指示,设备地址仍然不正确getting@sirisha你必须发布新代码。并显示如何调用StartTask02和StartTask03函数。定义TMP175_1_I2C_地址0x90定义TMP175_2_I2C_地址0x9a定义TMP175_3_I2C_地址0x9c定义TMP175_4_I2C_地址0x9e此定义函数我使用了StartTask02的以下代码格式:HAL_I2C_Mem_Write&hi2c1,TMP175_2_I2C_地址,uint8_t CONFIG_REG,uint8_t 1,CONFIG,11000``HAL_I2C_Mem_Write&hi2c1,TMP175_2_I2C_地址,uint8_t大腿,uint8_t 1大腿,2,1000;HAL_I2C_Mem_Write&hi2c1,TMP175_2_I2C_地址,uint8_t Low,uint8_t 1,tlow,2,1000;HAL_I2C_Mem_Read&hi2c1,TMP175_2_I2C_地址,uint8_tCONFIG_REG,uint8_t 1,&ConfigReg[0],1,1000;地址为0x9c的starttask03也类似