I2C combinando operaciones de lectura y escritura

1

Estoy diseñando mi propio protocolo de datos para la comunicación entre PIC, IC, etc. y en la especificación me gustaría compararlo con el protocolo I2C existente.

Hay dos tipos de operación en el bus I2C:

  • Operación de escritura: el maestro escribe el INICIO, la dirección, los datos (el esclavo solo envía ACK)
  • Operación de lectura: el maestro escribe START, dirección. El esclavo envía datos, el maestro envía ACK / NACK.

Para aclarar esto, ¿hay alguna forma de usar estas operaciones, de acuerdo con la especificación del protocolo, para leer y escribir datos dentro de una sola operación? Ganaría velocidad porque no tiene que enviar la dirección dos veces. Entonces, ¿es esto posible?

    
pregunta Keelan

4 respuestas

4

No hay forma de hacer lo que quieres y aún así seguir el protocolo I2C. Lo más cercano que puede obtener es la condición de "Inicio repetido". Incluso con un inicio repetido, debe enviar la dirección una segunda vez para leer.

El "inicio repetido" se utiliza en el caso de un sistema con varios maestros, y permite que un maestro bloquee el bus y evite que otro maestro lo tome. En lugar de emitir un bit de parada, el maestro envía otro bit de inicio y retiene el control del bus hasta que se envía el bit de parada. De esta manera, podría llamar al inicio repetido una sola "operación", aunque se puedan realizar múltiples lecturas / escrituras.

En su protocolo teórico, ¿cuánta velocidad cree que ganará al no emitir la dirección por segunda vez? ¿Es ese ahorro de tiempo necesario para su diseño?

    
respondido por el dext0rb
4

No es posible en absoluto. Dado que hay un solo pin de entrada y salida de datos, no puede leer y escribir simultáneamente.

    
respondido por el Brian Carlton
3

I2C utiliza el bit menos significativo del byte de dirección para controlar si la operación es una lectura o escritura. No importa qué, la dirección siempre se envía al comienzo de una transacción, y se envía si hay un reinicio, por lo que su declaración sobre no tener que enviar la dirección dos veces no tiene sentido para mí.

En una escritura / lectura "combinada", todavía hay sobrecarga de dirección:

  • El maestro envía Inicio, luego dirección de esclavo + escritura; esclavos esclavos
  • El maestro envía datos, esclavos
  • El maestro envía Reinicio, luego dirección de esclavo + lectura; esclavos esclavos
  • El esclavo envía datos, ACKs / NACKs maestros
  • El maestro envía Stop

Si desea una comunicación verdaderamente simultánea, necesita múltiples buses I2C independientes (y, obviamente, múltiples maestros y esclavos).

    
respondido por el Adam Lawrence
1

¿Quiere ahorrar velocidad al no escribir 8 bits adicionales a 100/400 / 1000khz? Solo se estaría ahorrando (a una velocidad de 100 kHz) 8/100000 segundos (0,08 milisegundos / 80 microsegundos). Es una cantidad de datos trivial.

Pero, No se puede hacer en i2c o SMBUS standard . Pero si está escribiendo su propio protocolo de datos, adelante, es su protocolo, usted decide si puede combinar lectura / derecha . Diseñe para que un inicio repetido signifique que solo el mismo esclavo al que se dirigió el inicio inicial entra en modo de lectura sin direccionamiento.

Inicio - Escribir dirección - Datos - Datos - Reiniciar - Leer - Leer

Aunque no será compatible con el estándar i2c.

    
respondido por el Passerby

Lea otras preguntas en las etiquetas