Kann nicht mehr als ein Byte in den SST39SF010A Flash schreiben!

Ich verwende Code Composer, um den TMS320C31 DSP (über MPSD) so zu programmieren, dass er in den SST39SF010A- Flash schreibt . Ich kann erfolgreich ein Byte an eine beliebige Stelle des Flashs schreiben, indem ich den im Datenblatt erwähnten Sequenzen "Chip Erase" und dann "Byte-Program Algorithm" folge.

Das Problem ist, wenn ich mehr als ein Byte an verschiedenen Stellen schreiben möchte, wird nur das erste Byte geschrieben und der Rest nicht. Ich habe Verzögerungen zwischen den Schreibvorgängen hinzugefügt, aber keinen Unterschied.

Was ist die Ursache für dieses Problem? Ich habe nach Treibern (Programmieralgorithmen) für diesen Blitz gesucht, aber nichts gefunden!

Aktualisierung: 21.7.2013

  • Erste:

Dies ist der Code, den wir geschrieben haben, um den Flash zu programmieren:

void main()  {

volatile unsigned int * start_flash = (volatile unsigned int *)0x00001000;   
      volatile unsigned int * end_flash = (volatile unsigned int *)0x0001ffff;

      volatile unsigned char * flash_addr1 = (volatile unsigned char *)0x005555;    
      volatile unsigned char * flash_addr2 = (volatile unsigned char *)0x002aaa;
      volatile unsigned char * flash_addr3 = (volatile unsigned char *)0x005555; 
      volatile unsigned char * flash_addr4 = (volatile unsigned char *)0x010000;

      volatile unsigned int x = 0;     

          // Chip Erase

        * flash_addr1 = 0xaa;    
        * flash_addr2 = 0x55;      
        * flash_addr1 = 0x80;    
        * flash_addr1 = 0xaa;
        * flash_addr2 = 0x55;
        * flash_addr1 = 0x10; 

        // Delay
        for(x=0;x<=100000;x++);          

        // Byte Program

        * flash_addr1 = 0xaa;    
        * flash_addr2 = 0x55;
        * flash_addr3 = 0xa0;  

        // Data in the first address

        * (start_flash) = 0xba;

        for(x=0;x<=100000;x++); 

       // Data in the following address

        * (start_flash+1) = 0xab;

        while(1);
  }

"BA" wird korrekt in die erste Adresse geschrieben, "AB" jedoch nicht.

  • Zweite:

Wir verwenden ein FPGA im System zwischen dem DSP und dem Flash (und allen anderen Systemperipheriegeräten). Daten und Adresse des DSP werden durch das FPGA zum Flash umgeleitet, und Steuersignale werden vom FPGA generiert. Ich denke, es gibt kein Problem beim Generieren der Steuersignale, da wir in der Lage sind, ein Byte erfolgreich zu schreiben, ist das richtig?

Irgendeine Hilfe? Bitte teilen Sie mir den passenden Abschnitt für diese Frage mit, wenn ich in einem falschen gepostet habe.
Sind Sie sicher, dass Ihre Hardware in Ordnung ist? Diese zufälligen Probleme treten auf, wenn eine der Adress- oder Daten- oder Steuerleitungen mit GND oder VCC kurzgeschlossen oder getroffen wird. Timing-Schwankungen können nicht die Ursache sein ...
@ user19579 , Ja, ich habe die Daten- und Adressleitungen überprüft und es gibt keine schwimmenden oder festsitzenden Pins. Dieses Problem ist bis jetzt nicht zufällig. Es ist konsistent, nur ein Byte wird in jede Adresse geschrieben. Mehr kann man nicht schreiben!
Können Sie den Schaltplan des Speicherschnittstellenabschnitts allein anhängen? Wie OE# des Speichers verbunden ist. Geben Sie auch Details zum Softwaretreiber an.
@ user19579 , danke fürs Folgen. Bitte überprüfen Sie die Aktualisierungen oben.
Ihre Verbindungen sind nicht einfach, weil Sie FPGA für Steuersignale verwendet haben. Versuchen Sie, die Steuersignale zu überprüfen oder zu untersuchen. Eine weitere Sache, Adresse und Daten sind direkt vom DSP mit dem Flash verbunden und die Steuersignale stammen vom FPGA. Ich bin mir nicht sicher, wie Sie beide sinchen (wie FPGA Steuersignale erzeugt). Ich kann sagen, prüfen Sie sie einfach und bestätigen Sie. Eine weitere Sache, lesen Sie zuerst die Geräte-ID des Flashs und bestätigen Sie das Gerät. Ich bin nicht sehr in Richtung Codierung, für mich sieht die Codierung in Ordnung aus. Überprüfen Sie einfach, wie die Speicherzuordnung im Inneren erfolgt
@ user19579 , Daten und Adresse sind auch Eingaben für das FPGA. Ich werde die Steuersignale untersuchen und mit den Zeitdiagrammen im Datenblatt vergleichen. Ich werde auch die Geräte-ID bestätigen. Danke schön.
@ user19579 , Problem gelöst. Die 3 Befehle unter dem Kommentar "Byte Program" im obigen Code dienen eigentlich dem Softwaredatenschutz (SDP). Diese Befehle sollten vor jeder Byte-Schreiboperation gesendet werden, nicht nur vor dem Schreiben des ersten Bytes. Danke schön.

Antworten (1)

Problem gelöst und ich möchte die Lösung teilen:

Software-Datenschutz

Diese Funktion ist bei einigen Flashs verfügbar, die zu Beginn jedes Schreibzyklus eine Softwaresequenz erfordern, damit ein Schreibvorgang durchgeführt werden kann. Um die Software-Datenschutzfunktion zu aktivieren, muss eine Reihe von drei Schreibbefehlen an bestimmte Adressen mit bestimmten Daten ausgeführt werden. Einmal eingestellt, muss jede Schreibanforderung mit dem gleichen 3-Byte-Code beginnen. Diese Funktion ist in dem von mir verwendeten Flash dauerhaft aktiviert.

Die Lösung besteht also darin, die folgenden Befehle vor jedem Byte-Schreibvorgang hinzuzufügen, nicht nur den ersten:

    * flash_addr1 = 0xaa;    
    * flash_addr2 = 0x55;
    * flash_addr3 = 0xa0;