我在Adafruit Featherwing Huzzah32 ESP32上定义第二条I2C总线时遇到问题。标准I2C总线使用SDA引脚23&SCL引脚22。第二条总线(可能是33&32?(是否有预定义的引脚,或者是否可以使用任何GPIO,只要我的软件使用例如Wire1.setPins()
定义它们
大多数ESP32转接板没有为第二个I2C控制器定义默认引脚,因此在配置时需要定义它们。
如前所述,您可以在TwoWire
(Wire
和Wire1
的类(对象上使用set_pins()
方法:
Wire1.set_pins(PIN_SDA, PIN_SCL);
在调用begin()
方法之前调用此非常重要。这样做可以在将Wire1
传递给可能调用begin()
的库之前对其进行配置。
您也可以在调用begin()
:时设置引脚
Wire1.begin(PIN_SDA, PIN_SCL);
您也可以通过这种方式将Wire
(第一个I2C控制器(重新映射到不同的引脚。
不幸的是,有些库不允许您将TwoWire
对象传递给它们,因此您可能需要制作这样的库的本地副本并对其进行修改
您可以使用ESP32上的大部分(但不是全部(GPIO引脚。要避免的引脚是捆扎引脚,它决定了处理器如何引导(GPIO0和GPIO12-12可能适用于SCL,但如果可能的话,我会避免(,以及高编号ADC引脚,它们仅为输入(GPIO34-GPIO39(。你可能还想避免任何引脚连接到板上的LED,如果有的话。
Random Nerd教程对ESP32 CPU上可用的引脚有一个很好的概述。如果您使用的是ESP32的其他变体,如S2或S3,则可用引脚会有所不同。
正如一些人所指出的,你可以将多个I2C设备连接到一个控制器,但使用多个I2C总线是有正当理由的,这就是问题所在。
有时I2C设备与其他设备不能很好地配合使用(尤其是在使用时钟拉伸的情况下(。您还可以以不同的速度操作两条不同的总线。如果你使用多辆公交车,如果一辆公交车上的设备发生碰撞并堵塞公交车,它不会干扰其他公交车。
当然,如果您需要使用两个具有相同I2C地址且无法更改地址的设备,则使用第二个内置I2C控制器比使用I2C多路复用器更容易。
在此处显示的Feather Arduino IDE支持中,默认情况下只配置了一个
更好的选择是使用其他设备的从属地址和类似的I2C引脚将其寻址为从属设备。我假设你正试图到达多个突破板,所以你的羽翼应该运行主代码。然后将从属地址编号替换为与要寻址的转接板关联的编号。