Forum: Mikrocontroller und Digitale Elektronik Mega8 und Mega88 - SPI Problem


von Michael K. (mmike)


Angehängte Dateien:

Lesenswert?

Hallo Leute,
ich hab ein kleines Problem mit der SPI Kommunikation zwischen einem 
ATMega8 und einem ATMega88. Beide laufen mit einem 16MHz Quarz und 
soweit laufen beide auch wunderbar, nur eben die Kommunikation zwischen 
beiden funktioniert nicht. Der Mega88 fungiert hierbei als Master und 
der Mega8 als Slave. Im Anhang ist der Code für den Master, Slave und 
Bild von der Verkabelung. Die Platine ist mittlerweile schon geätzt und 
fertig bestückt und mindestens 10mal durchgepiepst. Die passt.
Anfangs hat der Master immer nur einmal ein Paket verschickt und ist 
dann stehen geblieben. Nachdem ich dann die Pullups aktiviert habe läuft 
er durch und sendet brav Daten (habs auch mit dem Oszi kontrolliert).
Der Slave bekommt die Daten auch anscheinend, denn er löst auch brav 
einen SPI Interrupt aus. Diese Daten werden dann zum Debugging weiter 
über RS232 ausgegeben. Jedoch kommen leider immer nur nullen (0000 0000) 
am Slave vom Master an, obwohl dieser das Zeichen 'M' schickt. Das RS232 
funktioniert, denn in der Hauptschleife des Slaves wird pro Durchlauf 
ein 'L' ausgegeben, was der Rechner auch brav anzeigt.
Ich hoffe mir kann jemand helfen, denn so langsam weiß ich nicht mehr 
weiter.

Vielen Dank und beste Grüße,

Michael

von Carsten P. (papa_of_t)


Lesenswert?

Hallo Michael,

Ich habe keine Komplettlösung aber ein paar Tips:

1) Um Probleme mit der UART auszuschließen, beschränke Dich doch zuerst 
auf die SPI-Kommunikation. Laß den Slave einfach das empfangene Zeichen 
bein nächsten Transfer an den Master zurückschicken. Also beim Slave: in 
der ISR das SPDR lesen und wieder damit laden, oder um eines erhöht.. / 
am Master das Byte senden, ein bischen warten damit der slave fertig 
laden kann / die ISR beenden kann und dann das nächste Zeichen senden, 
danach SPDR lesen, was der Slave zurückgesendet hat. Verwende erstmal 
niedrige SPI-Taktraten und sende ein leicht auf dem Oszi zu erkennendes 
Musterabwechselnd (z.B. 53hex), das sollte auf Miso und Mosi abwechselnd 
sichtbar sein.

von Michael K. (mmike)


Lesenswert?

Hallo Carsten,

vielen Dank für die schnelle Antwort. Wie kann ich vom Slave was an den 
Master senden ? Muss ich hier dann den Slave immer zum Master machen und 
umgekehrt, oder kann der Slave auch an den Master senden ? Wie läuft das 
dann mit der SS Leitung ?

von johnny.m (Gast)


Lesenswert?

Das Senden über SPI erfolgt immer synchron, d.h., wenn der Master sendet 
(und nur dann), kann der Slave zur gleichen Zeit Daten an den Master 
senden. Der Master wählt den Slave aus und erzeugt den Takt. Wenn der 
Slave Daten für den Master hat, muss er entweder warten, bis der Master 
ihm die gütige Erlaubnis erteilt, diese zu senden, oder er muss die 
Möglichkeit haben, über eine zusätzliche Signalleitung dem Master 
mitzuteilen, dass er gerne mit ihm reden möchte. SPI ist eben wegen der 
Geschichte nicht sonderlich doll geeignet, um eine Kommunikation 
zwischen zwei µCs aufzubauen. Eignet sich eher zur Ansteuerung von 
Schieberegistern o.ä. (gleichzeitiges Einlesen und Ausgeben). In dem 
Fall ist I²C (bzw. bei den AVRs TWI) besser geeignet. Das hat dann nur 
wiederum den Nachteil, dass das Protokoll wesentlich komplizierter ist.

von Carsten P. (papa_of_t)


Lesenswert?

Hallo,

kommunikation in beide Richtungen ist kein Problem. Erstmal SS kannst Du 
auf LOW lassen, Du hast ja nur einen Slave und willst nicht aus mehreren 
selektieren, oder?

