I2C - ¿Dónde está el ACK?

Estoy trabajando en el controlador maestro I2C para conectar un periférico en particular. El problema que tengo es que cuando llega el noveno reloj, el dispositivo esclavo no baja la línea SDA.

Revisé las señales con un alcance, y todo parece estar bien. la dirección está bien. No estoy usando resistencias pull-up externas, estoy usando la capacidad de pull-up interna de mi MCU (EFM32GG).

No soy ingeniero eléctrico y mi experiencia es del lado del software, por lo que esta pregunta puede ser tonta, pero ¿existe la posibilidad de que el dispositivo no pueda bajar la línea porque la unidad de extracción es demasiado alta?

¿Puede haber otra explicación para este problema (a excepción de la obvia, que el chip esclavo está muerto)?

También es posible que tenga la dirección del esclavo incorrecta, o que el dispositivo esté en un estado NAK, o que su reloj sea demasiado rápido. ¿Cuál es el dispositivo? ¿Cuál es la fuerza del pull-up interno?
@pjc50 El reloj es el más bajo posible en EFM32 (93458Hz), la dirección también se especifica en la hoja de datos. ¿Qué es un estado NAK?
Acabo de depurar un problema en el que necesitaba aproximadamente 1 uS desde el borde descendente de SCL hasta un cambio de SDA. Definitivamente no de acuerdo con la especificación I2C, pero eso es lo que se necesitaba para que funcionara.
Estado NAK: quise decir que el dispositivo realmente podría no estar listo por algún motivo. Sin una hoja de datos para el dispositivo esclavo, no sé si eso es posible.

Respuestas (3)

Con el osciloscopio, debería ver algún tipo de efecto en la línea de datos, incluso si la línea se levanta con demasiada fuerza. Puede caer solo medio voltio o algo así, no lo suficiente como para leerse como un cero.

También existe la posibilidad de que la dirección del esclavo sea incorrecta. A veces, la dirección se especifica como de 7 bits y, a veces, como de 8 bits. Este último será 2x el primero. Consejo gratuito: Escriba un bucle para probar todas las direcciones y pare si encuentra una que responda.

No, las direcciones IIC son de 7 bits, nunca de 8 bits. También hay un estándar extendido que usa un segundo byte de dirección y, por lo tanto, tiene una dirección más amplia (¿11 bits?), pero esto definitivamente es más de 8 bits, -1. Pero +1 por el consejo de probar todas las direcciones en un bucle, así que lo llamaremos parejo.
Me refería al negocio de "7 bits, pero lo cambiaron a la izquierda para dejar espacio para el bit R/W". Con gusto le dirán que la EEPROM está en 0x50, donde el resto del mundo dirá 0xA0. Por supuesto, está sujeto al contexto en el que se usa.
Estoy de acuerdo con gbarry, muchas hojas de datos especificarán una lectura de 8 bits y una dirección de escritura de 8 bits, que no es más que la dirección de 7 bits más el bit RW establecido o borrado.

Supongo que lo que quiere decir con "impulso de elevación demasiado alto" en este caso sería que la resistencia de elevación interna sería demasiado pequeña. Esto es muy poco probable. Puede asegurarse de esto activando el pull-up y haciendo que el pin sea una entrada. Luego, simplemente coloque una resistencia desde el pin a tierra, puede calcular la resistencia interna de extracción con la ecuación del divisor de voltaje . Recuerde 'resistencia pull-up grande' = 'tirón débil'.

El problema más probable es un problema de cableado, como intercambiar SDA/SCL al conectar el periférico o no tener una conexión a tierra común.

Lo segundo más probable sería el momento. Verifique el diagrama de tiempo I2C de su dispositivo esclavo (debe estar en la hoja de datos) y asegúrese de que se cumpla midiendo con el osciloscopio.

Finalmente, si no es ninguna de estas otras cosas, es posible que tenga un chip esclavo muerto. ¿Puedes probar otro?

Hay dos componentes principales para que esto funcione, la interfaz eléctrica física y los datos lógicos que se envían.

En el lado eléctrico, el maestro por sí mismo al menos parece estar funcionando correctamente si ve en un visor que las señales son buenas. Dado que no ha proporcionado parcelas, no podemos decir si son realmente buenas o si tiene una idea errónea de lo que es bueno. En el lado del esclavo, sí, los pullups deben ser lo suficientemente débiles como para permitir que el esclavo baje la línea SDA. Si no recuerdo mal, la especificación IIC dice que el esclavo solo necesita hundirse 3 mA para llevar la línea por debajo del nivel bajo lógico máximo. Si está utilizando una lógica de 5 V, por ejemplo, esto significa que el pullup no puede ser inferior a 5 V / 3 mA = 1,7 kΩ, por lo que una resistencia de 2 kΩ sería una opción razonable. Mire las especificaciones del pullup interno que está utilizando y asegúrese de que no pueda generar más de 3 mA. Si puede, no puede usarlo y tiene que usar un pullup externo.

En el lado lógico, debe asegurarse de que el esclavo esté siendo direccionado correctamente. La secuencia IIC debe comenzar con ambas líneas altas, luego una condición de inicio, que es SDA bajando antes de SCL bajando. Después de eso, para cada bit, SDA debe cambiar al nuevo valor, luego SCL sube, luego SCL baja nuevamente. Los primeros 7 bits son la dirección, luego el bit de lectura/escritura. Para el noveno bit, el maestro deja el SDA flotante y el esclavo debe bajarlo poco después de que el SCL baje.

En mi experiencia, la causa más común de no obtener una respuesta del esclavo es una dirección incorrecta.