Optimierung des Lesevorgangs Atmel AT25DF641



  • Hallo,

    ich habe vor kurzem den Atmel AT25DF641 Speicherbaustein in Betrieb
    genommen. Als Mikrocontroller habe ich ein ARM LPC2486.

    Ich habe mir ein kleines Programm geschrieben, um Daten auf den
    Speicherbaustein zu schieben und wieder auszulesen. Jedoch geht das
    Lesen ziemlich langsam.

    Ich habe eine Funktion

    char *memRead(int adresse , int laenge)
    

    die mir ein char array mit dem Inhalt der Speicheradressen zurückgibt.

    Um die Daten in das Array zu schreiben nutze ich eine For-Schleife

    for(i = 0; i < laenge; i++){
        SS_DR = 0; 
         ASK_FOR_RNE_BIT
        result[i] = SS_DR;
      }
    

    Mit dieser Schleife kann ich nun jeweils nur ein Bit zur Zeit einlesen.

    Meine Frage lautet: Ist es möglich, dass ich mehrere Bytes zugleich
    einlesen kann und somit etwas Zeitaufwand gut mache? Wenn ich z.B. 4
    Bytes zur selben Zeit einlese, spare ich bestimmt etwas Zeit. Hat jemand
    einen Tipp für mich?

    Vielen Dank

    Michael Stapek



  • Das hat zwar überhaupt nichts mit Standard-C zu tun, aber hier mal der erste Satz asu dem Datenblatt:
    "The AT25DF641 is a serial interface Flash memory device ..."

    Serial bedeutet nacheinander. Gleichzeitig wäre parallel. 😞



  • Laut Datenblatt kann das Ding zwei Bit gleichzeitig rausclocken, indem der SI-Pin zu einem zweiten SO-Pin umfunktioniert wird.

    Das heißt, du schiebst statt des Read-Array-Opcode den Dual-Output-Read-Array-Opcode über den SPI-Bus und kannst dann nach jedem Clock (falling edge an SCK) deine beiden Bits an SI und SO auslesen. Ansonsten kannst du da eigentlich nur an der Frequenz herumoptimieren, dass du die 55MHz möglichst genau triffst.



  • Danke für die Antworten.

    Wenn ich den Opcode für 2 Bytes sende, wird er aber denke ich mal die beiden Bytes in der selben Zeit senden, wie auch ein einzelnes. Es geht mir darum, dass ich die Zeit für das Lesen eines Bytes reduziere.

    Ich habe mir sagen lassen, dass dies durch gezieltes tauschen von Code möglich wäre, habe es aber noch nicht ausprobiert. Ansonsten muss ich Test weise mal die Optimierungsstufe von dem Compiler ändern.



  • Bits, nicht Bytes. Ein Pin kann halt nur oben oder unten sein.

    Aus dem Speicherbaustein kriegst du den Kram halt nur bitweise (bzw. zweibitweise) raus, daran wird kein Compiler der Welt etwas ändern können. Du könntest da Schieberegister vorlöten und den Kram erstmal zusammenclocken, wenn du lustig bist, aber Dual-Output-Read-Array gibt der Speicherbaustein halt nur bis 55 MHz her -- da ist die Obergrenze. Auch musst du entscheiden, ob dir das die Extra-Pins, die am ARM dafür draufgehen, wert wäre.

    Welche Frequenz kriegst du mit deinem jetztigen Code denn an SCK hin? Halt da mal nen Multimeter dran. Und wie schnell ist der ARM getaktet?



  • Laut dieser Seite

    http://www.matuschek.net/atmega-spi/

    kann durch Überarbeiten des Codes eine geringe Optimierung erreicht werden. Das ist zwar nicht der gleiche Baustein den ich benutze, aber ein Versuch wäre es wert.


Anmelden zum Antworten