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
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.
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 ?
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.
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.
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 ?
> 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.
Kann ich eigentlich wenn die beiden µC miteinander kommunizieren den ISP Adapter vom STK dran lassen, oder sollte ich den abziehen ?
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.
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
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.
Da muss ich Dir recht geben. Habs auch grad nachgelesen. Naja ... ich bin jedenfalls happy .... Danke nochmals an alle, Grüße, Michael
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.