ok hast recht, danke.
jetzt wartet er auf ende der übertragung (main.c ist im anhang). aber es
funzt irgendwie trotzdem nicht. ich weis nicht mehr wo ich den fehler
suchen soll. habt ihr ein paar tips.
das komische ist auch, daß beim debuggen auch kein wert an SPI Transmit
Data Register übergeben wird. TDR bleib immer null. z.b. nach
hallo,
das TDR beim lessen immer 0 zeigt ist klar. dieses register ist
write-only!
hast du mal auf clock/mosi/cs gemessen ob da überhaupt was rauskommt?
gruss
gerhard
ja clock und cs waren schon da.
jetzt habe ich noch mal das statusregister vom EEPROM abgefragt(mit Read
Status Register also mit 0x05) und sehe da MOSI ist auch 0x05 (auf dem
oszi).
nur eins kann hier nicht stimmen. nach acht MOSI-bits geht der takt und
cs wieder aus und deher kann der EEPROM keine daten an MISO aussenden.
also MISO geht kurz vom ende des taktes auf low und wenn der takt
aufhört wieder fast auf high (seltsam wieso nicht ganz auf high).
kann mich wage an CSAAT in SPI Chip Select Register erinnern. vielleicht
hilft das? aber glaube das ist für was anderes vorgesehen.
hallo,
der spi-master (in deinem fall at91sam7) muß für den empfang die
notwendigen "dummy"-bits senden.
wie sieht den nun dein code aus?
gruss
gerhard
ist jetzt im anhang.
bei der menu-funktion braucht man nicht auf die fehlermeldung(Fehler!)
zu achten, da ich jetzt nur das statusregister vom EEPROM abfrage und
mir das ganze auf dem oszi ansehe.
hie noch datenblatt vom EEPROM:
http://ww1.microchip.com/downloads/en/DeviceDoc/21204d.pdf
Jetzt sendest du weder Adresse noch Daten.
Oder hab ich was übersehen.
So ungefähr beschreibt man ein SPI EEPROM.
Beginn SpiWrite()
sende Schreibbefehl (schreibe ins SPI Register)
warte bis SPI Übertragung zuende ist
sende Adresse im EEPROM (schreibe ins SPI Register)
warte bis SPI Übertragung zuende ist
sende Datenbyte (schreibe ins SPI Register)
warte bis SPI Übertragung zuende ist
Eventuell kannst du hier auch erst eine ganze Page (mehrere Bytes)
senden.
Statusregister im EEprom pollen bis Programmierung zuende ist.
Ende SPiWrite
Beginn SpiRead()
sende Lesebefehl (schreibe ins SPI Register)
warte bis SPI Übertragung zuende ist
sende Adresse im EEPROM (schreibe ins SPI Register)
warte bis SPI Übertragung zuende ist
Sende DummyByte (0xFF)
warte bis SPI Übertragung zuende ist
Lese Spi Empfangsregister
Ende SpiRead()
Und bevor du überhaupt schreiben kannst musst du
das schreiben im EEProm erst mal FREISCHALTEN.
Siehe WREN im EEProm Datenblatt.
Und wenn du mehr als 256 Bytes in dein EEprom
schreiben/lesen willst musst du das Bit A8 der
Adresse in den Lese/Schreibbefehl einfügen.
Auch dazu siehe Datenblatt des EEproms.
Nachtrag: Ich sehe auch keine vernünftige CS Ansteuerung.
Eine Befehlssequenz darf nicht duch CS High unterbrochen
werden.
Also so:
CS low, Befehl, Adresse, Daten, CS High
Sieh dir die Timingdiagramme im EEPROM Datenblatt
noch mal genau an.
so jetzt habe ich mit CSAAT (in SPI Chip Select Register)und LASTXFER
(in SPI Transmit Data Register) den CS so gemacht wie du es gesagt hast.
also "CS low, WREN, Schreibbefehl, Adresse, Daten, WRDI, CS High" . und
beim lesen "CS low, Lesebefehl, Adresse, Dummybits, CS High" .
seltsamerweise wrerden nur 2 befehlsfolgen ausgegeben (also nur WREN,
Schreibbefehl). wieso kann ich nicht verstehen.
habe jetzt neuen code (IAR-Projekt, sehe anhang) mit interrupts.
noch eine frage. zwischen den einzelnen befehlen (z.b WREN,
Schreibbefehl) geht der takt aus, ist das ok?
>also "CS low, WREN, Schreibbefehl, Adresse, Daten, WRDI, CS High" . und
Das sollte so aussehen:
CS low, WREN, CS High
CS low, Schreibbefehl, Adresse, Daten, CS High
Hier auf das Ende der Programmierung warten (Status polling)
CS low, WRDI, CS High
Die Befehle werden erst nach CS high ausgeführt !
Wie gesagt, schau dir die Timingdiagramme an.
im anhang ist jetzt ein oszilloskopbild. zwar ist auf dem bild WREN
falsch (also mit Schreibbefehl, Adresse, Daten, WRDI zusammen) aber es
kommen nur zwei befehle aus dem µC und nicht fünf wie im code
vorgesehen. und wenn ich dieses problem nicht löse kann ich ja auch
nicht schreiben und lesen. bis jetzt habe ich es nicht rausgefunden
woran es liegt.
und noch mal, ist es ok das der takt zwischen den befehlen ausgeht (ich
glaube ja)?
Ey geil ein TDS1024 :)
Hab den großen Bruder ;)
>und noch mal, ist es ok das der takt zwischen den befehlen ausgeht (ich>glaube ja)?
Der Takt geht immer dann aus wenn das SPI Register
keine Daten mehr enthält. Sobald du welche reinschreibst
kommt wieder ein Takt .