i2c colisión maestra múltiple

3

Esta es una pregunta corta pero aparentemente importante.

¿Es posible que un bus i2c con varios maestros tenga dos maestros que envíen el byte de inicio casi exactamente al mismo tiempo?

Si es así, ¿qué pasaría?

    
pregunta dylnmc

1 respuesta

4

Es perfectamente posible que dos maestros envíen un bit de inicio a exactamente al mismo tiempo, donde exactamente quiero decir que la diferencia entre los frentes descendentes de los bits de inicio es menor que la diferencia medible más pequeña por los maestros.

Ese es el punto: cuando un maestro está escribiendo en el bus i2c, también lo está monitoreando, por lo que es posible determinar si se está produciendo una colisión.

Digamos que dos maestros, A y B, conectados al mismo bus, quieren abordar dos dispositivos diferentes, uno con la dirección 0xAE (desde A) y el otro con la dirección 0xA6 (desde B). Los maestros envían el bit de inicio casi al mismo tiempo, luego comienzan a enviar la dirección. Desde 0xA = 0b1010 envían la secuencia 1010, hasta ahora bien, pero 0xE = 0b1110, mientras que 0x6 = 0b0110. El quinto bit difiere, y A intenta enviar un 1, mientras que B envía un 0.

¿Quién gana? B, por supuesto, debido a que i2c es un bus de colector abierto, las líneas solo se pueden atar a baja. Para enviar un 1, simplemente apague la salida y una resistencia de pull-up externa ata la línea a un nivel alto, mientras que para enviar un 0, active un pull-down. El Maestro A entonces está enviando un 1, pero midiendo un 0. Gran bandera roja, ¡colisión de autobús! La máquina de estado Master A debe manejar adecuadamente la situación, dejando el bus a B.

Tenga en cuenta que, desde el punto de vista B, no ha ocurrido nada y continúa feliz con el marco. Eso es muy bueno porque no se pierde tiempo y B puede hacer lo que sea necesario.

Si bien parece que un bus de colector abierto es la solución a todos los problemas, desafortunadamente no es así. El bus puede ser bloqueado fácilmente por cualquier dispositivo defectuoso que decida mantener bajo SCL o SDA. En tales situaciones, es muy difícil restablecer el bus, a veces los dispositivos tienen un pin de restablecimiento, a veces hay que apagarlos y otras veces hay que pensar en algo diferente. Tenía que hacer los tres en diferentes aplicaciones.

Como nota al margen, tenga en cuenta que no todos los maestros implementan la especificación completa, algunos maestros no implementan la detección de colisión de bus y esto puede ser muy malo. En el ejemplo anterior, si ni A ni B pueden detectar la pérdida del arbitraje, la dirección enviada en el bus es 0b10100110, es decir, la dirección del esclavo B, pero cuando llega el ACK, A cree que proviene de su esclavo, y luego las cosas pueden ponerse muy mal. .

También existe la posibilidad de que A y B quieran el mismo esclavo. Si esto sucede, se recibe el ACK y entonces pueden suceder muchas cosas.

Por lo general, los dispositivos i2c tienen muchos registros que se pueden escribir y / o leer, el marco de comunicación se ve algo así como:

slave address; ACK; reg address; data;

(Omitir los bits de inicio y parada y el bit WR).

Los maestros comienzan a enviar la dirección de registro. Si quieren acceder a un registro diferente, simplemente sucede lo que sucedería con la dirección del esclavo: en cierto punto, uno de ellos detecta la pérdida del arbitraje y se da por vencido.

Si los maestros quieren acceder al mismo registro, o el dispositivo i2c tiene un comportamiento predeterminado como "si detecto mi dirección, le diré la temperatura", entonces ... ¡Todo está perfectamente bien! Ambos maestros querían exactamente lo mismo, y lo están obteniendo, y esto está bien según el estándar.

Dos comunicaciones en un solo cuadro, ¡toma ese Nyquist!

    
respondido por el Vladimir Cravero

Lea otras preguntas en las etiquetas