是否可以在 Arduino 环境中为 I2C slave(客户端、外设)设置自定义引脚?
背景:
在 ESP32(来自 Freenove 的 ESP32-WROVER)上,我尝试与 2 个 I2C 主设备(Adafruit Monster M4sk)进行通信
在这个特定的 ESP32-WROVER 板上,相机使用默认的 SDA 和 SCL 引脚。 所以我必须在不同的引脚上设置 I2c。我使用引脚 2 作为 SDA,引脚 15 作为 SDL。
我可以轻松地将 I2C 设置为这些引脚上的主设备,使用 Wire.begin(2,15) 工作得很好。我找到了很多关于使用 Wire 或 TwoWire 设置自定义引脚、多总线的文档。
我真正想做的是这样的:
#include <Wire.h>
#define SDA1 2
#define SCL1 15
#define SDA2 21
#define SCL2 22
#define SLAVE_ADDRESS_ON_BUS_1 0x52
#define SLAVE_ADDRESS_ON_BUS_2 0x33
setup()
{
Wire.begin(SDA1,SCL1,SLAVE_ADDRESS_ON_BUS_1); // Join I2C bus 1 using pins 2 and 15
Wire1.begin(SDA2,SCL2,SLAVE_ADDRESS_ON_BUS_2);// Join I2C bus 2 using pins 21 and 22
Wire.onReceive(receiveI2CBus1Event); // register event for when master on i2c bus 1 writes
Wire.onRequest(WriteToI2CBus1Event); // register event for when master1 wants on i2c bus 2 wants to read
Wire1.onReceive(receiveI2CBus2Event); // register event for when master on i2c bus 2 writes
Wire1.onRequest(WriteToI2CBus2Event); // register event for when master on i2c bus 2 wants to read
}
据我所知,没有办法使用 Wire 或 TwoWire 在一组自定义引脚上创建外设...
Wire.begin(MY_ADDRESS);
我尝试过重新定义SDA和SCL,但这似乎不起作用 注意我正在运行 Expressif 的 ESP32 库 v2.0.2(ESP32 库 1.0.6 及之前版本不支持 ESP32 作为从属) 我已经使用 Arduino IDE 1.8.19 和 Arduino IDE 2.0.0.rc5 尝试过这个(这正在重新定义 SDA 和 SCL)
我不能成为第一个尝试使用默认引脚以外的其他方式让 ESP32 充当 i2c 从设备的人...
我是否必须求助于某种 I2C 桥/开关/多路复用器?如果是这样,有什么建议吗? (最好是带有 arduino 示例代码的建议,显示主设备如何将地址分配给另一个主设备)
你已经非常接近了,只是参数的顺序颠倒了。地址首先出现,然后是 PIN 码。
Wire.begin()
,允许您指定用于从机模式下的I2C控制器的引脚:
bool begin(uint8_t slaveAddr, int sda=-1, int scl=-1, uint32_t frequency=0);
所以你可以打电话
Wire.begin(MY_ADDRESS, SDA1, SCL1);
如果需要,还可以选择将频率指定为最后一个参数。
虽然这种形式的
begin()
看起来像是针对大师的,但其代码显式设置了is_slave
标志:
is_slave = true;
并致电
i2cSlaveInit()
。
我还没有实际使用过这个,所以我不能保证它有效,但这就是代码的组织方式。
另一种方法是在调用 Wire.begin() 之前调用 Wire.setPins()。它相当于将引脚号传递给构造函数,因此没有理由优先选择其中之一。任君选择吧。