Estimación del tiempo de lectura de la EEPROM

Esta es una pregunta en relación con las transmisiones USB que bloquean la interfaz gráfica de usuario de mi software .

Publiqué esta pregunta por separado para poder aclarar mi pregunta por separado de la otra.

Tengo el mismo código operativo aquí y me gustaría preguntar: ¿Cómo podemos estimar el tiempo de lectura de EEPROM de la comunicación I2C que se ejecuta a 100 kHz?

main()
{
    usbinit(); // usb initialization
    while(1)
    {         
        x=do_eepromread();
        UsbTasks(); // does usb works
        yourtasks(); //sends the buffer
    }
}

Confío en que leer una parte de los datos de la EEPROM no hará más daño que hacer adc_conversions y cálculos.

No quiero una duración de tiempo precisa. Pero confío en que la lectura ocurrirá bastante rápido en lugar de escribir, lo que tomará un mínimo de 5 ms.

Sin embargo, no pude encontrar ningún tiempo de lectura de EEPROM porque depende de la velocidad de comunicación en baudios (I2C aquí a 100 kbps).

Me encantaría tener sus pensamientos e información con respecto a este problema.

Condiciones de inicio, condiciones de parada, bits de dirección, bits de operación, bits de datos. Súmelos y divídalos por la tasa de bits (ya que las lecturas son esencialmente de latencia cero en esa frecuencia).

Respuestas (2)

Puede calcularlo leyendo la hoja de datos de EEPROM y sumando el tiempo necesario para transferir todos los bits como sugirió Ignacio Vázquez-Abrams en un comentario. Debido a que ya seleccionó un dispositivo y lo tiene funcionando, puede que le resulte más fácil medirlo. Normalmente haría algo como lo siguiente y usaría un osciloscopio para medirlo:

// Take an I/O pin high
x=do_eepromread();
// Take the I/O pin low

Si no tiene un alcance, puede encerrar la lectura en un bucle y tal vez encender y apagar un LED con algo como esto:

uint32_t i;
// Turn on LED
for (i=0; i < 100000; i++)
    x=do_eepromread();
// Turn off LED

Dependiendo de cuántos bits se transfieran, la segunda parte del código probablemente tomará alrededor de 30 segundos, lo que debería poder medir con una precisión razonable con un cronómetro y luego dividirlo por 100,000.

Ambos métodos introducirán algún error debido al tiempo para alternar una línea de E/S y, en el último caso, el bucle se retrasa, pero creo que para sus propósitos deberían estar lo suficientemente cerca y puede que le resulte más fácil que tratar de calcularlo. exactamente.

El tiempo de lectura real en una SEEPROM es básicamente instantáneo (un ciclo de reloj, como una RAM serial). Desea medir el tiempo de transferencia de datos a través del bus I2C, que es una pregunta diferente, y tiene una respuesta para eso.

La escritura lleva más tiempo porque se usa un proceso mucho más lento (tunelización de Fowler-Nordheim) para borrar y luego escribir puertas de transistores flotantes en las ubicaciones de destino. El tiempo de escritura es de milisegundos en lugar de nanosegundos.

Es por eso que la hoja de datos no especifica los tiempos de lectura por separado.