Problema I2C NACK en el 3er byte MLX90614 - Inicio repetido

Estoy tratando de leer el sensor de temperatura infrarrojo Melexis MLX90614 a través de SMBus (protocolo similar a I2C o TWK).

El protocolo (SMBus) implementa un tipo especial de comando o secuencia llamado inicio repetido, eso significa que enviamos una condición de inicio sin una condición de parada previa.

Estoy usando un microcontrolador XMEGA usando bibliotecas TWI usadas en la nota de aplicación AN1308

Para leer los datos del sensor, necesito enviar 1 byte para escribir la dirección para leer y luego leer 3 bytes de datos. Por esa razón se utiliza el inicio repetido.

Ejemplo de lectura de datos

El problema es que obtengo ACK de los 2 primeros bytes (escribir la dirección y escribir el comando) pero obtengo NACK cuando envío la dirección después de la condición de inicio repetida

Tengo 3 capturas de Osciloscopio:

Secuencia general Secuencia general La condición de inicio repetido aparece OK, tenemos una condición de inicio en el medio sin una condición de parada previa. La dirección es correcta y el comando (dirección para leer) también está bien (0b00000110 - 6)

La inicialización del módulo es:

// ************** TWI Master config ****************
TWI_MasterInit(&twiMaster,
               &TWIC,
               TWI_MASTER_INTLVL_HI_gc,
               TWI_BAUDSETTING);

Y el uso es:

    TWI_MasterWriteRead(&twiMaster,
                        MLX90164_ADDR,
                        bufferTX,
                        1,
                        3);

MLX90614 es 0x5A y bufferTX es una matriz de caracteres sin firmar con 0x06 en la primera posición. También la tasa de baudios se establece en 100 kHz

No sé por qué obtengo NACK en el segundo byte de dirección para leer los datos del sensor, la condición de inicio repetido parece correcta. Además, las configuraciones de hardware deben estar bien porque obtengo ACK del 1er y 2do byte

gracias de antemano

¿Por qué hay dos picos después de la dirección del esclavo? Debería haber un solo ACK, que se espera que sea el segundo pico. Debería tener un "cero" en lugar del primer pico, que es el bit de comando de "escritura". ¿Usas pull ups en ambas líneas?
Utilizo una versión de 5 V de MLX90614 y un microcontrolador XMEGA D (fuente de alimentación de 3,3 V), por lo que necesito usar un cambiador de nivel. Estoy usando un circuito que es "seguro para I2C" para el cambio de nivel, basado en el transistor NMOS (BSS138)
No estoy seguro de cómo funciona su cambiador de nivel, pero debe mantener la señalización bidireccional para permitir que el maestro y el esclavo reduzcan las líneas SCL y SDA.

Respuestas (1)

Es difícil saberlo sin acercarlo más, pero parece que sin darse cuenta envió una parada inmediatamente después del inicio repetido. Parece que SDA subió un poco antes de que SCL bajara. Esto ciertamente evitaría que el esclavo haga ACK.

El primer Inicio tiene el mismo comportamiento, pero parece que no fue tan malo y, por lo tanto, no se percibió como una Parada.