ansonsten ist es ganz einfach: Bei einer Übertragung wird das SPDR vom 
Master an den SLAVE und gleichzeitig das SPDR vom SLAVE an den MASTER 
gesendet. Um vom SLAVE etwas zu bekommen mußt Du also das SPDR am Slave 
laden und dann vom MASTER ausgehend irgendetwas senden.

von Michael K. (mmike)


Lesenswert?

Ich hatte mir auch schon überlegt, ob ich die Kommunikation nicht per 
RS232 mache. Einfach die Leitungen kreuzen und dann sollte das auch 
funktionieren. Zudem kann ich die Leitungen noch ans STK500 hängen und 
mitsniffen.

Eigentlich brauche ich keine bidirektionale Kommunikation. Es reicht 
wenn Daten vom Master zum Slave ankommen, die dann aber auch stimmen. 
Zudem wollte ich noch nen kleinen CRC check mit dran machen um sicher zu 
sein.

@Johnny: I2C hab ich auch schon verwendet mit Sonar Abstandssensoren, 
aber so wirklich übersichtlich war das nicht!

@Carsten: SS auf low lassen ist klar. Jedoch wenn ich immer SS toggle, 
dann werden die gesendeten Bytes synchronisiert, was mir kopfmässig 
einfach besser gefällt.
Wie kann ich dann die vom Slave gesendeten Daten am Master auslesen ? 
Stehen die dann auch im SPDR ?

von johnny.m (Gast)


Lesenswert?

> Stehen die dann auch im SPDR ?
Ja. Das Sende- und das Empfangsregister werden wie auch bei U(S)ART über 
dieselbe Adresse angesprochen. Kommt halt nur drauf an, ob es ein 
Schreib- oder Lesezugriff ist.

von Michael K. (mmike)


Lesenswert?

Kann ich eigentlich wenn die beiden µC miteinander kommunizieren den ISP 
Adapter vom STK dran lassen, oder sollte ich den abziehen ?

von Carsten P. (papa_of_t)


Lesenswert?

Ja. Einfach 1) vom Master ausgehend ein Byte senden, 2) Nach der 
Übertragung bischen warten, damit der Slave seine ISR abarbeiten kann 
(das empfangene Byte evtl. interpretieren und das sein Slave-SPDR 
entsprechend setzen). Dann 3) noch ein Dummy-Byte vom Master senden, 
damit das Slave-SPDR an den Master gesendet wird und 4) am Master das 
SPDR wieder auslesen - es sollte das sein, was der Slave eingetragen 
hat.

Du mußt nicht den Modus (Master oder Slave) ändern. Wenn Du bei 1) und 
3) immer das gleiche Byte sendest und in der slave-ISR einfach das SPDR 
liest und das gleiche wieder 'reinschreibst, solltest Du dieses Byte auf 
dem Oszi (Mosi/Miso) immer hübsch im Kreis fahren sehen.

von Michael K. (mmike) (Gast)


Lesenswert?

Hallo Leute,

vielen Dank für Eure Hilfe !! Ich hab den Fehler mittlerweile gefunden.

Master SPI Init:
SPCR = (1 << SPE) | (1 << MSTR) | (1 << SPR0);

Slave SPI Init:
SPCR = (1 << SPE) | (1 << SPIE);

Ja wo ist denn das (1 << SPR0) beim Slave?? Klar, wenn der Master mit 
fclk/16 schickt und der Slave mit fclk/4 erwartet daß das nicht gut 
gehen kann ....

Grüße,
Michael

von A.K. (Gast)


Lesenswert?

Interessant - durch diese Änderung geht es?

Atmel dazu: "SPR1 and SPR0 have no effect on the Slave". Logisch, denn 
der Slave kriegt den SPI-Takt ja extern.

von Michael K. (mmike) (Gast)


Lesenswert?

Da muss ich Dir recht geben. Habs auch grad nachgelesen. Naja  ... ich 
bin jedenfalls happy ....

Danke nochmals an alle,

Grüße,
Michael

von A.K. (Gast)


Lesenswert?

Und was war nun die Ursache?

von Michael K. (mmike) (Gast)


Lesenswert?

Gute Frage.
Ich hab keine Ahnung. Hab mit dem Oszi noch mal alles durchgemessen und 
jetzt passts .....

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.