【发布时间】:2020-08-16 03:50:03
【问题描述】:
我在使用 I2C 设备时遇到了一个奇怪的问题。 我在同一条 I2C 总线上使用了 RTC(DS3231 + 24LC32 EEPROM)、基于 SSH1106 的 1.3 英寸 OLED 显示器和 Si5351 时钟发生器。它们各自的地址分别是0x68、0x57、0x3C和0x60。
在 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 版本中却不行?以及为什么地址为 0x3C 和 0x60 的设备之间似乎存在冲突(后者似乎在解决 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。