Schätzung der EEPROM-Lesezeit

Dies ist eine Frage in Bezug auf USB-Übertragungen, die meine Software-GUI zum Absturz bringen .

Ich habe diese Frage separat gepostet, damit ich meine Frage getrennt von der anderen klären kann.

Ich habe hier den gleichen Betriebscode und möchte fragen: Wie können wir die EEPROM-Lesezeit aus der I2C-Kommunikation mit 100 kHz abschätzen?

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

Ich vertraue darauf, dass das Lesen eines Datenblocks aus dem EEPROM keinen Schaden anrichtet, als adc_conversions und Berechnungen durchzuführen.

Ich möchte keine genaue Zeitdauer. Aber ich vertraue darauf, dass das Lesen ziemlich schnell erfolgt und nicht das Schreiben, das mindestens 5 ms dauert.

Ich konnte jedoch keine EEPROM-Lesezeit finden, da dies von der Baudrate der Kommunikation abhängt (I2C hier bei 100 kbps).

Ich würde gerne Ihre Gedanken und Informationen in Bezug auf dieses Problem haben.

Startbedingungen, Stoppbedingungen, Adressbits, Operationsbits, Datenbits. Addieren Sie diese und dividieren Sie sie durch die Bitrate (da Lesevorgänge bei dieser Frequenz im Wesentlichen latenzfrei sind).

Antworten (2)

Sie können es berechnen, indem Sie das EEPROM-Datenblatt lesen und die Zeit addieren, die zum Übertragen aller Bits benötigt wird, wie Ignacio Vazquez-Abrams in einem Kommentar vorgeschlagen hat. Da Sie bereits ein Gerät ausgewählt haben und es funktioniert, finden Sie es möglicherweise einfacher, es einfach zu messen. Normalerweise würde ich so etwas tun und ein Oszilloskop verwenden, um es zu messen:

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

Wenn Sie kein Oszilloskop haben, können Sie den Messwert in eine Schleife einschließen und möglicherweise eine LED mit etwas wie dem folgenden ein- und ausschalten:

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

Abhängig davon, wie viele Bits übertragen werden, dauert der zweite Codeabschnitt wahrscheinlich etwa 30 Sekunden, die Sie mit einer Stoppuhr ziemlich genau messen und dann durch 100.000 teilen können.

Beide Methoden führen zu Fehlern aufgrund der Zeit zum Umschalten einer E / A-Leitung und im letzteren Fall der Schleifenverzögerungen, aber ich denke, für Ihre Zwecke sollten sie nahe genug sein, und Sie finden es möglicherweise einfacher, als zu versuchen, es zu berechnen Exakt.

Die tatsächliche Lesezeit auf einem SEEPROM ist im Grunde sofort (ein Taktzyklus, wie bei einem seriellen RAM). Sie möchten die Datenübertragungszeit über den I2C-Bus messen, was eine andere Frage ist, und Sie haben eine Antwort darauf.

Das Schreiben dauert länger, da ein viel langsamerer Prozess (Fowler-Nordheim-Tunnelung) verwendet wird, um schwebende Transistorgates an der/den Zielstelle(n) zu löschen und dann zu schreiben. Die Schreibzeit beträgt Millisekunden statt Nanosekunden.

Aus diesem Grund werden im Datenblatt die Lesezeiten nicht gesondert angegeben.