Hallo Leute, ich brauche mal Eure Hilfe. Ich habe den EEprom mit Galep zum Testen mit Text beschrieben. Jetzt will ich ihn auslesen, aber er will nicht. Nach dem Datenblatt sollte der Code i.O.sein. MCU mit 11.059 MHz, macht 1ms pro Befehl. Timing ist also o.k. Wo sehe ich was nicht ?? 1. Sende Befehl Read 2. Sende Adresse High mit 00 3. Sende Adresse Low mit 00 4. lese SPI Statusflags sollten beim lesen egal sein. Die werden erst beim schreiben interessant. der Code : ;*************************** ; 8 Byte aus EEProm lesen mov r1,#60h seleep eeread mov r3,#00 ; Startadresse High EEProm acall putspi mov r3,#00 acall putspi mov b,#8 get8: acall getspi mov @r1,a inc r1 djnz b,get8 setb CSEEP ret ;************************************ seleep macro clr SCLK clr CSEEP EndM eeread macro ; Lese EEProm mov r3,#03h acall putspi EndM ;*********************** ; SPI Write 8 Bit, Wert in R3 putspi: mov r4,#8 mov a,R3 clr c spiwr: clr SCLK rlc a mov MOSI,c setb SCLK djnz r4,spiwr ret ;*************************** ; SPI Read 8 Bit, Wert in X getspi: mov r4,#8 spird: clr SCLK clr c setb MISO mov c,MISO rlc a setb SCLK djnz r4,spird mov r3,a ret
Stephan Henning wrote:
> MCU mit 11.059 MHz, macht 1ms pro Befehl. Timing ist also o.k.
Bei 12MHz hast du genau 1µs (nicht 1ms) pro Befehlstakt!
Bei 11,0592MHz hast du 1,0850694...µs pro Befehlstakt. Und je nach
Befehl werden zwischen 1-3 Takte benötigt, also nicht jeder Befehl
benötigt genau einen Takt!
Also ohne Verzögerungen arbeitet dein SPI viel zu schnell um ein EEProm
auslesen zu können.
Timing ist also nicht ok ;)
Ciao,
Rainer
@Fox, natürlich habe ich 1 us pro Befehl, man sollte mal Pausen machen. Allerdings ist das Timing eben nicht viel zu schnell. Det AT25080 hat eine max. Clock Rate von 20 MHz !! Jetzt kommt aber der Haken. Es gibt im Datenblatt eine Input Rise und Fall Time von max. 2us. Diese ist im Timingdiagramm aber eben nicht eingetragen. Atmel war da sehr zurückhaltend. Ich nehme an es ist die Zeit die der EEProm braucht um von Low nach High und umgekehrt am Eingang zu kommen. Also habe ich nach dem Anlagen der Bits an MOSI zwei Befehle (NOP) Bringt aber auch nichts.
Auch wenn das EEProm eine theoretische Clock Rate von 20MHz hat bringt dir das trotzdem nichts. Denn EEProms sind prinzipbedingt relativ langsam und verarbeiten intern die Zellen meistens nur in ms Bereichen. Gerade das Schreiben kann etliche ms dauern. Deshalb kannst du nicht mit 20MHz das EEProm auslesen oder beschreiben.
beim Schreiben ist es klar. tWC max. 5ms ( Write Cycle Time ) Gilt die denn auch zum übermitteln der Adresse die gelesen werden soll ?? Ich denke das ist nur beim Schreiben des EEProm interessant. Wie gesagt, das Datenblatt ist mit Timingdiagrammen sehr zurückhaltend. Auch das Datsheet von ST ist nicht viel besser. ( es sieht fast so aus wie das von Atmel )..... wer da böses denkt...
Fox Mulder wrote: > Auch wenn das EEProm eine theoretische Clock Rate von 20MHz hat bringt > dir das trotzdem nichts. Denn EEProms sind prinzipbedingt relativ > langsam und verarbeiten intern die Zellen meistens nur in ms Bereichen. Das ist Quatsch, Lesen kann man mit 20MHz, nur der interne Schreibzyklus dauert einige ms. Ich gehe mal davon aus, daß die SPI-EEPROMs auch eine Statusabfrage erlauben, ob der Schreibzyklus beendet ist. Wie das genau geht, weiß ich nicht, da ich nur die viel gebräuchlicheren I2C-EEPROMs benutze (AT24C512). Zu dem Code kann ich daher garnichts sagen. Peter
@Peter, so ist es. Diese Bit gibt es. Allerdings werde ich das wohl ehr mit dem Timer regeln. Ich werde eh nur 9 Bytes speichern. (Stromausfall) Und die kleineren Typen haben das gleiche gekostet. Ist eigentlich normales SPI mit MSB first.
Ok, da hab ich wohl den langsamen Schreibzyklus auch auf das Lesen fälschlicherweise übertragen. ;) Laut Datenblatt kann der AT25080 innerhalb von maximal 5ms die Daten schreiben. Man kann nach dem Schreiben den Busy Status im "Read Status Register" auslesen. Zum lesen steht nichts explizit drin, weshalb vermutlich nur die minimalen Timings eingehalten werden müssen.
SO, das Problem ist gelöst. Vorab: ich schreibe ja nicht weil ich zu faul oder zu bequem bin mir Gedanken zu machen. Ich hatte die Software und das Timing mehrfach geprüft und keine Idee mehr. Der LA den ich am 8051 hatte zeigte nur Müll an. Nachedem ich ihn an den EEProm gesteckt hatte, funktionierte alles. Welch WUNDER.. Zur lösung. Ich hatte das EEProm auf dem Steckbrett mit ca. 30cm Flachband zum 8051 Borad verbunden. Ader 1 SCLK, 2 MISO, 3 MOSI und 4 CS des EEProm. Das Problem war ein Übbersprechen auf den Leitungen. Ich hatte zum Test jede 2. frei gelassen. 1 SCLK, 3 MISO, 5 MOSI und 7 CS. Und siehe da..... alles war gut. Pull UP, Pull Down oder C nach Masse im Bereich von pF bis nF brachten keinen Erfolg. Auch widerstände in Reihe zu MOSI, MISO, SCLK brachten nichts. Falls Ihr mal ähnliche Sorgen habt, erinnert Euch mal daran. Danke für Eure Mitarbeit
>Ich hatte zum Test jede 2. frei gelassen
Normalerweise legt man diese "freigelassenen Leitungen auf Masse, um ein
Übersprechen noch weiter zu verhindern.
geht in diesem Falle nicht, da der Stecker direkt vom Board kommt und voll belegt ist. Ich hatte allerdings damit auch noch nie Sorgen. Wie auf dem Board zu sehen, ist über dem ED2 ein 20pol Stecker. Das ist der ICE Anschluß für nen 89C2051. Über 30cm Flachband geht der direkt in die Zielapplikation, spielt dort den 89C2051 und macht auch keine Probleme. Ich denke die EEProm sind etwas zu hochohmig, so was diese Kopplungen ausreichen.
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.