Gestión de conflictos de direcciones I2C con varios MCP23017 en el mismo bus

Estoy usando una Raspberry Pi con el maestro I2C y conecté con éxito 8 chips MCP23017 diferentes, cada uno con sus respectivas direcciones configurando los últimos 3 bits de sus direcciones de 7 bits. Todos ellos están funcionando sin problemas.

Mi problema es que el direccionamiento básico de los chips está permanentemente establecido en 0x20 a 0x27, lo que parece extraño. Después de usar i2cdetect, veo muchas otras direcciones potenciales.

Mi primera pregunta es: si los chips están bloqueados en 0x20, ¿habrá algún conflicto SI algún otro dispositivo I2C usa la misma dirección de dispositivo?

En segundo lugar: ¿hay alguna forma de modificar el esquema de direccionamiento básico (0x3*, 0x4*, 0x5*) para maximizar todas estas direcciones potenciales o están configuradas permanentemente para cada dispositivo?

Respuestas (1)

Mi primera pregunta es: si los chips están bloqueados en 0x20, ¿no habrá ningún conflicto SI algún otro dispositivo i2c usa los mismos esquemas?

Correcto. Otro dispositivo esclavo que usa la dirección 0x20 - 0x27 entraría en conflicto con un dispositivo MCP23017 existente que usa la misma dirección dentro de ese rango de direcciones, si estuvieran conectados en el mismo bus I 2 C. Cada esclavo I 2 C necesita una dirección única en un bus I 2 C.

Dos formas de mitigar un conflicto de direcciones esclavas serían distribuir los dispositivos a través de múltiples buses I 2 C en el maestro I 2 C (por ejemplo, la Raspberry Pi), o usar un dispositivo multiplexor I 2 C en un solo bus I 2 C (que crea efectivamente múltiples buses I 2 C por sí mismo). [Ver más abajo para otro enfoque.]

En segundo lugar: ¿Hay alguna forma de modificar el esquema de direccionamiento básico (0x3*, 0x4*, 0x5*) para maximizar todas estas direcciones potenciales? ¿O están configurados permanentemente para cada dispositivo?

Esto depende del dispositivo (es decir, lea su hoja de datos), pero normalmente la dirección I 2 C, o el rango de direcciones I 2 C seleccionables, se fija para cada modelo de dispositivo esclavo.

Una excepción es cuando un dispositivo esclavo es totalmente programable (por ejemplo, algunos esclavos I 2 C son en realidad dispositivos PIC que ejecutan firmware para convertirlos en esclavos I 2 C permanentes) y en esos casos, he visto más flexibilidad sobre qué direcciones se pueden programar. usar.


Editado para agregar: Otro enfoque para evitar el conflicto de direcciones de bus I 2 C, como comentó amablemente @DoxyLover, es usar los traductores de direcciones I 2 C de Linear Technologies : LTC4316 , LTC4317 , LTC4318 . Estos dispositivos reescriben las direcciones I 2 C "sobre la marcha" entre sus "canales" de entrada y salida. Efectivamente, crean nuevos segmentos de bus I 2 C, con un patrón configurable de (en teoría, transparente) traducción de direcciones I 2 C entre los segmentos de bus I 2 C originales y nuevos.

A partir de sus hojas de datos, también agregan otras funciones, por ejemplo, detección de "bus atascado" incorporada y traducción del nivel de voltaje. Sin embargo, aunque admiten funciones I 2 C comunes, hay algunas que no admiten, por ejemplo, direccionamiento de 10 bits e ID de dispositivo. Como siempre, lea las hojas de datos.

En el contexto de la pregunta original, parece que un LTC4316 podría crear un nuevo segmento de bus I 2 C, donde se podría conectar otro conjunto de (hasta) ocho dispositivos MCP23017. Supongamos que las direcciones I 2 C 0x30 - 0x37están libres en el bus I 2 C conectado directamente al maestro, pero el nuevo conjunto de dispositivos MCP23017 necesita usar sus direcciones fijas 0x20 - 0x27. El LTC4316 se configuraría con un valor de "byte de traducción" de 0x10.

En el segmento de bus I 2 C de "salida" LTC4316, el nuevo conjunto de ocho dispositivos MCP23017 "ve" sus direcciones 0x20 - 0x27I 2 C habituales, según lo requieran. Sin embargo, en el segmento de bus I 2 C de "entrada" donde está conectado el maestro I 2 C, el maestro I 2 C los abordaría usando direcciones I 20x30 - 0x37 C , con el LTC4316 traduciendo una dirección 0x3nen la "entrada" (lado maestro) segmento de bus, al 0x2nsegmento de bus de "salida" (lado esclavo) [donde n= 0 - 7].

También hay chips de traducción de direcciones I2C, que se colocan entre el bus y uno (o más) dispositivos que reescriben los bits de dirección sobre la marcha. Por ejemplo, linear.com/product/LTC4317
Gracias @DoxyLover: ¡son lo suficientemente nuevos como para no haberlos visto! Actualizaré esta respuesta con su información, gracias de nuevo :-)
@Robotometry: en caso de que aún no haya visto el comentario, la familia de dispositivos mencionada anteriormente por DoxyLover podría hacer lo que desea. Actualicé mi respuesta con enlaces y un escenario sugerido para usar el LTC4316 como ejemplo, en caso de que eso ayude.