El bus de comunicaciones I2C utiliza direccionamiento de 7 bits o 10 bits para direccionar dispositivos esclavos. Al tomar las direcciones de 7 bits más comunes, cada paquete enviado en el bus por el maestro comienza con una dirección de 7 bits seguida de un indicador de lectura o escritura de 1 bit (\ $ \ text {R} / \ overline {\ text { W}} \ $).
LamayoríadelashojasdedatossoloproporcionanladirecciónI2Cparasudispositivoennotaciónbinariaocomobitsenlosdiagramasdetiempo(connotasparalosbitsdedirecciónconfigurables),quesoninequívocas,yaquemuestransieteuochobitsparaquepuedasabersi\$\text{R}/\overline{\text{W}}\$bitestáincluido.Estopareceseguirla
El problema surge cuando se intenta escribir la dirección en hexadecimal. Diferentes fuentes convierten la dirección de diferentes maneras:
- Convierta la dirección de 7 bits a un valor hexadecimal en el rango
0x00
a0x7F
-
0b101 0011
se convierte en0x53
- Ejemplos Tutorial de Robot Electronics I2C , Linux i2cdetect tool , STM32 Biblioteca CPAL , Biblioteca de Arduino Wire
-
- Incluya el bit \ $ \ text {R} / \ overline {\ text {W}} \ $ como el LSB y proporcione dos direcciones, una para leer y otra para escribir en el rango
0x00
a0xFF
-
0b101 0011
se convierte en0xA6
para escribir y0xA7
para leer - A veces solo se proporciona la dirección de escritura (por ejemplo,
0xA6
) - Ejemplos: Tutorial del proyecto 8051 , STM32 HAL library ( ejemplo de confusión ), Ejemplos de código PIC de Microchip (CE119) , analizador de protocolo Saleae Logic
-
Estas dos opciones no siempre son distinguibles.
Claramente, usar la notación binaria es mejor, ya que te da una dirección inequívoca, sin embargo, esto no siempre es posible. Un caso notable es en C / C ++ donde hay no una forma particularmente estándar de escribir números binarios . Esto me lleva al problema que tengo donde la especificación de constantes para dispositivos en el circuito es ambigua.
Por lo tanto, al elegir un estándar para nuestros esquemas, documentación y código (C ++), tenemos que elegir de una manera u otra. Eso lleva a mi pregunta:
¿Existe una forma dominante de mostrar una dirección I2C en notación hexadecimal, o ambas se usan comúnmente?