【问题标题】:Arduino ESP32 I2C can I set custom pins for SLAVE (Client)Arduino ESP32 I2C 我可以为 SLAVE(客户端)设置自定义引脚吗
【发布时间】:2023-01-17 04:59:56
【问题描述】:

tl;博士有人可以告诉我是否可以为 I2C 设置自定义引脚奴隶(客户端、外围设备)在 Arduino 环境中?

语境 在 ESP32(来自 Freenove 的 ESP32-WROVER)上,我正在尝试与 2 个 I2C 主设备(Adafruit Monster M4sk)进行通信

在这个特定的 ESP32-WROVER 板上,相机使用默认的 SDA 和 SCL 引脚。 所以我必须在不同的引脚上设置 I2c。我将引脚 2 用作 SDA,将引脚 15 用作 SDL。

我可以轻松地将 I2C 设置为这些引脚上的 MASTER,使用 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


    【解决方案1】:

    你非常接近,你只是翻转了参数的顺序。地址在前,然后是密码。

    are optional parametersWire.begin() 允许您在从机模式下指定用于 I2C 控制器的引脚:

        bool begin(uint8_t slaveAddr, int sda=-1, int scl=-1, uint32_t frequency=0);
    

    所以你可以打电话

    Wire.begin(MY_ADDRESS, SDA1, SCL1);
    

    如果需要,可以选择将频率指定为最终参数。

    虽然这种形式的begin()看起来像是给大师的,但它的代码explicitly sets the is_slave flag

        is_slave = true;
    

    并致电i2cSlaveInit()

    我还没有真正使用过它,所以我不能保证它会起作用,但这是代码的组织方式。

    【讨论】:

    • 不仅参数顺序错误,而且第一个参数是类型敏感的。以下更改将编译,esp32 将使用指定的引脚作为从设备加入总线。我可以确认在 ESP32 从设备上调用了读取和写入回调函数。我现在无法确认写入的数据不是垃圾,但嘿,这可能只是硬件问题。但更近一步,谢谢! ``` uint8_t slave_addr = SLAVE_ADDRESS; Wire.begin(slave_addr,SDA1,SCL1); // I2C 总线 1 设置从机,i2c 快速模式```
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-02-12
    • 2014-10-18
    • 1970-01-01
    • 2019-11-12
    • 2011-12-03
    相关资源
    最近更新 更多