Arduino ESP32 I2C 我可以为SLAVE(客户端)设置自定义引脚吗

问题描述 投票:0回答:2

是否可以在 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 示例代码的建议,显示主设备如何将地址分配给另一个主设备)

arduino esp32 i2c slave pins
2个回答
4
投票

你已经非常接近了,只是参数的顺序颠倒了。地址首先出现,然后是 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()

我还没有实际使用过这个,所以我不能保证它有效,但这就是代码的组织方式。


1
投票

另一种方法是在调用 Wire.begin() 之前调用 Wire.setPins()。它相当于将引脚号传递给构造函数,因此没有理由优先选择其中之一。任君选择吧。

© www.soinside.com 2019 - 2024. All rights reserved.