通过端口扩展器实现 I2C 总线的软件实现
Software implementation of I2C bus via port expander
有:
- Arduino 或 Esp8266
- 8 个端口扩展器 MCP23017
- 8 个带 I2C 接口的 HTU21D 湿度传感器。
端口扩展器能够使用跳线 A0-A2 更改 I2C 总线上的地址。湿度传感器没有这样的功能,它们有相同的地址。是否可以通过GPIO将带有I2C接口的湿度传感器连接到端口扩展器,并以编程方式实现I2C总线。
从微控制器,我需要通过端口扩展器访问湿度传感器数据。如何实现?
这种连接的理论方案
我不推荐使用 I2C GPIO 端口扩展器来实现 i2c 协议,原因如下:
- 首先,由于端口扩展器已经在 i2c 频率上运行,通过对端口扩展器的 GPIO 引脚进行位碰撞的 I2C 协议会变慢,或者可能会出现无法预料的时序问题。
- 实现 i2c 协议可能会有点困难 tricky/risky。例如,您可能需要在软件 i2c 中实现时钟延展功能。
我建议使用 i2c 总线开关 http://www.ti.com/lit/ds/symlink/tca9545a.pdf,它使用起来非常简单,并且可以在 4 个 i2c 设备之间多路复用单个 i2c 总线,并且这些设备可以具有相同或不同的 i2c 从属地址。交换机本身有一个可配置的 i2c 地址(因此可以使用多个)。可以通过将 i2c 数据发送到开关地址来启用所需的通道。然后与所需设备的后续 i2c 通信将通过启用的通道进行。
我认为解决这个问题的方法如下:
我将所有湿度传感器放在一个 I2C 总线上,但我将从端口扩展器的引脚为它们供电。因此,为了收集信息,我将参考一个 I2C 地址,但在通过端口扩展器切换传感器电源之前,只会同时打开一个传感器。
有:
- Arduino 或 Esp8266
- 8 个端口扩展器 MCP23017
- 8 个带 I2C 接口的 HTU21D 湿度传感器。
端口扩展器能够使用跳线 A0-A2 更改 I2C 总线上的地址。湿度传感器没有这样的功能,它们有相同的地址。是否可以通过GPIO将带有I2C接口的湿度传感器连接到端口扩展器,并以编程方式实现I2C总线。
从微控制器,我需要通过端口扩展器访问湿度传感器数据。如何实现?
这种连接的理论方案
我不推荐使用 I2C GPIO 端口扩展器来实现 i2c 协议,原因如下:
- 首先,由于端口扩展器已经在 i2c 频率上运行,通过对端口扩展器的 GPIO 引脚进行位碰撞的 I2C 协议会变慢,或者可能会出现无法预料的时序问题。
- 实现 i2c 协议可能会有点困难 tricky/risky。例如,您可能需要在软件 i2c 中实现时钟延展功能。
我建议使用 i2c 总线开关 http://www.ti.com/lit/ds/symlink/tca9545a.pdf,它使用起来非常简单,并且可以在 4 个 i2c 设备之间多路复用单个 i2c 总线,并且这些设备可以具有相同或不同的 i2c 从属地址。交换机本身有一个可配置的 i2c 地址(因此可以使用多个)。可以通过将 i2c 数据发送到开关地址来启用所需的通道。然后与所需设备的后续 i2c 通信将通过启用的通道进行。
我认为解决这个问题的方法如下: 我将所有湿度传感器放在一个 I2C 总线上,但我将从端口扩展器的引脚为它们供电。因此,为了收集信息,我将参考一个 I2C 地址,但在通过端口扩展器切换传感器电源之前,只会同时打开一个传感器。