La gestión de la dirección I2C está en conflicto con múltiples MCP23017 en el mismo bus

3

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 están trabajando perfectamente.

Mi problema es que el direccionamiento básico de los chips se establece permanentemente 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 el 0x20s, ¿habrá algún conflicto SI algún otro dispositivo I2C usa la misma dirección de dispositivo?

En segundo lugar: ¿Hay alguna manera 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?

    
pregunta Robotometry

1 respuesta

6
  

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

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

Dos formas de mitigar un conflicto de dirección de esclavo serían distribuir los dispositivos en varios buses I 2 C en el maestro I 2 (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). [Vea a continuación otro enfoque.]

  

En segundo lugar: ¿Hay una manera 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 C 2 , o el rango de I 2 seleccionable Direcciones C, es 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 pueden programarse para usar.

Editado para agregar: otro enfoque para evitar I 2 conflicto de direcciones de bus C, como comentó amablemente @DoxyLover, es usar Linear Technologies I 2 C traductores de direcciones - 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) I 2 traducción de direcciones C entre el original y el nuevo I 2 segmentos de bus C

Desde sus hojas de datos, también agregan otras funciones, por ejemplo, Detección incorporada de "bus atascado" y conversión de nivel de voltaje. Sin embargo, si bien son compatibles con las funciones comunes de I 2 C, 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 podría conectarse otro conjunto de (hasta) ocho dispositivos MCP23017 . Supongamos que I 2 Las direcciones C 0x30 - 0x37 están libres en el bus I 2 C conectadas directamente al maestro, pero el nuevo conjunto de dispositivos MCP23017 necesita usar su fijo direcciones 0x20 - 0x27 . El LTC4316 se configuraría con un valor de "byte de traducción" de 0x10 .

En el segmento de bus C "salida" I 2 de LTC4316, el nuevo conjunto de ocho dispositivos MCP23017 "ve" sus direcciones% C_de% I 2 habituales, como ellos requieren. Sin embargo, en la "entrada" I 2 C segmento de bus donde el I 2 C maestro está conectado, el I 2 C maestro los abordaría usando I 2 C direcciones 0x20 - 0x27 , con el LTC4316 traduciendo una dirección de 0x30 - 0x37 en el segmento de bus de "entrada" (lado maestro), a 0x3n en la "salida" (lado esclavo) segmento de bus [donde 0x2n = n ].

    
respondido por el SamGibson

Lea otras preguntas en las etiquetas