¿Todos los dispositivos I2C tienen direcciones de lectura y escritura separadas?

3

Estoy usando un dispositivo I2C en particular, y cuando está conectado, necesito escribir datos enviándolos a la dirección 0x30, pero luego, para leerlos, necesito leer la dirección 0x31 (o haciendo 0x30 | 0x01).

¿Es normal tener dispositivos I2C con dos direcciones diferentes como esta?

    
pregunta user9993

4 respuestas

11

El primer byte enviado en el bus I²C consta de la dirección de 7 bits y un bit para indicar lectura / escritura.

Todos los dispositivos funcionan de esta manera, pero estrictamente hablando, la dirección es la misma.

    
respondido por el CL.
5

Lo que ves es correcto. Ha encontrado una anomalía en la forma en que vemos el primer byte que se envía al dispositivo. Técnicamente, la dirección del dispositivo es de 7 bits, y estos se desplazan en 1 a los 7 bits superiores. El bit 0 es técnicamente el bit de lectura / escritura, y no es parte de la dirección. Pero debido a que enviamos todo como un byte, nosotros (los programadores) tendemos a ver todo el byte como una dirección. Si estuviera diseñando el hardware real, lo vería de manera diferente.

Al final, a veces tenemos que adivinar el contexto en el que se da la "dirección". Y a veces, solo tenemos que intentarlo (o leer la hoja de datos) para averiguar de qué manera es.

    
respondido por el gbarry
1

En cada hoja de datos del dispositivo i2c encontrará una sección que detalla cómo abordar su dispositivo en modo de escritura o lectura. la dirección se compone de 7 bits y la mayoría de los 7 bits se configuran en fábrica. La forma en que se configuran los bits restantes depende de cómo diseñó su circuito.

Ejemplo práctico:

imaginemos que tiene un chip MCP3426 en su tablero, la hoja de datos nos lo indica en la fig. 5.1 que los bits 3,4,5 y 6 se configuran en la fábrica y los bits 0,1 y 2 se configuran como se muestra en la tabla 5.3 y, por lo tanto, dependen de cómo se conectan los dos pines de dirección a la placa (ya sea a tierra o conectado a Vss o incluso dejados desconectados).

de esta tabla y asumiendo que los pines de la dirección de su chip están conectados a tierra, su dirección de 7 bits se convierte en: 1101000 (0x68)

ahora, para leer el chip, debe cambiar esos 7 bits por un bit a la derecha: lo que le da 0xD0 y OR 0x1 (que es aumentar el bit de lectura / escritura) que le da 0xD1. esa es la dirección que envías cuando quieres escribir.

Si desea escribir, la dirección se convierte en 0xD0 ya que el bit de lectura no se levanta.

    
respondido por el Patrick Regnouf
1

El problema básico es que estás interpretando todo el primer byte como la dirección. En realidad, solo los 7 bits superiores del primer byte son la dirección, y el bit bajo indica si la secuencia IIC se leerá o escribirá.

Si observa detenidamente, verá que la dirección es la misma en ambos casos. Para escribir, envía un valor de byte de dirección de 30h = 00110000b. La dirección son los 7 bits a la izquierda de eso, que es 0011000b = 24. Para leer desde el dispositivo, el primer byte nuevamente tiene esta misma dirección de 0011000b en los bits altos y 1 en los bits bajos: 00110001b = 31h.

Hay más información sobre este problema en Cómo mostrar la dirección I2C en hexadecimal .

    
respondido por el Olin Lathrop

Lea otras preguntas en las etiquetas