Moin Moin,
ich werde noch Wahnsinnig. Versuche einfach schon zu lange ein Byte in
das Flash zu schreiben.. Leider erfolglos. Was übersehe ich? Was mache
ich falsch?!
SPI läuft! Kann Informationen die im Datenblatt (wie die Informationen
vom Chip auslesen..) Also das kann nicht das Problem sein.
Hier ist mein Hauptprogramm, wo ich versuche ein Byte zu schreiben und
das wieder zurück zu lesen.
Linke mal das DB vom SPI Flash , hat das ein WREN Bit das du vor dem
Schreiben setzen musst ? Der SS vom SPID ist auch ein Ausgang ?
Kannst du eine ganze Page lesen ?
Gruß JackFrost
Moin,
das WREN setze ich und kann ich erfolgreich zurück lesen. Damit
funktioniert der SPI.
Hier der Link zum DB
ww1.microchip.com/downloads/en/DeviceDoc/20005262A.pdf
Was heißt denn "Leider erfolglos"???
Wie schon angedeutet wurde: SST25VF016B hat wie üblich ein WEL Bit, dass
gesetzt werden muss. Oben habe ich aber nur eine Abfrage auf "gesetzt"
gesehen, aber nicht, dass es irgendwo auch tatsächlich gesetzt wird.
Außerdem wäre es hilfreich, das Status-Register an dieversen Stellen
auszulesen und auszugeben. Irgendwelche Block Protection???
Aus dem DB:
5.17 Sector-Erase
The Sector-Erase instruction clears all bits in the
selected 4 KByte sector to ‘1,’ but it does not change a
protected memory area. Prior to any write operation,
the Write-Enable (WREN) instruction must be executed.
Außerdem kannst Du nur ein leere (d.h. vorher gelöschte) page
beschreiben.
Fabian D. schrieb:> Ich habe keine Block Protection gesetzt.
Die Frage war aber, ob event. eine Block Protection gesetzt IST, nicht
wann oder von wem sie ggf. gesetzt wurde.
> Das WEL habe ich geprüft und es ist auf 1 gesetzt.
Das Setzen ist aber nirgends zu sehen.
Das Ding hat noch ein Configuration Reg., da würde sich ein Block
lohnen.
Und wie sieht's mit der Beschaltung von WP und HOLD aus?
Und die wichtigste Frage überhaupt ist immer noch offen: Was heißt
"Leider erfolglos"?
Z. B.: Geht nach Deaktivieren vom CS am Ende des Page Write das Busy Bit
auf 1 und bleibt auch 'ne Weile so? Und das WEL automatisch wieder auf
0.
Was stand vorher in der betreffenden Page, was steht hinterher drin ...
Ein einfaches "geht nicht" ist ein ziemlich leere Aussage ...
A. B. schrieb:> Die Frage war aber, ob event. eine Block Protection gesetzt IST, nicht> wann oder von wem sie ggf. gesetzt wurde.
Ich deaktiviere diese Funktion mit
A. B. schrieb:> Das Setzen ist aber nirgends zu sehen.
Wo kann ich dieses Bit bitte setzen?
A. B. schrieb:> Das Ding hat noch ein Configuration Reg., da würde sich ein Block> lohnen.> Und wie sieht's mit der Beschaltung von WP und HOLD aus?
Das ist ein Dev. Board. Die Pins sind so verschaltet, dass man zugriff
drauf hat. Das Board ist ein XPlainedA3BU.
A. B. schrieb:> Und die wichtigste Frage überhaupt ist immer noch offen: Was heißt> "Leider erfolglos"?> Z. B.: Geht nach Deaktivieren vom CS am Ende des Page Write das Busy Bit> auf 1 und bleibt auch 'ne Weile so? Und das WEL automatisch wieder auf> 0.> Was stand vorher in der betreffenden Page, was steht hinterher drin ...>> Ein einfaches "geht nicht" ist ein ziemlich leere Aussage ...
Das kann ich noch mal prüfen, ob das sich das Busy Bit überhaupt nach
schreiben der Page ändert. Würde das der Fall sein, würdes es bedeuten
das er was gespeichert hat bzw. was verarbeitet.
Fabian D. schrieb:> A. B. schrieb:>> Die Frage war aber, ob event. eine Block Protection gesetzt IST, nicht>> wann oder von wem sie ggf. gesetzt wurde.>> Ich deaktiviere diese Funktion mit>
"The Global Block-Protection Unlock (ULBPR) instruc-
tion clears all write-protection bits in the Block-Protec-
tion register, except for those bits that have been
locked down with the nVWLDR command."
Die Block Protection könnte (versehentlich) permanent gesetzt sein.
Deshalb Kontrolle im Status und Configuration Reg. nötig.
> A. B. schrieb:>> Das Setzen ist aber nirgends zu sehen.>> Wo kann ich dieses Bit bitte setzen?
"The Write Enable (WREN) instruction sets the Write-
Enable-Latch bit in the Status register to ‘1, ..."
Ist ja vielleicht im sst26_write_start drin, aber ...
>> Und wie sieht's mit der Beschaltung von WP und HOLD aus?> Das ist ein Dev. Board. Die Pins sind so verschaltet, dass man zugriff> drauf hat. Das Board ist ein XPlainedA3BU.
Die Frage ist, welche Pegel tatsächlich anliegen. Insbesondere dürfen
die nicht "floaten", sondern müssen auf definiertem Pegel liegen (und
halt dem richtigem).
> Das kann ich noch mal prüfen, ob das sich das Busy Bit überhaupt nach> schreiben der Page ändert. Würde das der Fall sein, würdes es bedeuten> das er was gespeichert hat bzw. was verarbeitet.
Richtig, und auch das WEL Bit muss danach automatisch wieder auf '0'
gehen.
A. B. schrieb:> "The Global Block-Protection Unlock (ULBPR) instruc-> tion clears all write-protection bits in the Block-Protec-> tion register, except for those bits that have been> locked down with the nVWLDR command.">> Die Block Protection könnte (versehentlich) permanent gesetzt sein.> Deshalb Kontrolle im Status und Configuration Reg. nötig.
Das werde ich direkt mal checken.
A. B. schrieb:> "The Write Enable (WREN) instruction sets the Write-> Enable-Latch bit in the Status register to ‘1, ...">> Ist ja vielleicht im sst26_write_start drin, aber ...
Aber? Das ist da mit drin, damit setze ich das Bit und eine Funktion für
das löschen gibt es auch.
A. B. schrieb:> Die Frage ist, welche Pegel tatsächlich anliegen. Insbesondere dürfen> die nicht "floaten", sondern müssen auf definiertem Pegel liegen (und> halt dem richtigem).
Habe ich kontrolliert, liegen beide auf High.
Setzt du WREN bevor du die Block Protection deaktivierst , wenn dann ist
WREN wieder deaktiviert. WREN muss immer dann gesetzt werden, wenn du
schreiben willst. Unter 4.5.1 steht wann WREN immer deaktiviert wird.
Gruß JackFrost
Was sendest du und was ließt du wieder aus ? Hast du vorher WREN erneut
gesetzt ? Was ließt du aus wenn du die ersten 256 Bytes ausliest ?
Gruß JackFrost
Bastian W. schrieb:> Was sendest du und was ließt du wieder aus ? Hast du vorher WREN> erneut> gesetzt ? Was ließt du aus wenn du die ersten 256 Bytes ausliest ?>> Gruß JackFrost
Schreiben kannst maximal eine ganze Page und lesen den ganzen Flash am
Stück.
Ich meinte was willst du speichern , z.B. 0x55 und was bekommst du beim
Auslesen raus z.B 0xFF. Die ersten 256 Bytes sind Interessant um zu
sehen ob die alle noch auf 0xFF stehen. Nur wenn die auf 0xFF stehen
kannst du sie beschreiben.
Gruß JackFrost
Bastian W. schrieb:> Was sendest du und was ließt du wieder aus ? Hast du vorher WREN> erneut> gesetzt ? Was ließt du aus wenn du die ersten 256 Bytes ausliest ?>> Gruß JackFrost
Ich bekomme von jeder Adresse die ich lesen will eine 0x02
Bekommst du das auch wenn du einen Chiperrase machst ?
Normal kannst du ab 0x000000 schreiben und lesen. Wenn die Zellen aber
0x02 enthalten kannst du maximal noch das Bit 1 in den Zellen
beschreiben. So lange du kein 0xFF bekommst kannst du die Zellen nicht
beschreiben.
Ließ mal 256 Zellen ab 0x00FFFF aus. War der Flash neu ?
Nach dem Abfragen der Stati geht CS kurz auf High , oder ?
Gruß JackFrost
Bastian W. schrieb:> Bekommst du das auch wenn du einen Chiperrase machst ?> Normal kannst du ab 0x000000 schreiben und lesen. Wenn die Zellen aber> 0x02 enthalten kannst du maximal noch das Bit 1 in den Zellen> beschreiben. So lange du kein 0xFF bekommst kannst du die Zellen nicht> beschreiben.>> Ließ mal 256 Zellen ab 0x00FFFF aus. War der Flash neu ?> Nach dem Abfragen der Stati geht CS kurz auf High , oder ?> Gruß JackFrostBastian W. schrieb:> Bekommst du das auch wenn du einen Chiperrase machst ?> Normal kannst du ab 0x000000 schreiben und lesen. Wenn die Zellen aber> 0x02 enthalten kannst du maximal noch das Bit 1 in den Zellen> beschreiben. So lange du kein 0xFF bekommst kannst du die Zellen nicht> beschreiben.>> Ließ mal 256 Zellen ab 0x00FFFF aus. War der Flash neu ?> Nach dem Abfragen der Stati geht CS kurz auf High , oder ?> Gruß JackFrost
Der Flash ist neu. Meinst du CS oder das Busy Flag?
Ich mein CS. Aber in deinem Code hab ich gesehen du setzt das immer kurz
auf High.
Ließt du immer noch 0x02 aus wenn du einen Chiperase machst ?
Gruß JackFrost
Bastian W. schrieb:> Ich mein CS. Aber in deinem Code hab ich gesehen du setzt das> immer kurz auf High.> Ließt du immer noch 0x02 aus wenn du einen Chiperase machst ?> Gruß JackFrost
Ich habe die SPI Signale alle mit dem Oszilloskop angeschaut, die
funktionieren soweit.
Ich hab Skype, bin aber atm nicht im Land.
Hast du de Flash mal komplett mit 0xC7 gelöscht. Nimm mal im
Program den Teil raus der WREN setzt, wenn du dann 0x00 ausließt ist es
mit großer Sicherheit immer das Status Byte. Du kannst zur Sicherheit
auch mal das Block Protected Register mit 0x72 Auslesen. Laut DB ist das
ja nach dem Power on Reset auf 0x5555FFFFFFFF und damit ist alles a
Rhein geschützt.
Gruß JackFrost
Bastian W. schrieb:> Ich hab Skype, bin aber atm nicht im Land.> Hast du de Flash mal komplett mit 0xC7 gelöscht
Es wäre mal richtig toll, wenn der Chip was antworten würde, dass er das
Commando verstanden hat. Werde es gleich mal testen.
Du hast in spi read und Sent immer ein Kommando drinnen , u d bedienst
den CS , oder bei 0x72 darf ja CS nicht auf High gehen, da sonst das
erste Byte wieder als KOMMANDO interpretiert.
Am besten schreibst du dir eine Funktion die die Daten direkt abholt ,
also CS low -> 0x72 senden , 7 Bytes holen und dann CS High.
Das gleiche für den Chip erase. Blos mit 0xC7 und dann statt Daten holen
ein CS auf High und dann Delay von 50 ms. Danach liest du die ersten 256
Bytes aus die müssen dann 0xFF sein. Kannst du das oszillographieren und
die Bilder hier einstellen ?
Gruß JackFrost
Bastian W. schrieb:> Am besten schreibst du dir eine Funktion die die Daten direkt abholt ,> also CS low -> 0x72 senden , 7 Bytes holen und dann CS High.
Sind es nicht 6 Bytes?
bekomme jedoch nicht zurück was da in der Tabelle steht.
Zurück kommen müsste doch..
Byte1 = 0x06
Byte2 = 0x01
Byte3 = 0x02
Byte4 = 0xFF
oder? Boah ich bin mega verwirrt.
Ist dein Board ein Xplain von Atmel oder ein eigenes ? An welchen Pin
ist der CS vom Flash dran am PD4 wenn nein ist PD4 trotzdem zusätzlich
als Ausgang gesetzt ?
Die Werte die kommen sind komisch vorallem wiederholen sich die Daten.
Auch das vom Protection Block
Gruß JackFrost
Bastian W. schrieb:> Ist dein Board ein Xplain von Atmel oder ein eigenes ? An welchen Pin> ist der CS vom Flash dran am PD4 wenn nein ist PD4 trotzdem zusätzlich> als Ausgang gesetzt ?>> Die Werte die kommen sind komisch vorallem wiederholen sich die Daten.> Auch das vom Protection Block>> Gruß JackFrost
Ja ist ein XPlained A3BU..
Mein CS ist an PF4 angeschlossen.
Ich hatte ein ähnliches Problem bei dem CS nicht geändert wurde wenn das
Port.outclr und Port.outset in der Funkzion waren. Ich hatte das damals
direkt in der Main gemacht dann ging es. Ich hab keine Ahnung warum der
gcc da was anderes gemacht hat.
Aktuell nutze ich SPI FRAM und CAN Controller , für die muss ich ein
Delay von 80 ns setzten damit die Timings passen. Da hatte ich dann
keine Probleme mehr.
Versuche das mal das du nach einer Funktion ein Delay von 100 ns setzt
und ob es dann besser wird.
Gruß JackFrost
Die sich fortlaufend wiederholenden Bytes bei Read 0x03 und RBPR 0x72
sind 0xbf, 0x26, 0x41, und das ist genau die ID ...
Das kann nur heißen, dass die SPI-Kommunikation überhaupt nicht richtig
funktioniert. Also hat das Problem erst einmal rein gar nichts mit dem
Flash zu tun (oder das Ding ist einfach kaputt, aber das es gerade
kaputt ist, dass es ausgerechnet immer seine ID schickt, ist doch recht
unwahrscheinlich).
Da läuft in Spi_USARTD0_* und/oder sst26_spi_* wohl etwas grundsätzlich
falsch!
Bastian W. schrieb:> Ich hatte ein ähnliches Problem bei dem CS nicht geändert wurde wenn das> Port.outclr und Port.outset in der Funkzion waren. Ich hatte das damals> direkt in der Main gemacht dann ging es. Ich hab keine Ahnung warum der> gcc da was anderes gemacht hat.
Das ist keine gute Idee. Man sollte dem Problem auf den Grund gehen, und
nicht nur so lange herumwurschteln, bis es irgendwie geht. Sonst tappt
man früher oder später wieder in etwas vergleichbares hinein.
Problem verstanden => Problem für die Zukunft erledigt.
(Aber das ist natürlich meine private Meinung)
Fabian D. schrieb:> Das heißt im Endeffekt, möchte ich etwas neues an einem Bereich> schreiben, wo schon etwas drin steht, muss ich erst mal den Bereich> löschen?
Ist heute denn schon wieder der 01. April???
Fabian D. schrieb:> Das heißt im Endeffekt, möchte ich etwas neues an einem Bereich> schreiben, wo schon etwas drin steht, muss ich erst mal den Bereich> löschen?
Im Gegensatz zum EEPROM kannst du den Flash nur beschreiben wenn in der
Zelle 0xFF steht. Löschen kannst du nur ganze Sektoren , Blöcke oder den
ganzen Chip.
Wenn du also nur ein Byte von einem Sektor ändern willst musst du das
woanders zwischen Speichern.
Gruß JackFrost
A. B. schrieb:> Fabian D. schrieb:>> Das heißt im Endeffekt, möchte ich etwas neues an einem Bereich>> schreiben, wo schon etwas drin steht, muss ich erst mal den Bereich>> löschen?>> Ist heute denn schon wieder der 01. April???
Warst du in der Schule auch so ein Klugsch*****?
Fabian D. schrieb:> Warst du in der Schule auch so ein Klugsch*****?
Zumindest habe ich in der Schule Lesen gelernt. ;-)
Aus dem Datenblatt:
"5.20
Page-Program
... The data for the selected page address must be in the erased state
(FFH) before initiating the Page-Program operation. ..."
Der Chip kennt ganze zwei(!) Instruktionen, die zum Programmieren
dienen, und davon verwendet wurde ohnehin nur das "Page-Program". Dessen
Beschreibung besteht aus drei kleinen Absätzen. Aber die zu lesen, ist
offenbar schon zuviel der Mühe?
Irgendwie setze ich auch stillschweigend voraus, das man zumindest eine
ungefähre Ahnung haben sollte, was man so macht. Wenn man einen
Flash-Chip programmieren will, wäre es deswegen vielleicht hilfreich, zu
wissen (oder sich zu informieren?!), was so ein Flash-EEPROM eigentlich
ist ...
Statt großspurig zu verkünden "SPI läuft" (haha!), aber andererseits
nicht mal beschreiben zu können, was denn nun eigentlich konkret nicht
funktioniert. Erst nach der dritten Nachfrage kommt dann überhaupt mal
substanzielle Information rüber ...