Durante la transmisión de esclavos I2C, ¿quién maneja ACK / NACK?

0

Estoy viendo la hoja de datos de ATMega328 y la implementación Arduino UNO Wire / twi, así como el rastreo del analizador lógico de un dispositivo propietario al que estoy tratando de enviar datos.

El dispositivo está intentando leer desde N = 48 a 512 bytes. Sigue manejando el reloj para paquetes N (8 bits + ACK), pero la interrupción de la pila UNO solo envía 32 bytes por transacción.

La especificación me lleva a creer que el maestro debe NACK cuando se hace, pero el código de conexión en la máquina de estado lib UNO (para transmisión de esclavos) controla ACK / NACK cuando aún quedan datos.

Esto no está claro para mí: ¿quién controla ACK / NACK en el noveno bit durante una transmisión de esclavo?

Gracias, PeterT

    
pregunta PeterT

1 respuesta

3

No estoy seguro de si su pregunta está enfocada directamente en alguna característica particular de Arduino UNO (en ese caso no me queda claro qué está preguntando), pero para cualquier comunicación I2C en general, es lo mejor para verificar especificación I2C , en particular la página 10 en la versión actual.

La respuesta breve a su pregunta es: el bit ACK / NACK lo establece la parte que acaba de recibir un databyte independientemente del maestro o esclavo . Para el esclavo que envía datos al maestro, es el maestro quien debe manejar SDA para el bit ACK / NACK.

Los casos particulares en los que se debe enviar NACK en lugar de ACK se enumeran en la especificación. El esclavo debe ACK o la dirección NACK dependiendo de si es su dirección válida y si está dispuesta (o puede) a comunicarse en el momento. Debería ACK ACK cualquier dato recibido del maestro, excepto cuando no pueda recibir más datos o el byte recibido es de algún modo inválido (aunque, en la práctica, es probablemente una buena idea no esperar el comportamiento ACK / NACK de un esclavo particular aquí, excepto si Lo ha encontrado explícitamente mencionado en la hoja de datos).

Maestro, OTOH, debe ACK cada byte leído desde el esclavo, excepto el último byte que va a leer en la transacción actual. El último byte leído antes de emitir STOP o START repetido debe ser NACKed por el maestro.

    
respondido por el Martin

Lea otras preguntas en las etiquetas