¿Carga / distribución máxima del dispositivo del bus I2C de RPi?
Tengo un RPi4 y he estado usando el bus I2C con 4 expansores gpio MCP23017 y esto funciona bien. Mi intención es utilizar 8 dispositivos MCPMCP23017, ya que solo tienen direccionamiento de 3 bits, este es el máximo en 1 bus I2C. Mi pregunta es, ¿el bus I2C del RPi tiene una carga / salida máxima de dispositivos?
Respuestas
No comprende I²C: este es un bus de drenaje abierto, por lo que el concepto de fanout no se aplica. La carga está más limitada por la capacitancia, que a su vez está relacionada con la longitud y el diseño del bus, además del número de dispositivos. Puede maximizar la cantidad de dispositivos utilizando pullups o almacenamiento en búfer de bajo valor.
Consulte Almacenamiento en búfer y multiplexación en https://en.wikipedia.org/wiki/I²C
"Consulte Cuando hay muchos dispositivos I2C en un sistema, puede ser necesario incluir búferes de bus o multiplexores para dividir segmentos de bus grandes en segmentos más pequeños. Esto puede ser necesario para mantener la capacitancia de un segmento de bus por debajo del valor permitido o para permitir que varios dispositivos con la misma dirección estén separados por un multiplexor ".
Con cualquier diseño sensato, no debería tener problemas de carga con 8 dispositivos MCPMCP23017.
Si le preocupa una capacitancia de bus demasiado alta, un abanico demasiado alto (si es relevante en este caso ...) o si desea conectar más de 8 expansores de E / S MCP23017 al RPi, entonces hay una solución muy simple : conecte un interruptor I2C como el PCA9548 (8 buses I2C) - o similar - a los pines I2C originales del RPi. Dado que el kernel de Linux tiene soporte implícito para esto desde hace un par de años, lo único que tiene que hacer es agregar la siguiente línea al archivo /boot/config.txt
(como sudo
):
dtoverlay=i2c-mux,pca9548,addr=0x70
De esta manera, tendrá un extra de 8 buses I2C donde podrá conectar sus dispositivos adicionales (use i2cdetect -l
para ver los buses adicionales y sus nombres). Lo único que tiene que hacer en su código es decirle a su software a qué /dev/i2c-x
dispositivo están conectados sus dispositivos I2C.
Algunas ventajas:
- Propagación de la capacitancia del bus
- No tiene que preocuparse por los comandos de conmutación del I2C MUX, el módulo del kernel de Linux lo hace por usted en función del
/dev/i2c-x
bus. - Puede agregar un total de 64 dispositivos MCP23017 al RPi (es decir, indirectamente), lo que significa un total (loco) de 64 x 16 = 1024 IO (qué más desea ...)
- Importante : puede trabajar con una combinación de fuentes de alimentación "en el otro lado" del I2C MUX. Puede ser 3V3, pero también 1V8 o 5V. ¡Extremadamente conveniente! Tenga en cuenta que el extremo frontal del I2C MUX debe obedecer a la fuente de alimentación del RPi (es decir, 3V3) para evitar daños en los pines de entrada / salida.
Desventaja:
Sí, hay uno: tiene que agregar hardware adicional (aunque limitado) a su proyecto, pero recupera mucho por este pequeño esfuerzo adicional.