Hallo,
ich habe folgendes Problem mit der SPI Kommunikation auf dem STM32F2.
Um von einem Flashspeicher die ID auszulesen führe ich folgende
Funktionen aus.
Beim ersten mal erscheint nicht die gewünscht ID. Beim zweiten mal wird
die korrekte ID in die Variable ReadID abgelegt.
Was müsste getan werden, damit beim ersten mal die ID in der Variable
abgelegt wird ?
In der Initialisierungsroutine habe ich auch schon folgendes getestet.
Was für einen Flashspeicher benutzt du denn genau?
Braucht der vielleicht eine gewisse Zeit oder bestimmte Anzahl an Takten
auf dem CLK-Signal zum Initialisieren?
Guten Morgen Tobias S.,
vielen Dank für deine Beiträge.
Mit welcher Datei von Quartus || wird der EPCS Flash Controller
beschrieben ? Ist es womöglich die Datei mit der Endung jic ?
Ab welcher Adresse soll der EPCS Flash Controller beschrieben werden ?
Hallo EmbeddedUser,
hmm... wenn du das EPCS wirklich seriell mit einen µC beschreiben
möchtest. bleibt eigentlich "nur" das "Raw binare File". Dieses File
muss 1:1 ab der Adresse 0x000000 in das EPCS geladen werden.
Das "jic"-File wäre JTag.
Viele Grüße Tobias
Hallo Tobias S.,
ich kann in dem Projekt kein Bin-File sehen. Muss ich dieses File mit
einem zusätzlichen Tool erzeugen ?
Ich habe bezüglich dem EPCS Flash Controller noch eine weiteres Problem.
Wie beschreibst du die Sectoren ? Das seitenweise (256 Bytes)
beschreiben des EPCS Flash Controller funktioniert soweit.
Bevor ich diese Funktion ausführe wird ein Write_Enable ausgeführt. Nach
Write_Page wird ein Write_Disable durchgeführt. Sobald ich einen Sektor
beschreiben möchte (256 Pages) wird das Debugging automatisch
unterbrochen. Ich kann den Fehler nicht finden.
Ja meinst du nun das *.rpd oder das *.rbf File. Das *.rpd File kann so
wie es aussieht nur mit dem Tool SRunner benutzt werden. Also ich meine
es müsste das *.rbf (Raw binary file) File sein
Du darfst max.256 Bytes pro Schreibzyklus schreiben. Danach muss die
Adresse erhöht werden. Und dann darf ein neuer Schreibzyklus beginnen.
Siehe Seite 25 im EPCS datasheet
Wie müsste der genauere Ablauf aussehen, wenn ein Sektor beschrieben
werden soll ? Irgendwas stimmt ja bei mir nicht ganz. Der Debugger bzw.
Mikrocontroller hängt sich bei mir auf.
Wenn sich der µC aufhängt klingt es eher, dass er in eine while scheife
springt und nicht mehr raus kommt... Wartest du vielleicht auf einen
bestimmten zustand von dem EPCS?
Folgendes habe ich festellen können. Wenn ich in der "Write_Page"
Funktion die komplette for Schleife entferne, dann hängt sich der
Mikrocontroller nicht auf.
Im Anhang befindet sich einen Auszug von der IAR JLink Debugger
Fehlermeldung.
hmm die länge darf max. 255 sein. Das "0" Byte nicht vergessen mit zu
zählen...
Warum fängst du erst an der Adresse 0x500 an auszulesen?
Wie groß ist deine "EpcsData"?
Viele grüße Tobias
Es muss an dieser for Schleife liegen. Wie kann mit dem STM32 256 Bytes
per SPI versendet werden, ohne dass der Mikrocontroller sich aufhängt ?
Es muss doch möglich sein. Ich habe soeben auch die Interrupt Variante
ausprobiert. Da passiert es auch.
@EmbeddedUser
In deiner WritePage Funktion fehlt die Abfrage, ob das Flash ready ist.
Dazu das Status-Register auslesen und das entsprechende Bit auswerten.
Am einfachsten ist es, diese Abfrage vor jedem Löschen, Schreiben und
Lesen zu machen, kostet nur so eine µs. Und die ganzen delays raus aus
dem Programm.
MfG Klaus
Wo müsste genau müsste in der for Schleife die Abfrage erfolgen und
welches Bit ? Damit auf den Speciher geschrieben werden kann, müsste
laut Datenblatt das Bit 0 vom Status Register 0 sein.
EmbeddedUser schrieb:> Damit auf den Speciher geschrieben werden kann, müsste> laut Datenblatt das Bit 0 vom Status Register 0 sein.
Ich benutze eine andere CPU, die Bedeutung deiner SPI Register kenne ich
nicht.
Ich mache die Abläufe so:
Vor jedem Löschen, Schreiben oder Lesen warte ich, bis Bit 0 vom Status
Register des Flashs 0 ist.
Das kann man so machen: READ STATUS Kommando senden und ein Byte
zurücklesen. Dann CS wieder auf 1. Bit 0 von dem Byte auswerten und
nochmal von vorne, wenn nicht 0;
Oder CS auf low, READ STATUS senden und solage Bytes lesen, bis Bit 0
nicht mehr gesetzt ist. Dann CS wieder auf high.
Feiglinge setzen noch einen Loopcounter als Timeout darüber ;-) kann
aber beim Löschen ganz schön lange dauern (500ms pro Sektor wenn ich
mich recht erinnere)
Danach kann man alles machen, z.B. READ und Startadresse ausgeben (4
Byte) und lesen bis der Flash zuende ist. Delays sind nirgenwo
erforderlich, die Bits bekommt man auch mit 25 MHz ohne Pause.
So macht das das FPGA, 0x03 0x00 0x00 0x00 ausgeben und Bytes eintakten
bis fertig.
MfG Klaus