Programar lo que hay en la línea i2c

0

Estoy trabajando en un proyecto que utiliza un simple microcontrolador (I2C) maestro y un componente (I2C esclavo). Cuando el microcontrolador recibe energía, lo primero que debe hacer es determinar qué dispositivo está en la línea I2C. Solo se espera un dispositivo en la línea.

¿Cómo se podría determinar qué dispositivo está en la línea I2C?

He pensado en algunas maneras:

  1. Intente todas las direcciones posibles para los elementos y luego busque la ID del dispositivo en cada elemento. (He encontrado que la ubicación del registro de ID del dispositivo es diferente en la mayoría de los chips).
  2. Envíe una solicitud de ID de dispositivo, pero la especificación dice que esto es opcional. Y no pude encontrar a nadie que confíe en esto.
  3. Dirija de forma única cada componente, cree un mapa. (es decir, esta dirección significa que debe ser este componente). Pruebe cada dirección.

Para un contexto adicional, una vez que se determina el dispositivo, las capacidades se asignan en el firmware y el firmware se ejecuta.

Solución 1 suena como un enfoque de fuerza bruta. Me gustaría que esto fuera rápido, y esto no parece ser rápido.

Solución 2 no es confiable, pero tal vez solo sea por mi falta de experiencia.

Solución 3 parece posible, pero luego estoy limitado a la cantidad de dispositivos I2C que el espacio de direcciones puede admitir.

    
pregunta SyntaxRules

2 respuestas

3

La exploración de todas las direcciones posibles es probablemente la más sencilla, suponiendo que no se sabe de antemano cuál es la dirección del esclavo. I2C no es tan lento (100s de kbit / seg), por lo que escanear 128 direcciones no tomará mucho tiempo.

Ahora, una vez que haya identificado qué direcciones están disponibles en el bus, el siguiente paso es comunicarse con ellas. Esta es la razón por la que el escaneo generalmente no se realiza en todo el rango: generalmente, el firmware solo sabe cómo hablar con algunos dispositivos, y las direcciones de estos dispositivos están codificadas en el firmware. Este es el caso porque, en general, las direcciones de los dispositivos I2C no son muy flexibles: o bien son completamente fijas, o en su mayoría se fijan con un par de bits configurables a través de la fijación de pines. Esto generalmente significa que estás atascado con la solución 3 por defecto.

    
respondido por el alex.forencich
2

Solución 3 suena como la solución más probable. I2C no fue pensado como plug and play. En general, es una buena idea saber qué está conectado y dónde está.

    
respondido por el Daniel

Lea otras preguntas en las etiquetas