AT25080 mit 8051 in ASM

#889288
Lesenswert?

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
#889501
Lesenswert?

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
#889566
Lesenswert?

@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.
#889588
Lesenswert?

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.
#889594
Lesenswert?

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...
#889597
Lesenswert?

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
#889603
Lesenswert?

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.
#892456
Lesenswert?

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
Gast #893665
Lesenswert?

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.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren