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
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
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?
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
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
Gerald M. schrieb: > was meinst du mit dummy bytes zum lesen? Weil du Daten sendest, du aber auch gleichzeitig Daten empfängst.
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 ?
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.
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.
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.
Poste mal SSIDataGet und Put. Ggf. Ist im Get das Dummybyte schon drinnen. Was für Hardware hast du ? Gruß JackFrost
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?
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.
> 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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.