Hallo
Ich hab jetzt angefangen mich mit SPI Übertragung zu befassen, jedoch
klappt es nicht. Für den Anfang wollte ich eine einfache Zahl senden.
Wenn ich das Buch bzw Datenblätter richtig verstanden habe, wird bei
SS-low beim Slave (wenn SPI aktiviert ist) das Daten Byte automatisch
ins Register geladen und anschließend (wenn SPIF 1 wird) ein Interrupt
ausgeführt. Um Fest zustellen das dieser auch ausgeführt wird will ich
zuerst einfach die Leds anders Leuchten lassen, jedoch wird dieser
Interrupt nie ausgeführt und ich weis nicht wieso.
Mit den Oszi hab ich MOSI, PB1/SS sowie SCK gemessen und die Signale
machen genau das was erwartet. (SS geht low für den Zeitraum der
Übertragung, SCK Takted und MOSI sendet).
Ich weis nicht was ich noch Versuchen kann bzw. Wo mein Fehler liegt und
ich hoffe das mir jemand von euch helfen kann?
Zum Aufbau, ich Verwende Zwei ATMEGA8A, mit 8MHZ interner Oszillator
getaktet, einer (der Slave) in STK500 der auf die Leds über PORTC
angeschlossen ist. Der Master ist an einem Experimentier Board und mit
kable verbunden. (ich habe einen skizzenhaften Schaltplan angehängt an
den die SPI Verbindungen ausgezeichnet sind)
Besten Dank für die Hilfe
manhai
Slave
1
/*
2
* SPI_comunicatin_test_master.c
3
*
4
* Created: 13.10.2014 12:55:19
5
* Author: manhai
6
*/
7
8
9
#include<avr/io.h>
10
#include<avr/delay.h>
11
#include<avr/interrupt.h>
12
#define F_CPU 8000000
13
volatilecharzyklus;
14
15
//SPI Transfer Complete Interrupt starting on page 124 in datasheet
Ich glaube, dass du die Ein/Ausgänge nicht richtig setzt.
Beim Slave sollte MISO = Ausgang, MOSI = Eingang, SCLK = Eingang sein,
beim Master MISO = Eingang, MOSI = Ausgang, SCLK = Ausgang.
Du setzt nur PB4 / MISO.
spess53 schrieb:> Nein. MOSI(Master) an MOSI(Slave) und MISO(Slave) an MISO(Master).
Nomen est omen.
*M*aster*O*ut*S*lave*I*n
vs.
*M*aster*I*n*S*lave*O*ut
Ganz klar, daß da mal wieder irgendwer das Datenblatt nicht gelesen hat.
Und spess53 war nicht der, der das nicht getan hat...
Es hat leider nicht geklappt.
Mir ist aber aufgefallen das sobald SCK verbunden ist sofort alle Leds
Leuchten (obwohl sie dies nicht tun sollten). Es macht hier keinen
Unterschied ob SCK schon beim Einschalten des ICs verbunden ist oder
nachträglich angeschlossen wird. Ich weis einfach nicht wieso er so
etwas tut.
Anmerkung: Beide ICs liegen auf der gleichen Versorgungspannung sowie
GND
manhai schrieb:> Mir ist aber aufgefallen das sobald SCK verbunden ist sofort alle Leds> Leuchten (obwohl sie dies nicht tun sollten)
Wenn die aktive Low geschaltet sind: SCK auf dem Slave NICHT als Ausgang
setzen, siehe DDRx Register. Die DDR Bits der SPI Pins müssen auf dem
Slave genau umgekehrt zum Master gesetzt werden.
Hintergrund:
Low Out auf dem SCK des Masters erzeugt mit dem High Out des Slave einen
Kutzschluss der Betriebsspannung, die auf dem Slave stark absinkt - bis
die LEDs über die ESD Dioden anfangen zu leuchten.
Danke für die schnelle Antwort
So weit klingt alles logisch, jedoch sind die Pins (SCK, sowie SS, und
MOSI) vom Slave bereits als Ausgang geschalltet(DDRB ist überall "0"
außer auf pin 4 (MISO)) deshalb weis ich ja nicht wo der Fehler liegt.
manhai schrieb:> So weit klingt alles logisch, jedoch sind die Pins (SCK, sowie SS, und> MOSI) vom Slave bereits als Ausgang geschalltet(DDRB ist überall "0"> außer auf pin 4 (MISO)) deshalb weis ich ja nicht wo der Fehler liegt.
Umgekehrt.
DDRB.x = 0 / Pin ist Eingang.
DDRB.x = 1 / Pin ist Ausgang.
Und auch falsch, sollte sein:
Slave:
MISO = Ausgang
MOSI = Eingang
SCK = Eingang
Master:
MISO = Eingang
MOSI = Ausgang
SCK = Ausgang
Ist das so schwer ?
Marc Vesely schrieb:> Umgekehrt.> DDRB.x = 0 / Pin ist Eingang.> DDRB.x = 1 / Pin ist Ausgang.>> Und auch falsch, sollte sein:> Slave:> MISO = Ausgang> MOSI = Eingang> SCK = Eingang>> Master:> MISO = Eingang> MOSI = Ausgang> SCK = Ausgang
Genau diese DDR Belegung habe ich. Ich habe es auch noch einmal
zusätzlich Überprüft im ATMEL Studio 6 - Simulation, nur Verstehe ich
nicht wieso diese Einstellung falsch ist. In einer Antwort vorher wurde
mir diese genannt, ebenso steht sie im Datenblatt zu ATmega8, im Buch
und auch in allen anderen Quellen die ich gefunden habe.
Stefan Ernst schrieb:> Hilfreich wäre auch, wenn init_spi_slave auch mal aufgerufen werden> würde.
Ich habe es selber gestern gesehen, und bereits korrigiert. (ist leider
Passiert da ich das ganze schon min 4 mal neu geschrieben habe (mit
Vorlage verschiedenster Seite/Bücher/Datenblätter) um den Fehler
möglichst alleine zu finden zu können bevor ich andere frage)
ich habe heute den Fehler gefunden
ich habe statt ISR(SPI__STC_vect), ISR(SPI_STC_vect) geschriebne gehabt,
nachdem ich das geändert habe, hat alles ohne Probleme geklappt.
mfg
manhai