Forum: Mikrocontroller und Digitale Elektronik SPI Abfrage korrekt ?


von Andreas (Gast)


Lesenswert?

Hallo,

ich habe versucht über SPI einen Abfrage der Eingänge des 74HC165 zu
machen, leider funktioniert es nicht wirklich. Ist

data = SPDR;

überhaupt richtig ? Wenn ja liegt es wohl an der angeschlossenen
Hardware ...

Danke

von Johannes Raschke (Gast)


Lesenswert?

Ich weiß ja nicht, was für einen Controller Du verwendest... Beim MSP430
muß man zum Lesen erst ein Byte schreiben, damit der Takt vom MSP
generiert wird. Sonst kommt immer 'ne Null rein.

von Andreas (Gast)


Lesenswert?

ATMega32 - die Konfiguration müsste an sich richtig sein, beim Senden
funktionierts ja auch ...

von Johannes Raschke (Gast)


Lesenswert?

Wie gesagt, beim Empfangen mußt Du gleichzeitig was senden (0xFF). Halte
doch beim Empfangen mal das Oszi an die Clock - Leitung und gucke, ob
die auch so arbeitet wie sie soll...

von Andreas (Gast)


Lesenswert?

Oszi leider nicht vorhanden ...

SPDR = leds;
data = SPDR;

Wird das überhaupt gleichzeitig abgearbeitet oder hintereinander ?

von Rev (Gast)


Lesenswert?

Hi.

Wie Johannes schon erwähnt hat musst du tatsächlich zum lesen eines
bytes vorher (eigentlich währenddessen) ein Byte schreiben. Der 74HC165
kann nur als Slave arbeiten und somit ist der ATM32 der SPI-Master und
ist dafür zuständig den Takt zu generieren. Dieser tut das allerdings
nur wenn er Daten sendet.

Beispiel (wie es ist den meisten fällen abläuft):

// Kommando an den Slave senden damit dieser weiss das er dir mit der
folgenden Taktung Daten schicken soll
SPDR = 0x..;
// Beliebige Daten senden damit der uC dem slave einen Takt zum Daten
senden bereitstellt
SPDR = 0xFF;
// während 0xFF gesendet wird wird "zeitgleich" das Datenbyte vom
74HC165 empfangen
data = SPDR;

Es sei angemerkt das der SPDR Register für den Empfang ein anderer ist
als der für das Senden. Somit wird im obigen beispiel nicht
gleichzeitig lesend und schreibend auf ein und den selben SPDR register
zugegriffen wie es den Anschein hat.

Rev

von Johannes Raschke (Gast)


Lesenswert?

Da es einen FIFO gibt würde ich sagen: Ja. Im Datenblatt steht ja auch
"Full Duplex". Leider gibt's da kein Codebeispiel zum Empfangen über
SPI als Master. Aber Du kannst das mit dem Senden einfach mal
ausprobieren.
Das Oszi kannst Du evtl. auch durch einen Kopfhörer mit
Entkoppelungskondensator ersetzen.
Pullup an Port B, Pin 3 ist aus?

von Stephan (Gast)


Lesenswert?

Hmm, also ich denke, ohne Oszi mit uCs zu entwickeln, ist ziemlich
schwierig... Wenn nicht gar unmöglich, wenn man das Echtzeitverhalten
von Pins betrachten muss.

Stephan.

von Rev (Gast)


Lesenswert?

Naja, bei SPI ist das wenig problematisch da der uC in diesem Fall ja
für einen Sauberen Takt sorgt.
Allerdings geb ich Stephan recht das ein Oszi extrem hilfreich sein
kann....ein Digitales in erster Linie ist schon echt was nettes.

von Peter Dannegger (Gast)


Lesenswert?

"Hmm, also ich denke, ohne Oszi mit uCs zu entwickeln, ist ziemlich
schwierig"


Ich würde eher sagen: "ohne Datenblatt mit uCs zu entwickeln, ist
ziemlich schwierig"


Erstmal muß man das SPI initialisieren.

Dann muß man den 165 parallel einlesen und dann wieder auf seriell
Schieben umschalten.

Und dann erst kann man schieben (Dummy-Byte reinschreiben: SPDR = 0;).

Dann wartet man, bis das Schieben vorbei ist (festes Delay oder
Busy-Bit testen).

Und jetzt kann man auch was sinnvolles auslesen.


Nur "data = SPDR;" muß daher unbedingt gegen den Baum gehen.


Peter

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.