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


von Gerald M. (gerald_m599)


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 User
von Bastian W. (jackfrost)


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

von Gerald M. (gerald_m599)


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?

von Bastian W. (jackfrost)


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

von Gerald M. (gerald_m599)


Lesenswert?

was meinst du mit dummy bytes zum lesen?

von Einer K. (Gast)


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

von Teddy (Gast)


Lesenswert?

Gerald M. schrieb:
> was meinst du mit dummy bytes zum lesen?

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

von Gerald M. (gerald_m599)


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 ?

von A. B. (Gast)


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.

von Philipp K. (philipp_k59)


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.

von Einer K. (Gast)


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.

von Bastian W. (jackfrost)


Lesenswert?

Poste mal SSIDataGet und Put. Ggf. Ist im Get das Dummybyte schon 
drinnen.

Was für Hardware hast du ?

Gruß JackFrost

von Philipp K. (philipp_k59)


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?

von Einer K. (Gast)


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.

von Philipp K. (philipp_k59)


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.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.