¿Puedo usar el bus I2C o GPIO como I2C para conectar dispositivos I2C?

2

Esta pregunta tiene que ver con el uso de bus / GPIO I2C como I2C.

Mi procesador de aplicaciones tiene tres controladores I2C. ¿Es preferible conectar todos los dispositivos I2C (obviamente no podemos conectar más de 128 dispositivos en I2C) en estos buses?

O, ¿es preferible usar GPIOs como I2C? (El procesador de mi aplicación también tiene líneas GPIO que puedo usar para propósitos de I2C).

¿Cuándo es preferible usar controladores I2C y cuándo es preferible usar líneas GPIO para la interfaz I2C?

    
pregunta Adam Lawrence

3 respuestas

4

Dependiendo de la cantidad de datos que van a lo largo del bus, y si hay "conflictos" de ID de dispositivo, o datos que se transfieren al mismo tiempo, no hay problema para colgar todos sus dispositivos en un bus. Para eso fue diseñado I2C.

Para distribuir la carga, usar 2 o 3 buses I2C puede facilitar las cosas (por ejemplo, mantener diferentes sistemas separados) pero puede significar que tiene que hacer lo mismo 3 veces en el software. Puede hacer algo como usar un bus para la transferencia de "alta velocidad" de gran cantidad de datos (por ejemplo, a / desde un dispositivo de almacenamiento) y otro bus que funcione mucho más lento para realizar actividades menos críticas, como leer un sensor de temperatura cada segundo o encender un LED. on / off.

El I2C de bit bit que usa pines GPIO es un "último recurso" ya que generalmente es mucho más fácil usar el dispositivo I2C incorporado, y la mayoría de los procesadores tienen cosas como controladores de interrupciones y DMA para hacer el trabajo mucho más fácil, automatizar el transferencias, ahorrar carga de procesador / sobrecarga de software, etc.

Es mucho mejor que las comunicaciones se manejen mediante interrupciones en lugar de intentar hacerlo mediante GPIO + esperas / temporizadores, etc., especialmente si tiene mucho que hacer / muchos datos que mover.

Editado para agregar: También puede ser útil usar un bus para dispositivos que necesitan un cambio de nivel (los dispositivos EG 5v se conectaron a un micro de 3.3v en un bus, a dispositivos nativos de 3.3v en el otro autobús)

    
respondido por el John U
0

Si está implementando un maestro I2C para un sistema de un solo maestro, sugeriría que el uso de bits sea más preferible que tratar de usar hardware integrado. Entre otras cosas:

  1. Si alguno de los dispositivos en el bus I2C se "confunde", a veces puede ser difícil convencer a las implementaciones maestras de hardware para generar las mejores formas de onda para que se "despeguen" (enfoque recomendado: si SDA no está flotando, o si su el dispositivo está bajando el SCK, afirma SDA, afirma CLK, libera SDA, libera CLK y espera a que CLK suba, repite según sea necesario, y luego afirma y libera SDA con SCK alto). Tenga en cuenta que si un dispositivo EEPROM pensó que estaba en medio de un ciclo de escritura, esta forma de onda causará que aborte la escritura en curso; Si el procesador no sabe por qué la EEPROM esperaría escribir datos, abortar la escritura es probablemente mejor que escribir datos de los que el procesador no sabe nada. Fácil de hacer con golpes de bits; Más difícil de hacer (si es posible) en muchas implementaciones de hardware I2C.
  2. Muchas implementaciones de hardware I2C requieren que el procesador decida, antes de leer cada byte, si debe ser reconocido de manera positiva o negativa. En muchos casos, sería más conveniente tener una rutina de "byte de lectura" que envíe un acuse de recibo positivo, reconozca el byte anterior (si corresponde), lea el siguiente byte y no lo haga hasta que se necesite el siguiente byte; una vez que no se necesiten más datos, llame a una rutina de "lectura final" para enviar un reconocimiento negativo. Este tipo de enfoque es fácil cuando se usa el bit bitging, pero no conozco implementaciones I2C de hardware que permitan leer un byte sin tener que saber, de antemano, si será el último.

La facilidad o dificultad de escribir una implementación maestra I2C bit-bang es esencialmente independiente de la cantidad de dispositivos en el bus. Las implementaciones de esclavos I2C son generalmente difíciles o imposibles sin al menos algún nivel de soporte de hardware, pero un maestro I2C de gran impacto es fácil.

    
respondido por el supercat
0

Si su procesador de aplicaciones tiene hardware I2C que puede funcionar en modo maestro, ciertamente puede usarlo para comunicarse con dispositivos esclavos.

En comparación con las implementaciones de GPIO de bit banged, puede ser más rápido en términos de tiempo de desarrollo para usar el hardware incorporado. Lo más probable es que haya algunas bibliotecas que simplifiquen la configuración del modo y la actividad general que el maestro I2C deberá realizar (lecturas, escrituras, ACK, NACK, llamada general, serialización de bytes dentro y fuera, etc.)

Sin embargo, si el hardware de I2C está defectuoso o las bibliotecas no le brindan la funcionalidad que necesita, puede que le resulte mejor utilizar el I2C de GPIO bit bit y evitar el uso del hardware de I2C. El inconveniente, por supuesto, es tener que escribir mucho más código.

    
respondido por el Adam Lawrence

Lea otras preguntas en las etiquetas