¿Cómo puede el maestro conectarse a un esclavo en una dirección I2C incorrecta?

0

Conecté un expansor IO (PCA6416A) a Arduino usando el bus I2C. Utilicé secuencia de comandos del escáner I2C para encontrar la dirección. Probé velocidades de reloj de 30 a 100 kHz y usé resistencias de 2k y 10k en las líneas de bus. Siempre que lo haga, el script siempre detecta el expansor IC en la dirección 0x40 mientras que de acuerdo con la hoja de datos el expansor IC es 0x80 o 0x82 (en realidad en mi tablero debe ser 0x80). Curiosamente puedo leer los registros de IC sin error pero con un poco de ruido. Entonces, mi pregunta es ¿por qué el maestro I2C detecta constantemente esclavos en una dirección incorrecta?

    
pregunta Amir Samakar

3 respuestas

3

Has leído mal la hoja de datos. Como puede ver en la página en cuestión:

Ladireccióndelesclavoesuncampode7bitsqueelescánerI2Cinformacomo0x40(o0x41segúnelpinADDR).

Sinembargo,paraserhonesto,noveodedóndesacas0x80.Esonosemencionaenlahojadedatos,yladirecciónde"8 bits" que se muestra en el gráfico sería 0x40 (o 0x42) y la de 7 bits sería 0x20 (o 0x21).

¿Observa cómo el bit de orden superior es cero? No hay forma de que sea 0x80.

    
respondido por el Nick Gammon
1

Lo que está confundiendo es el campo de dirección I2C de 7 bits (que no es un campo HEX o de 8 bits) con los registros de 8 bits utilizados por una MCU para construir la dirección lógica y el indicador de dirección. Escribí una cobertura de esto para un libro de Raspberry pi que podría ayudarte:

ElcontenidoderegistroparaquecomienceunatransacciónconelprimerPCA6416Aensusistemaqueutilizalabibliotecadesoftwaresería0x40paraescribiry0x41paraleer.ParaelsegundoPCA6416A(ADDR=1)susvaloresderegistroserían0x42paraescribiry0x43paraleer.Ydadoqueelsoftwaredelescáner(queescaneausandosoloescribeyvalidacuandoveACKdelesclavo)simplementedevuelveladirecciónACKenlos7bitssuperiores,demodoqueterminatratandoconesosvaloresderegistroHEX.Tengaencuentaque,enlahojadedatos,evitancuidadosamenteelusodelarepresentaciónHEXdedatosysemantienenconvaloresdebitsencamposde8bitsparaevitarconfusiones.

TodoelCapítulo6enI2Ces aquí en los libros de Google tal vez pueda ayudarte.

Hay dos esquemas de direccionamiento, 7 bits y 10 bits.
Puede leer sobre los estándares de direccionamiento I2C de enlace o de NXP (Phillips) que desarrolló los primeros dispositivos, enlace

También hay una especificación relajada de baja velocidad (100, 400, 1 Mbps) llamada SMBUS (y un PMBUS similar) que se usa en prácticamente todas las placas base de PC para tareas de administración (fuentes de alimentación, ventiladores, sensores de temperatura, etc.). Verá muchas implementaciones de estos buses de 10k a 400k bps, pero todas están limitadas a direccionamiento de 7 bits.

    
respondido por el Jack Creasey
0

Creo que estás confundido sobre cómo se informan:

de enlace ,

  

Hay versiones de 7 y 8 bits de las direcciones I2C. 7 bits identifican el dispositivo, y el octavo bit determina si se está escribiendo o leyendo. La biblioteca Wire utiliza direcciones de 7 bits en todo. Si tiene una hoja de datos o un código de muestra que utiliza una dirección de 8 bits, querrá descartar el bit bajo (es decir, cambiar el valor un bit a la derecha), produciendo una dirección entre 0 y 127. Sin embargo, las direcciones de 0 a 7 no se utilizan porque están reservados, por lo que la primera dirección que se puede usar es 8.

La biblioteca de Arduino Wire elimina el bit R / W, mientras que la hoja de datos lo incluye.

    
respondido por el Daniel

Lea otras preguntas en las etiquetas