如何在 mbed 上的同一引脚上从 I2C 切换到 OneWire?

How can I switch from I2C to OneWire on the same pin on mbed?

我有一个项目涉及通过 I2C 开关 (PCA9548) 与 OneWire 芯片 (DS2431) 通信。我想做的是正确配置开关(只需将一个字节写入其状态寄存器),然后使用 mbed SDA 引脚进行 OneWire 通信。该开关不关心 SDA 线路(它甚至可以在两个方向上通过 DC)并且我已经成功地使用 OneWire 对其进行了测试。问题是在同一引脚上将软件从 I2C 切换到 OneWire。
我已经尝试过简单的方法:制作一个全局 I2C 实例,然后是一个 OneWire 实例,但最后一个总是破坏前一个,这样我就可以让 I2C 工作或 OneWire。有没有办法销毁一个实例并重新创建它?

您可以通过几种方式实现它,但最简单的方法之一是在您的主函数中声明 I2C 和 OneWire 实例。

如果需要在main之外访问OneWire实例,可以将其赋值给一个指针。

这是一些伪代码:

OneWire *oneWireGlobal;

void func1() {
    oneWireGlobal->writeBit(0xFF);
}

void main() {
    I2C i2c(I2C_SDA, I2C_SCL);

    [I2C operations here...]

    OneWire oneWire(I2C_SDA);
    oneWireGlobal = &oneWire; // Be sure to do this before accessing "oneWireGlobal"

    [oneWire operations here...]

    func1();
}