mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Breite der SPI-Datenübertragung zu kurz?


Autor: Mücke (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

ich bin mittlerweile etwas weitergekommen bei meinen Problemchen von 
gestern.
Wie gesagt ich möchte mit einem Mikrocontroller (MC9S12XF512) ein EEPROM 
(M95080) über SPI ansteuern. Hier die Links zu den Datenblättern:
http://www.mikrocontroller.net/attachment/97308/MC...
http://www.mikrocontroller.net/attachment/97306/EEPROM.pdf

Im Prinzip ist mir der Ablauf jetzt klar. Ich muss eigentlich nichts 
anderes machen, als die Kontrollregister SPICR1 und SPICR2 sowie die 
Baudrate in SPIBR geeignet einstellen. Danach kann ich entweder, sobald 
im Statusregister SPISR das Bit SPIF gleich 1 ist das Datenregister 
SPIDR auslesen (Receive), oder sobald im Statusregister SPISR das Bit 
SPTEF gleich 1 ist in das Datenregister SPIDR schreiben (Transmit).

Die Datenübertragung an sich übernimmt dann der Mikrocontroller 
automatisch, sprich ich muss/kann mich z.B. nicht um das Setzen von SS 
kümmern.

Jetzt hab ich nur ein Problem:
Laut Mikrocontrollerdatenblatt S.938 f. umfasst eine Datenübertragung 
entweder 8 oder 16 Bits (je nach gewählter Einstellung im 
Kontrollregister SPICR2 Bit7).
Im Datenblatt des EEPROMS auf S.16 ist der erforderliche Ablauf zum 
Lesen des EEPROMs beschrieben. Hier steht, dass auf dein 8 Bit langen 
Befehl READ eine 16 Bit lange Adresse des zu lesenden Feldes folgen 
muss, woraufhin der Inhalt dieses Feldes übertragen wird. Sprich die 
Datenübertragung muss insgesamt mindestens 32 Bit lang sein. Der 
Mikrocontroller bietet mir aber nur max 16 Bit an. Ich kann das ja 
schlecht aufteilen, da der Mikrocontroller nach 16 Bit ja die 
Übertragung beendet und SS auf High zieht, oder???

Vielleicht ist es mir ja heute gelungen, mich ein wenig präziser 
auszudrücken, sodass sich jemand meiner erbarmt und Hilfe anbietet.

Danke!

Autor: Flip B. (frickelfreak)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Mach das, was das Datenblatt sagt, sende erst 8 bit Befehl, stelle dann 
schnellstmöglich um auf 16 bit und sende dem Ding seine Adresse. Ader 
die Adresse auf 2 Anläufe, könnte je nach Protokoll möglich sein, kann 
aber auch Datenmüll produzieren.

Autor: Lothar Miller (lkmiller) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Mücke schrieb:
> Ich kann das ja schlecht aufteilen,
> da der Mikrocontroller nach 16 Bit ja die
> Übertragung beendet und SS auf High zieht, oder???
Dann nimmm doch die SS-Leitung selber in die Hand. Das ist die übliche 
Vorgehensweise beim SPI-Master. Denn es könnten ja auch 2 oder mehr 
SS-Leitungen für mehrere SPI-Devices am Bus angeschlossen sein.... :-o

Autor: Mücke (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Philipp Bigott schrieb:
> kann aber auch Datenmüll produzieren.

Das denke ich auch, denn auf S. 16 im DB dess EEPROM steht:
"The Read Cycle is tetermined by driving the Chip Select High".

Und das passiert ja auch.

Autor: Mücke (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Lothar Miller schrieb:
> Dann nimmm doch die SS-Leitung selber in die Hand. Das ist die übliche
> Vorgehensweise beim SPI-Master.

Soweit ich es im Datenblatt des Mikrocontrollers richtig verstanden 
habe, funktioniert das leider nicht. Zumindest wüsste ich nicht wie. 
Denn wenn ich SPI über das Kontrollregister aktiviere, liegen die Pins 
ja nicht mehr in meiner Hand.

Autor: Ansgar K. (paulderbademeister)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Nach ca. 30 Sekunden Suche im Datenblatt habe ich den folgenden Satz 
entdeckt:

"If the SPI is in master mode and MODFEN is cleared, then the SS port 
pin is not used by the SPI."

Autor: Mücke (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Mücke schrieb:
>> Dann nimmm doch die SS-Leitung selber in die Hand. Das ist die übliche
>> Vorgehensweise beim SPI-Master.

Ah ok, müsste doch gehen. Ich werds mal so versuchen. Falls es nicht 
klappt, meld ich mich wieder mit Code. Danke!

Autor: Mücke (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
hm, also irgendetwas klappt nicht.

Als Ergebnis bekomme ich nach dem entsprechenden Tastendruck Wert = 0 
und nicht wie erhofft Wert = FF (wie es im Datenblatt steht auf S.18 
steht).

Ich habe mich auch schon an den Befehl fürs schreiben gemacht, aber auch 
nach dem Schreiben bleibt "Wert" auf 0.

Ich habe auch schon ein paar delays eingefügt, aber sicher bin ich mir 
da nicht. Und die Werte, die im Datenblatt angegeben sind, kann ich 
leider nicht wirklich zuordnen.

Wär echt super, wenn ihr über meinen Code drüberschauen könntet. Bin wie 
gesagt noch ziemlich Anfänger und weiß nicht weiter. Danke!!!

Autor: Mücke (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
InitSPI() wird natürlich auch schon zu Beginn der main aufgerufen

Autor: Mücke (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Kann mir niemand helfen?

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.