¿Utiliza MLX90614 O es compatible con I2C y SMBus?

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

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

Obtengo una dirección esclava 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 está NACK, no creo que el sensor esté respondiendo a mis comandos. Intenté usar el código de operación de escritura y obtuve ACK para eso. Así que la comunicación está bien. ¿Alguien puede decirme qué tipo de problema puede haber aquí?

Además, ¿cómo se generaría un PEC para el protocolo SMBus?

Miré este código y solo envía 0x00 y 0x07 a través de i2c para obtener dos bytes de temperatura. ¿Cómo puede ser eso 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?

en respuesta a "¿cómo puede ser eso posible?" - es una "característica" :).

Respuestas (1)

teóricamente

I2C y SMBUS son esencialmente compatibles siempre que opere 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) debe 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 intente 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:

Para proporcionar acceso a cualquier dispositivo o para asignar una dirección a un SD antes de que se conecte al sistema de bus, 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á e ignorará la información del código de chip interno.

... 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 cree en el código de 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 de acuerdo en que no se describe de esa manera en la hoja de datos.

Nota al margen sobre PEC

En cuanto a "cómo generar el PEC", se describe en la página 14 en la parte inferior de la página:

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

Básicamente es CRC-8-CCITT (ver wikipedia ): existen implementaciones, solo busque en Google o publique una pregunta separada sobre CRC ...

He probado todo eso, también tengo un 4.7K en las líneas SCK y SDA. Pero obtengo un NACK para 0x5A incluso para transmitir.
@Rick, mira las adiciones que he hecho