4 votos

Utilizando el MLX90614 ¿O es compatible con I2C y SMBus?

Estoy tratando de usar un Melexis MLX90614 con el Atmega8. He fracasado 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 esclava NACK para ambas direcciones SMBus. ¿Es porque estoy usando una librería I2C? Entiendo que tenemos que dar un PEC también, pero como la dirección Slave es NACK'd no creo que el sensor está respondiendo a mis comandos. Intenté usar el opcode de escritura y obtuve ACK's para eso. Así que la comunicación está bien. ¿Puede alguien decirme qué tipo de problema puede haber aquí?

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

Miré este código y sólo envía 0x00 y 0x07 sobre 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?

3voto

JW. Puntos 145

Teóricamente

I2C y SMBUS son esencialmente compatibles siempre que se opere a una velocidad de bus de 100kHz. La hoja de datos en la página 15 (7.4.3.1.1) sugiere que para leer un registro 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ás resistencias pullup en las líneas SCK y SDA (3,3kOhm debería estar bien). El valor de los comandos dependerá de lo que estés tratando de hacer como se describe en la página 16 (7.4.6).

La 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 sistema de bus, la comunicación debe comenzar con cero SA seguido de un bit RWB bajo. Cuando se envía este comando desde el MD, el MLX90614 siempre responderá y ignorará la información del código de chip interno interno.

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

Si hay que creer 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 contigo en que no se describe así en la hoja de datos.

Nota sobre el 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 del PEC incluye todos los bits excepto los bits START, REPEATED START STOP, ACK y NACK. El PEC es un CRC-8 con el polinomio X8+X2+X1+1. El bit más significativo de cada byte se se transfiere primero.

Básicamente es CRC-8-CCITT (ver wikipedia ) - existen implementaciones, sólo tienes que buscar en Google, o publicar una pregunta separada sobre CRC...

i-Ciencias.com

I-Ciencias es una comunidad de estudiantes y amantes de la ciencia en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X