STM32L031缺少 I2C 时钟周期

STM32L031 missing I2C clock cycles

提问人:TheBestPlayer 提问时间:9/18/2023 最后编辑:TheBestPlayer 更新时间:9/18/2023 访问量:38

问:

我正在尝试在 Nucleo 板上测试一些 I2C 命令STM32L031 https://www.st.com/resource/en/user_manual/um1956-stm32-nucleo32-boards-mb1180-stmicroelectronics.pdf

我为 STM32 微控制器编写了一些 I2C 驱动程序,但从未遇到过 I2C 如此奇怪的问题。

我已使用默认设置配置了 I2C:enter image description here

并将逻辑分析仪连接到 SCL 和 SDA 引脚。

在我的代码中,我只是尝试使用以下代码写入 I2C:

  uint8_t test_data[1] = {0xAA};
  uint16_t device_address = 0xff;
  HAL_I2C_Master_Transmit(&hi2c1, device_address, &test_data, 1, 0xff);

结果是:enter image description here

我无法完全理解结果。我本来希望看到通过 I2C 总线发送 2 个字节:

第 1 字节:地址 (0xff)

第 2 字节:数据 (0xAA)

我还希望在 SCL 线路上看到 16 个时钟周期,因为我发送的是 2 个字节。

从逻辑分析仪图中可以看出,它似乎缺少时钟周期,因此无法发送完整数据。有没有人遇到过如此奇怪的 I2C 问题?我感谢任何帮助

更新

我已将 SHT40 I2C 温湿度传感器连接到我的 STM32 Nucleo 板,并尝试检查是否检测到地址0x44(SHT40 地址):

#define SHT40_ADDRESS 0x44

    HAL_StatusTypeDef ret = HAL_I2C_IsDeviceReady(&hi2c1, SHT40_ADDRESS, 10, 100);
      if(ret == HAL_OK)
      {
          printf("I2C device detected at address 0x44 \n");
      }
      else{
          printf("SH40 not detected \n");
      }

结果:enter image description here

这似乎正确吗?我不确定为什么它写0x22,据我说应该是0x44:enter image description here

STM32 I2C HAL

评论

0赞 hcheung 9/18/2023
“我写了一些 I2C 驱动程序”,如果您这样做了,您应该知道,从逻辑分析仪解码器中,I2C 地址偏离了一位并解码为 .对于 STM32 HAL 库,I2C 地址应为 .0x22H#define SHT40_ADDRESS 0x44 << 1
0赞 TheBestPlayer 9/18/2023
确实是的。我的错!

答:

1赞 wek 9/18/2023 #1

在地址后有一个 NAK,因此总线上没有具有此地址的活动从站,可以将数据发送到该地址。我不使用 Cube/HAL,但此时它可能会返回一些错误。

JW公司

PS. 1111 1XX 是 I2C 规范第 3.1.12 章保留地址的保留地址,因此不应有地址为 0xFF 的从站。此外,地址是 7 位的。

评论

0赞 TheBestPlayer 9/18/2023
我已经更新了我的初始帖子。我已将 SHT40(I2C 传感器)连接到我的 Nucleo 板并尝试检测它,但无法检测到。
0赞 TheBestPlayer 9/18/2023
还行。因此,由于您提到地址是 7 位的,我尝试了以下方法: 这似乎解决了所有问题......#define SHT40_ADDRESS (0x44 << 1)
0赞 Rodney 9/18/2023
地址是 7 位,然后还有另一个方向位。因此,字节值似乎是地址<< 1。某些 API 将此额外位计入“地址”。