mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Flash EN25Q80B über SPI ansteuern


Autor: Gerald M. (gerald_m599)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo, ich will in einen Flash, der über SPI angesprochen wird, nutzen.

Es handelt sich um einen "EN25Q80B"
Datenblatt: https://www.endrich.com/fm/2/EN25Q80B_Ver.D.pdf

leider weiß ich nicht, wie ich Adressen und Commands senden soll, da mir 
die Erfahrung noch fehlt.

Wie muß man hier Comands und Adressen über SPI zu einem Protokoll 
zusammenbauen? Also wie sieht das Protokoll aus, dass man bytewise 
sendet.

: Verschoben durch Moderator
Autor: Bastian W. (jackfrost)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi,

Schau dir mal Seite 22 von deinem DB an, da ist ein Bild mit dem 
Protokoll.
Für jeden Befehl gibt es hier ein Bild.

Gruß JackFrost

Autor: Gerald M. (gerald_m599)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Vielen Dank für die Rasche Antwort.
Das sieht für mich nach bitweisem schieben aus.
Ich verwende aber C mit CodeComposer, also kann ich die Daten byteweise 
übertragen. Also das Protokoll wird bytweise an den flash gesendet und 
auch so wieder aus dem SPI Fifo gelesen?

Autor: Bastian W. (jackfrost)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Es geht immer ganze Bytes raus. Das erste Byte ist die Anweisung, dann 
kommt ggf die Adresse , wie zB. Beim lesen und dann kommen Dummy Bytes 
zum lesen.

Bei. Schreiben kannst du oft nur bis zur Page Grenze schreiben.

Erst wenn du fertig bist darf CS wieder auf High gehen. Wenn CS low wird 
ist das erste Byte die Anweisung.

Gruß JackFrost

Autor: Gerald M. (gerald_m599)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
was meinst du mit dummy bytes zum lesen?

Autor: Arduino Fanboy D. (ufuf)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Du willst doch irgendwann Daten lesen!
Oder?
Dann musst du auch raus schreiben!

Egal was, darum nennt man es auch Dummy Daten.

Bitte lesen: Wikipedia SPI

