arduino - Arduino Nano 和 STM32 Blue Pill 上的 I2C 无法检测到所有设备
问题描述
我对 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 位地址之间似乎存在一些混淆。
我试图在各种社区讨论和教程中找到解释,但无济于事。
我感到很困惑..
解决方案
可能是:十进制的 60 也是十六进制的 0x3C ...您没有提供所有代码,所以我猜您可能会写 60 而不是 0x60。
谢谢,阿米特
推荐阅读
- vector - openlayers 5中矢量图层的交互功能
- c# - C# 将两种不同类型的属性序列化为 JSON
- javascript - 为什么在 vuex 存储中推送到数组后未定义数组?
- c - 有效地将可被 3 或 5 整除的数字相加
- python - django 如何显示新添加产品的详细信息页面
- python - 在 Seaborn / Matplotlib 的小提琴图上指定高于和低于中位数的颜色
- javascript - 为什么 Node.js 中未定义函数
- r - 在官员包中保持对象放置一致
- cmd - 如何在存储过程 SQL Developer 上执行命令提示符
- sql - 正则表达式组合语句以匹配最后一个 > 和最后一个 _ 之前的所有内容