【问题标题】:STM32 HAL with SHT25 from sensirion over I2C,IICSTM32 HAL 和 SHT25 来自 sensirion over I2C,IIC
【发布时间】:2017-04-17 15:07:19
【问题描述】:

有没有人使用 STM32 HAL 驱动程序可以与像 SHT25 这样的 Sensirion 传感器进行 I2C 通信,并且可以向我展示他的 sn-ps?

我使用 sensirion 的代码示例进行通信。 (https://www.sensirion.com/fileadmin/user_upload/customers/sensirion/Dokumente/11_Sample_Codes_Software/Humidity_Sensors/Sensirion_Humidity_Sensors_SHT21_Sample_Code_V1.2.pdf) 当我寻址传感器时,我得到一个确认,但是当我想读取传感器数据时,我只得到“11111111”。

【问题讨论】:

  • 到目前为止你尝试过什么?阅读数据表,有一个应该使用的命令列表。另外搜索STM32CubeMX和STM32CubeF0/1/2/3/4,例子很多。

标签: sensors stm32 i2c hal


【解决方案1】:

带有 HAL 驱动程序的 STM32 上的 Sensirion SHTC1 的工作代码:

#define SHTC1_I2C_ADDR  0xE0
#define TEMP_HUM_CMD_MEASURE_T_FIRST    0x7866

//Launch convert
uint8_t cmd[2];
cmd[0] = (uint8_t)(TEMP_HUM_CMD_MEASURE_T_FIRST >>> 8);
cmd[1] = (uint8_t)TEMP_HUM_CMD_MEASURE_T_FIRST;
HAL_I2C_Master_Transmit(&hi2c1, SHTC1_I2C_ADDR, cmd, 2, 100);

//Wait
HAL_Delay(15);

//Read values
uint8_t rawValues[6]; //T MSB, T LSB, T CRC, H MSB, H LSB, H CRC
HAL_I2C_Master_Receive(&hi2c1, SHTC1_I2C_ADDR, rawValues, 6, 100);
uint16_t rawTemp = (uint16_t)((((uint16_t)rawValues[0])<<8) | (uint16_t)rawValues[1]);
uint16_t rawHum = (uint16_t)((((uint16_t)rawValues[3])<<8) | (uint16_t)rawValues[4]);

float hum = (float)((float)100 * (float)rawHum / (float)65536);
float temp =(float)((float)-45 + (float)175 * (float)rawTemp / (float)65536);

【讨论】:

  • 我在 HAL_I2C_Master_Transmit 收到错误。你的 MX_I2C1_Init()-Function 是什么样的?
【解决方案2】:

使用 HAL_I2C_Mem_Write() 和 HAL_I2C_Mem_Read() HAL API 通过 I2C 接口从传感器写入和读取数据。您必须从传感器数据表中找到要写入/读取的数据以及要写入/读取的内存位置。

【讨论】:

  • 传感器数据不在内存中。发送触发命令后获取数据。
  • 我不明白你说的传感器数据不在内存中是什么意思?你可以解释吗?对于任何数字事物,数据都应该存储在某种形式的内存中。
  • SHT25 的数据表解释说,传感器的测量是由主机发送的命令触发的。然后传感器执行测量,当它准备好时(典型值 50 毫秒后),它通过 I2C 将测量值发送到主机。无法读取传感器的内存。
  • 根据 I2C 规范,I2C 从设备不能通过 I2C 总线发起数据传输,只有 I2C 主设备可以这样做。你能提供数据表的链接吗?
猜你喜欢
  • 2018-08-26
  • 2022-01-13
  • 2020-12-19
  • 2021-12-23
  • 2020-01-12
  • 2021-05-20
  • 2017-04-07
  • 2015-09-24
  • 2019-12-27
相关资源
最近更新 更多