Supongamos que tenemos un bus I 2 C de 400 kHz . Hay un maestro y un montón de dispositivos esclavos. Nos gustaría presentar un dispositivo esclavo más, pero desafortunadamente solo llega a 100 kHz.
Claramente, las opciones de diseño sólidas son:
- solo corre ese bus a 100 kHz
- use buses separados para los periféricos de 400 kHz y 100 kHz
Pero la pregunta es sobre un truco: ¿qué pasa si usamos un bus y direccionamos los dispositivos de 400 kHz a 400 kHz y cambiamos el bus a 100 kHz cuando hablamos con el esclavo de 100 kHz?
¿O podría el esclavo más lento comportarse mal en respuesta al hash de 400 kHz que ve en las líneas I 2 C porque piensa erróneamente que se está abordando?
¿Podemos depender de dispositivos de 100 kHz para poder procesar la señal I 2 C de 400 kHz lo suficientemente bien como para ignorar de manera confiable los mensajes dirigidos a otros esclavos?
Respuestas:
Como sugiere, hacerlo no es una buena práctica de ingeniería. Si bien algunos dispositivos ignorarían el tráfico que no pueden recibir (submuestra), otros dispositivos pueden saturar el bus con tramas erróneas.
Por lo tanto, la respuesta que busca depende de los detalles específicos de su aplicación, tales como:
Por supuesto, es difícil predecir lo que sucedería con un dispositivo operado fuera de sus especificaciones dentro de unos años.
Otra opción es ejecutar una línea de apagado para reducir la velocidad de los dispositivos o pasar la línea del reloj (siempre que no puedan generar la señal del reloj) a través de una puerta AND.
fuente
Otra opción, si no tiene un bus I2C adicional que sale de su maestro, es usar un interruptor I2C, como el PCA9543A / 43B . Coloque los esclavos de 400 kHz en una rama y los esclavos de 100 kHz en la otra y cámbielos según sea necesario.
fuente
No hay garantía de que el dispositivo de 100kHz no se portará mal cuando se exponga al tráfico de 400kHz; es posible cualquier cosa, desde NACK hasta colgar del bus.
Debe ejecutar todo el bus a 100 kHz o tener un bus de baja velocidad separado para su periférico lento.
fuente
Otras opciones. En lugar de tener dos buses, simplemente puede usar una línea adicional (más fácil con un software / bitbanged I 2 C). Una línea de reloj separada o una línea de datos separada. O utilizar un I 2 C búfer o I 2 C Interruptor de poner ese chip de 100MHz única en su propio segmento, sin tener que cambiar nada más.
O simplemente pruébelo en un solo autobús. Es muy posible que el chip de 100kHz afecte la línea. Podría leer cada 4 bits y terminar pensando que se ha abordado. Pero tendría que ver una condición de inicio válida, y luego leer cada 4 bits de los siguientes 32 bits como su dirección exacta, luego tendría que intentar leer los siguientes bytes como información válida para escribir en sus registros , o intente desconectar los datos. No creo que sea una situación muy probable. La mejor opción es simplemente conectarlo en un circuito de prueba y verificarlo.
Dos cosas a tener en cuenta, si este es un circuito único, o si solo está haciendo algunos, es bastante fácil arriesgarlo o cambiarlo. Si es un artículo producido en masa, es posible que desee tener el segundo autobús. La otra, es que debe tener en cuenta que el chip de 100 kHz simplemente se produjo según la especificación I 2 C original y podría soportar velocidades de reloj más altas. Simplemente no se probó con la especificación de mayor velocidad de 400 kHz.
fuente
El diseño del bus I2C es tal que:
Debido a la diferencia en la fuerza del conductor y la capacitancia de la línea, sería teóricamente posible que un dispositivo responda a un borde de caída algo lento en SCL al conducir SDA tan rápido que otro dispositivo vería caer SDA primero.
Podría haber sido posible definir múltiples umbrales lógicos en SCL, y especificar que para que un borde descendente en SCL se considere que viene después de un borde en SDA, aún debe estar por encima de 2/3 VDD cuando se detecta el borde en SDA, pero un dispositivo no puede afirmar SDA en respuesta a un flanco descendente en SCL hasta que haya caído por debajo de 1/3 VDD, pero la especificación no está escrita en dichos términos.
En cambio, los dispositivos que ven bordes descendentes casi simultáneos en SDA y SCL generalmente considerarán que el borde en SCL sucedió primero a menos que esté precedido sustancialmente por el borde en SDA. Algunas implementaciones de I2C manejan esto sincronizando SCL y SDA con algún reloj externo y requiriendo que se observe un límite descendente de SDA dos períodos antes que el de SCL para que se considere que es lo primero. Si la velocidad de las operaciones en SCL y SDA es demasiado rápida en relación con el reloj de sincronización, los dispositivos pueden percibir secuencias arbitrarias de señales altas y bajas en SCL y SDA; Si una de esas secuencias parece que se dirige al dispositivo lento, puede reaccionar en consecuencia, aplastando cualquier otra comunicación que pueda estar ocurriendo.
No hay una razón particular por la que los dispositivos en un bus I2C deban depender de la sincronización con un reloj del sistema (sería mejor detectar dos umbrales discretos en SCL), pero el hecho es que algunos dispositivos funcionan de esa manera. Tenga en cuenta que incluso si un dispositivo que se limitaba a velocidades lentas internamente quisiera coexistir con un bus rápido, probablemente tendría que emplear, como mínimo, un reloj que se alargara cada vez que ocurriera algo que pudiera interesarle.
Esto provocaría que algunas comunicaciones se produjeran más lentamente de lo que podrían, pero la degradación de la velocidad probablemente no sería tan mala como se requiere con el diseño sincronizado con el reloj (la cantidad real por la cual el dispositivo lento estira los relojes probablemente no lo haría). ser tan malo como la cantidad por la cual el reloj debe reducirse para evitar fallas en el peor de los casos en las unidades de reloj sincronizadas).
fuente