【问题标题】:I2C on Arduino Nano and on STM32 Blue Pill cannot detect all devicesArduino Nano 和 STM32 Blue Pill 上的 I2C 无法检测到所有设备
【发布时间】:2020-08-16 03:50:03
【问题描述】:

我在使用 I2C 设备时遇到了一个奇怪的问题。 我在同一条 I2C 总线上使用了 RTC(DS3231 + 24LC32 EEPROM)、基于 SSH1106 的 1.3 英寸 OLED 显示器和 Si5351 时钟发生器。它们各自的地址分别是0x680x570x3C0x60

在 Arduino 上,模块使用 5V 接口和 Vcc,I2C 扫描仪正确检测到所有设备(它们都是 3.3 伏设备,模块包含低压降稳定器和电平转换,应该在 5V 和 3.3 下都能正常工作V I2C 总线)。在i2c_scanner 草图中,所有设备都被正确检测到。当我在一个草图中使用 RTC、U8Glib2 库用于 OLED 和 Si5351 设置时,显示器没有初始化,Si5351A 没有产生任何信号。

我认为这是由于堆栈溢出,因为 Arduino 设备只有 2KB RAM,编译器报告动态变量使用了 1980 字节 RAM。当我重写整个草图以使用简化的 U8x8 库(不使用 RAM 缓冲区来显示数据)时,我得到了能够显示必要信息和驱动 Si5351A 的工作程序。

然后我从面包板上取出两个模块 Si5351 和 OLED 并将它们连接到 STM32 板(Blue Pill)。有趣的是,在我连接 Si5351A 之前,i2c_scanner 检测到了 OLED(地址 0x3C)。连接 Si5351 后,它停止检测 OLED :-(

知道这怎么可能吗?特别是,为什么在 AVR 版本的 Wires 库中它可以工作,但在 STM32 版本中却不行?以及为什么地址为 0x3C0x60 的设备之间似乎存在冲突(后者似乎在解决 0x3C 时“覆盖”了 ACK 位,如果它真的是 I2C 总线,这应该是不可能的......)

另外,OLED 显示屏的模块 PCB 指示其 I2C 地址应为 0x7E ( 0x3C

我试图在各种社区讨论和教程中找到解释,但无济于事。

我很困惑..

【问题讨论】:

  • 没有代码,没有逻辑分析仪轨迹——什么都没有。我们该怎样帮助你?阅读 stm32f103 的勘误表页面,因为有时需要一些解决方法并且不相信 Arduino 库。
  • 我没有逻辑分析仪 :-( 即使我有,逻辑分析仪有什么帮助?问题可能是 SCL 上的 HIGH 电平接近极限,因此 Si5351 可以“看到” LOWs,但另一个不能。我正在寻求具有相同问题的实践经验的人的答案。至于代码,您期望什么?它是Wires.beginTransmission( addr ); err = Wires.endTransmission(); 如果两个设备都在总线上,0x60 返回err=0 和 0x3C返回err=2

标签: arduino i2c stm32f1


【解决方案1】:

可能是:十进制的 60 也是十六进制的 0x3C...您没有提供所有代码,所以我猜您可能会写 60 而不是 0x60。

谢谢, 阿米特

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2022-07-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-07-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多