Forum: Mikrocontroller und Digitale Elektronik EEPROM über SPI funktioniert nicht


von Mücke (Gast)


Angehängte Dateien:

Lesenswert?

Hallo,

mein Problem ist, dass ich es einfach nicht fertig bringe dieses EEPROM 
(http://www.mikrocontroller.net/attachment/97306/EEPROM.pdf) mit diesem 
Mikrocontroller 
(http://www.mikrocontroller.net/attachment/97308/MC9S12XF512.pdf) zu 
programmieren.

Ich wäre wirklich SEHR dankbar, wenn sich jemand den Code anschauen 
könnte, der etwas davon versteht. Ich hab mich jetzt 2 Tage damit 
beschäftigt und ich fände es fast ein bisschen Schade, wenns ganz 
umsonst war.

Im angehängten Code versuche ich einfach mal den Wert einer beliebigen 
Adresse (0x0333) des EEPROMS auszulesen. Wenn ich den ausgewählten 
Taster drücke, sehe ich beim Debuggen dass die im Code markierte 
while-Schleife nicht verlassen wird. Das liegt daran, dass hier SPI1SR = 
0b10100000 beträgt. D.h. Bit7 also SPIF wurde an dieser Stelle auch 
schon gesetzt, was aber eigentlich gar nicht sein dürfte, weil SPIF 
gesetzt wird, sobald ein neuer Datensatz über SPI eingetroffen ist (µC 
DB S.930). Die Daten sollten aber laut EEPROM-DB S.16 erst nach der 
vollständigen Übertragung der gewünschten Adresse reinkommen.

Ersetze ich die == durch &, so erhalte ich den Wert 0 zurück, was auch 
falsch ist, da laut EEPROM-DB S.18 angegeben ist, dass alle Werte mit FF 
initialisiert sind.

Ich habe leider mittlerweile keine Idee mehr, was ich machen könnte...

von Mücke (Gast)


Lesenswert?

Schade, dass niemand hilft

von holger (Gast)


Lesenswert?

Nach dem senden des zweiten Adressbytes musst du
noch ein DummyByte senden. Das EEPROM sendet schliesslich
nicht von alleine. Der Master muss den Takt erzeugen.
Und frag dann nicht das Receive sondern das Transmit Ready Flag ab.

von Mücke (Gast)


Angehängte Dateien:

Lesenswert?

Danke Holger,

habs jetzt mal so gemacht, wie du gesagt hast. Leider Bekomme ich immer 
noch Wert = 0.

Im Prinzip verstehe ich schon was du meinst, aber wie oben beschrieben 
finde ich es schon sehr seltsam, dass ich nach dem senden des ersten 
Adressbytes das Flag bekomme, dass ein Byte empfangen wurde. Dieses 
dürfte ja erst später auftreten.

Maaaan, das Ding macht mich noch kirre...

Noch ne Idee?

von Mücke (Gast)


Lesenswert?

kein "alter Hase" mehr da mit ner pfiffigen Idee?

von Mücke (Gast)


Lesenswert?

was ist eigentlich mit der Baudrate? Kann ich die mehr oder minder 
beliebig wählen, oder nach was richtet sich die?

von Andreas S. (Firma: Schweigstill IT) (schweigstill) Benutzerseite


Lesenswert?

Mücke schrieb:
> Im Prinzip verstehe ich schon was du meinst, aber wie oben beschrieben
> finde ich es schon sehr seltsam, dass ich nach dem senden des ersten
> Adressbytes das Flag bekomme, dass ein Byte empfangen wurde. Dieses
> dürfte ja erst später auftreten.

Ich habe mir zwar nicht die Registerbeschreibung angeschaut, aber eine 
der Grundeigenschaften von SPI besteht darin, dass immer gleichzeitig 
gesendet und gelesen wird.

von Mücke (Gast)


Lesenswert?

Andreas Schweigstill schrieb:
> Ich habe mir zwar nicht die Registerbeschreibung angeschaut, aber eine
> der Grundeigenschaften von SPI besteht darin, dass immer gleichzeitig
> gesendet und gelesen wird.

ja schon, aber zuerst einmal muss ich doch die Adresse ganz senden, von 
der ich den Wert gesendet haben will und dann kann erst der Wert 
gesendet werden. Und bei mir läuft da irgendetwas schief, denn sobald 
ich irgendetwas zum Senden ins Datenregister schreibe wird das Flag 
gesetzt, welches angibt, dass etwas empfangen wurde.

Es ist eh sehr verwirrend, dass es für schreiben und lesen nur ein 
gemeinsames Datenregister gibt.

Ich geb eh langsam auf. Keine Ahnung, was ich noch ändern könnt.

von Weinbauer (Gast)


Lesenswert?

Mücke schrieb:
> ja schon, aber zuerst einmal muss ich doch die Adresse ganz senden, von
> der ich den Wert gesendet haben will und dann kann erst der Wert
> gesendet werden. Und bei mir läuft da irgendetwas schief, denn sobald
> ich irgendetwas zum Senden ins Datenregister schreibe wird das Flag
> gesetzt, welches angibt, dass etwas empfangen wurde.

ja, genau, das soll auch so sein. Die SPI lauscht immer am MISO mit,
sobald ein Takt über SCK raus geht. Meist ist dann im Empfangsregister
einfach eine 0, weil der Slave halt tatsächlich nichts zurück gibt.
Ich hatt auch schon, dass im Eingangsregister der gesendete Wert
angekommen ist, zum Gegenprüfen halt.
Bei den EEPROM die ich bisher verwendete war es so, dass nach der 
Adresse
einfach noch mal eine 0 gesendet werden musste um dann das gewünschte 
Byte ins Empfangsregister zu schieben.

von Mücke (Gast)


Lesenswert?

Weinbauer schrieb:
> ja, genau, das soll auch so sein. Die SPI lauscht immer am MISO mit,
> sobald ein Takt über SCK raus geht. Meist ist dann im Empfangsregister
> einfach eine 0, weil der Slave halt tatsächlich nichts zurück gibt.
> Ich hatt auch schon, dass im Eingangsregister der gesendete Wert
> angekommen ist, zum Gegenprüfen halt.
> Bei den EEPROM die ich bisher verwendete war es so, dass nach der
> Adresse
> einfach noch mal eine 0 gesendet werden musste um dann das gewünschte
> Byte ins Empfangsregister zu schieben.

hilft mir leider nur alles nicht weiter...

von Toni B. (Gast)


Lesenswert?

Wie wärs mit einer Websuche: "68hc12 application note SPI"

von Mücke (Gast)


Lesenswert?

Toni B. schrieb:
> Wie wärs mit einer Websuche: "68hc12 application note SPI"

hm also auf mein spezielles Problem konnte ich da leider nichts 
übertragen. Vielleicht bin ich da zu engstirnig...

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.