我对 I2C 设备有一个奇怪的问题。我在同一条 I2C 总线上使用了 RTC(DS3231 + 24LC32 EEPROM)、基于 SSH1106 的 1.3 英寸 OLED 显示器和 Si5351 时钟发生器。它们各自的地址是0x68、0x57、0x3C和0x60。
在 Arduino 上,模块使用 5V 接口和 Vcc,I2C 扫描仪正确检测到所有设备(它们都是 3.3 伏设备,并且模块包含低压降稳定器和电平转换,应该可以在 5V 和 3.3V 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 << 1 ),因此 7 位和 8 位地址之间似乎存在一些混淆。
我试图在各种社区讨论和教程中找到解释,但无济于事。
我感到很困惑..