Frage zu SPI (ATmega168; AT25DF641)

Gast #1723043
Hallo,

ich bin gerade dabei einen AT25DF641 Dataflash von Atmel mit einem 
ATmega168 anzusprechen. Soweit ja kein Problem, da die Datenblätter sehr 
leicht verständlich sind.
Nur nun habe ich ein Problem:
Bei dem AVR initalisiere ich das SPI als Master. Um nun ein Byte zu 
senden, schiebe ich das Byte in das Register SPDR.
Beim Lesen vom Dataflash, muss ich ein Opcode und die Adresse an den 
Dataflash senden. Diese schickt mir aber nun nur die Daten, wenn ich 
weiterhin ein Clock Signal anlege. Nur wie soll ich das mit dem AVR 
empfangen? Dafür müsste ich doch dann in den Slave Modus wechseln oder? 
Aber im Slave Modus sendet der AVR ja auch kein Clock Signal...
Ich hoffe ihr versteht mein Problem, ich weiß nicht wie ich es besser 
beschreiben soll...
Wenn ihr noch Fragen habt, fragt einfach, ich weiß im Moment echt nicht 
wie ich das lösen soll..

Viele Grüße,
   Johannes
SPI ist IMMER bidirektional. Du schreibst ein Byte nach SPDR, startest 
damit den Transfer, und bekommst ein Byte in SPDR zurück, wenn der 
Transfer komplett ist. Wenn Du Kommando und Adresse sendest, 
interessieren Dich die Dummy-Bytes, die das Flash sendet, nicht. Zum 
Lesen schickst Du Dummy-Bytes und bekommst Deine Daten zurück.

fchk
Gast
Hallo,

kann es sein, dass das beim Dataflash dann nicht so ist?
Ich habe mal ein Bild aus dem Datenblatt angehängt... Dort sieht es 
nicht so aus wie wenn der Flash immer ein Dummybyte zurück schickt.. bzw 
ich ihm ein Dummybyte schicken muss, damit er ein weiteres Byte 
schickt..
Irgendwie verstehe ich das im Moment nicht so ganz..
Kann mir das vielleicht nochmal jemand erklären?

Vielen Dank schonmal :)
Johannes
Angehängte Dateien:
Gast
>Irgendwie verstehe ich das im Moment nicht so ganz..
>Kann mir das vielleicht nochmal jemand erklären?

Der Master erzeugt den Clock. Der Slave macht NICHTS von alleine.
Wenn du Daten aus dem Teil haben willst musst du Dummy Bytes schicken
um die Daten abzuholen. Das ist das ganze Geheimnis bei SPI.
Gast
So bin ich an bestimmte Port Pins gebunden, und an einen bestimmten AVR 
Controller. Wenn ich das mit Soft SPI löse (Geschwindigkeit ist bei 
meiner Anwendung relativ egal), dann kann ich den Code auf jedem AVR 
verwenden und an allen Pins. So war das gemeint ;) Vom Aufwand her 
bestimmt etwas komplizierter, aber ich denke so bin ich eben etwas 
flexibler ;)

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 16 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.