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


von Mücke (Gast)


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/MC9S12XF512.pdf
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!

von Flip B. (frickelfreak)


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.

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


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

von Mücke (Gast)


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.

von Mücke (Gast)


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.

von Ansgar K. (paulderbademeister)


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."

von Mücke (Gast)


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!

von Mücke (Gast)


Angehängte Dateien:

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!!!

von Mücke (Gast)


Lesenswert?

InitSPI() wird natürlich auch schon zu Beginn der main aufgerufen

von Mücke (Gast)


Lesenswert?

Kann mir niemand helfen?

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
Noch kein Account? Hier anmelden.