5 votos

I2C EEPROM sólo el primer intento de lectura es correcto

Tengo un problema muy extraño en mi circuito. A saber, tengo 24LC01 EEPROM conectado a mi PIC32. Hice una "biblioteca" para leer y escribir en la memoria. Lo que ocurre es que sólo la primera lectura de datos me da datos correctos, mientras que cada intento posterior me da datos erróneos. El experimento es el siguiente. Escribí una página con 0x30 (0 carácter Ascii), así que desde la dirección 0 - 7. A continuación leo 8 bytes empezando por la dirección 0. La primera lectura es correcta e imprimo 00000000. El siguiente intento de lectura me da 0 y 7 caracteres desconocidos. Esto sucede de la misma manera hasta que se reinicia el MC.

Aquí hay algunas formas de onda.

En la primera onda, se puede ver que se envía la palabra de control, fue ACKed por el esclavo, luego viene la dirección de memoria en la que comenzar, en este caso 0. Luego viene el ACK y el evento de inicio repetido. A continuación, la palabra de control se envía de nuevo, pero esta vez con la bandera de lectura activada. Después sigue el primer carácter 0x30, y así sucesivamente, hasta el 8º.

First read, start of communication.

Al final del primer intento de lectura, se puede ver que se envía un NACK después del último byte, seguido de la condición de STOP en el bus.

enter image description here

A continuación, puede ver el inicio de la comunicación del segundo intento. La primera palabra de control es enviada correctamente y fue ACKed. A continuación vino la dirección desde la que debían leerse los datos (de nuevo 0), también fue ACKed. El siguiente maestro envía el comando de lectura repetido, y la segunda palabra de control con la bandera de lectura puesta (btw dirección del dispositivo es 1010xxx). La segunda palabra de control también fue ACKed, y el primer byte vino de la ubicación de memoria 0, que es 0x30 y como se puede ver también está bien, pero al final de ese byte SDL va alto y se mantiene allí hasta el final de la recepción.

enter image description here

En la siguiente foto se muestra el final de la ola. Como se puede ver SDL fue siempre alta, y sólo la condición STOp se envía al final.

enter image description here

¿Cuál puede ser el problema aquí?

0 votos

Un reloj de más

0 votos

No, sólo hay suficientes pulsos de reloj.

0 votos

No lo sé, ¿tu maestro está recibiendo el primer byte de datos? Si no es así y el esclavo está viendo un NACK, puede dejar de responder.

1voto

Ballpark Puntos 1341

El problema fue la suposición errónea de que la bandera para establecer ACK/NACK se restablecerá después de que desactive el pin I2C. Por lo tanto, el firmware estaba equivocado.

Por lo tanto, al final del primer ciclo de lectura la bandera de NACK se establece, y nunca se cambia de nuevo a ACK.

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