提问人:TheBestPlayer 提问时间:9/18/2023 最后编辑:TheBestPlayer 更新时间:9/18/2023 访问量:38
STM32L031缺少 I2C 时钟周期
STM32L031 missing I2C clock cycles
问:
我正在尝试在 Nucleo 板上测试一些 I2C 命令STM32L031 https://www.st.com/resource/en/user_manual/um1956-stm32-nucleo32-boards-mb1180-stmicroelectronics.pdf
我为 STM32 微控制器编写了一些 I2C 驱动程序,但从未遇到过 I2C 如此奇怪的问题。
并将逻辑分析仪连接到 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);
我无法完全理解结果。我本来希望看到通过 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");
}
答:
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 将此额外位计入“地址”。
评论
0x22H
#define SHT40_ADDRESS 0x44 << 1