Autor: Teddy (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Gerald M. schrieb:
> was meinst du mit dummy bytes zum lesen?

Weil du Daten sendest, du aber auch gleichzeitig Daten empfängst.

Autor: Gerald M. (gerald_m599)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Leider klappts nicht so ganz, zB will ich das Status register schreiben 
und lesen.
Dieses wird mit aber immer wieder mit einem Wert von 255 überschrieben, 
auch nach dem Write-Befehl..

vom lesen und schreiben meiner Daten am Flash ganz zu schweigen.

______________________________________________________________________ 
_
//  read statusregister
        GPIOPinWrite(GPIO_PORTP_BASE, GPIO_PIN_5, 0);   // CS LOW

        SysCtlDelay(1000);
        SSIDataPut(SSI3_BASE, 0x05);

        SSIDataPut(SSI3_BASE, dummy);
//        while(SSIBusy(SSI3_BASE)){};
        SSIDataGet(SSI3_BASE, &state1);

        SSIDataPut(SSI3_BASE, dummy);
//        while(SSIBusy(SSI3_BASE)){};
        SSIDataGet(SSI3_BASE, &state2);


        GPIOPinWrite(GPIO_PORTP_BASE, GPIO_PIN_5, 32);   // CS HIGH
        SysCtlDelay(10000);

// Write enable
        GPIOPinWrite(GPIO_PORTP_BASE, GPIO_PIN_5, 0);   // CS LOW

        SSIDataPut(SSI3_BASE, 6);
        while(SSIBusy(SSI3_BASE)){};

        GPIOPinWrite(GPIO_PORTP_BASE, GPIO_PIN_5, 32);   // CS HIGH
        SysCtlDelay(10000);

// write status register => no writing protection / locked sections
        GPIOPinWrite(GPIO_PORTP_BASE, GPIO_PIN_5, 0);   // CS LOW

            SSIDataPut(SSI3_BASE, 1);   //CMD

            state1 &= writeReg;

            SSIDataPut(SSI3_BASE, state1);

        GPIOPinWrite(GPIO_PORTP_BASE, GPIO_PIN_5, 32);   // CS LOW

___________________________________________________________________

Hat jemand mit Erfahrung einen Tipp ?

Autor: A. B. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Schwierig, wenn man nicht weiß, was SSIDataPut etc. eigentlich machen.
Nur in das SPI Datenregister schreiben bzw. daraus lesen?

Dann müsste es aber zu Auslesen des Statusregisters etwa so lauten

SSIDataPut(SSI3_BASE, 0x05); /* Kommando senden */
SSIDataGet(SSI3_BASE, &state1); /* dabei empfangenes Byte wegwerfen */
SSIDataPut(SSI3_BASE, dummy); /* irgendwas senden */
SSIDataGet(SSI3_BASE, &state1); /* dabei empfangenes Byte ist Statusreg. 
*/

Wobei im Put/Get immer auf Puffer leer bzw. voll gewartet wird.

Wenn man ein Byte sendet, wird automatisch auch immer eins empfangen. 
Auch wenn der Flash beim eintakten des Befehls noch gar nichts 
(sinnvolles) heraustaktet.

Autor: Philipp K. (philipp_k59)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Du willst doch irgendwann Daten lesen!
Oder?
Dann musst du auch raus schreiben!

Ich dachte immer das Dummy Byte wird lediglich dazu benutzt die Clock in 
Gang zu halten, sonst würde die Clock nach dem Senden aufhören und der 
Flashchip auf die Clock warten um Daten zurück zu senden.

man sendet ja nichts ausser einer 0 und das ist null am MOSI, aber die 
Clock läuft.

Autor: Arduino Fanboy D. (ufuf)
Datum:

Bewertung
1 lesenswert
nicht lesenswert
Kann man so sehen...
Ohne gleichzeitig was raus zu senden, kommt auch nichts rein.
Denn, ohne Sendeauftrag kein Takt.

Philipp K. schrieb:
> man sendet ja nichts ausser einer 0
Was man sendet ist egal.
Darum heißt es ja auch Dummy.
Darf auch eine Null sein.

Wenn du meinst, dass NullBytes KEINE Daten sind, dann bist du im Irrtum.

: Bearbeitet durch User
Autor: Bastian W. (jackfrost)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Poste mal SSIDataGet und Put. Ggf. Ist im Get das Dummybyte schon 
drinnen.

Was für Hardware hast du ?

Gruß JackFrost

Autor: Philipp K. (philipp_k59)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Arduino F. schrieb:
> Wenn du meinst, dass NullBytes KEINE Daten sind, dann bist du im Irrtum.

Hab ich nicht geschrieben, aber es gibt kein Signal am Mosi des Masters 
was es rein für das Verständnis einfacher macht...

Da ein DummyByte als 0/FF lediglich die Clock/SCK aktiv hält kann man es 
besser verstehen als einfach zu beraten "Du musst was senden, les mal 
Wikipedia.de".

>Was man sendet ist egal.
alles andere als 0 oder FF je nach Flankenmodus macht ja kein Sinn.

Oder hast Du ein Lieblingszeichen das Du dann sendest?

Autor: Arduino Fanboy D. (ufuf)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Philipp K. schrieb:
> alles andere als 0 oder FF je nach Flankenmodus macht ja kein Sinn.
Häää....
Sinn bei einem DummyByte?
Bitte sage mir den Sinn.
Und, was hat das DummyByte mit dem Flankenmodus zu tun?


Philipp K. schrieb:
> Oder hast Du ein Lieblingszeichen das Du dann sendest?
Neee...
Ich lasse einfach das in den Registern stehen, was schon drin ist.

Zitat aus einem SPI Artikel:
> Don't care about the Value



Philipp K. schrieb:
> Da ein DummyByte als 0/FF lediglich die Clock/SCK aktiv hält kann man es
> besser verstehen
Ich halte das für die falsche Sicht.
Für krude Logik.

Philipp K. schrieb:
> Hab ich nicht geschrieben, aber es gibt kein Signal am Mosi des Masters
> was es rein für das Verständnis einfacher macht...

Wie gesagt:
Auch NullBytes sind Daten!
Auch ein Low Pegel ist ein Signal.
Ich halte das für die falsch Sicht.
Krude Logik.


Aber das soll mir auch eigentlich egal sein, wie du die Sache 
betrachtest.
Damit musst du leben.

Ich halte die Sicht für falsch.
Und ich habe das Recht das zu kommentieren, bevor sich die krude Logik 
noch irgendwie in den Köpfen von Anfängern festsetzt.

: Bearbeitet durch User
Autor: Philipp K. (philipp_k59)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> Ich halte die Sicht für falsch.
> Und ich habe das Recht das zu kommentieren, bevor sich die krude Logik
> noch irgendwie in den Köpfen von Anfängern festsetzt.

Im Ganzen, Krude Logik und bliblablub.. Krude Logik gibt es nicht, 
entweder ist sie WAHR oder FALSCH.

Es ist aber Fakt das ein Nullbyte Signaltechnisch lediglich nur eine 
Clock ausmacht, da sich am Out nix ändert. Kann jeder Anfänger am DSO 
überüfen.

Der Master muss dem Slave zum Antworten das ClockSignal bereitstellen, 
gewöhnlicherweise wird dies mit einem Dummybyte gemacht da die Clock für 
X Bytes erhalten bleibt..

Du hast ja soooo Recht, Glückwunsch.

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.