¿Usar MLX90614 O es compatible con I2C y SMBus?

4

Estoy tratando de usar un Melexis MLX90614 con Atmega8. He fallado en todos mis intentos hasta ahora. He intentado enviar esta secuencia

slave address(as 0x00 and 0x5A) --> opcode to read SMBus address 
     --> data byte high --> data byte low

Obtengo una dirección de esclavo NACK para ambas direcciones SMBus. ¿Es porque estoy usando una biblioteca I2C? Entiendo que también tenemos que dar un PEC, pero como la dirección del Esclavo es NACK, no creo que el sensor esté respondiendo a mis comandos. Intenté usar el opcode de escritura y obtuve ACK para eso. Así que la comunicación está bien. ¿Alguien puede decirme qué tipo de problema puede haber aquí?

También, ¿cómo se podría generar un PEC para el protocolo SMBus?

Miré este código y simplemente se envía 0x00 y 0x07 sobre i2c para obtener dos bytes de temperatura. ¿Cómo puede ser posible? En la hoja de datos se menciona específicamente cómo leer una palabra y cómo escribir una palabra. ¿Cómo se puede evitar esto?

    
pregunta Rick_2047

1 respuesta

3

Teóricamente

I2C y SMBUS son esencialmente compatibles siempre que esté operando a una velocidad de bus de 100 kHz. La hoja de datos en la página 15 (7.4.3.1.1) sugiere leer un registro que usted (como maestro) tiene que hacer:

Start
SLA+W               (slave acks)
Command             (slave acks)
Repeated Start
SLA+R               (slave acks)
READ data byte low  (you ack)
READ data byte high (you ack)
READ PEC            (you ack)
STOP

El SLA apropiado es 0x5A. Al igual que con I2C, necesitará resistencias pullup en las líneas SCK y SDA (3.3kOhm debería estar bien). El valor del comando dependerá de lo que esté intentando hacer como se describe en la página 16 (7.4.6).

Realidad (?)

Sin embargo, hay un párrafo (7.4.1) en la página 13 que dice:

  

Con el fin de proporcionar acceso a cualquier   dispositivo o para asignar una dirección a un SD   antes de que se conecte al bus   sistema, la comunicación debe comenzar   con cero SA seguido de un bit RWB bajo.    Cuando este comando se envía desde el MD,   el MLX90614 siempre responderá y   ignorará el código interno del chip   información.

... ahora que es una descripción vaga de una especialización del protocolo en el mejor de los casos, pero parece ser lo que está explotando el código github.

Si uno es creer el código github, en realidad está ilustrando un comportamiento de protocolo no documentado. A saber:

START
SLA(0)+W   (slave acks)
Command(7) (slave acks) (writes to the RAM read-address register the value 7 = TOBJ1?)
STOP

START
SLA(0)+R        (slave acks)
READ low byte   (master acks)
READ high byte  (master acks)
READ pec        (master nacks)
STOP

He visto este "sabor" de la interacción I2C antes, pero estoy contigo en que no se describe de esa manera en la hoja de datos.

Sidenote en PEC

En cuanto a "cómo se genera el PEC", se describe en la página 14 al final de la página:

  

El cálculo PEC incluye todos los bits   excepto el INICIO, INICIO REPETIDO,   Bits STOP, ACK, y NACK. El PEC es un   CRC-8 con polinomio X8 + X2 + X1 + 1. los   El bit más significativo de cada byte es   transferido primero.

Básicamente es CRC-8-CCITT (consulte wikipedia ): existen implementaciones, solo busque Google para ello o publique un pregunta separada sobre el CRC ...

    
respondido por el vicatcu

Lea otras preguntas en las etiquetas