Forum: Mikrocontroller und Digitale Elektronik SPI - keine Daten im Datenregister


von Oli (Gast)


Lesenswert?

Hallo zusammen,

ich bin kurz vorm nervenzusammenbruch!;)
Ich bin schon ca. 2 volle tage dran die SPI schnittstelle zwischen einem 
master und einen slave zum laufen zu bekommen. Ich habe zwei ARM - 
LPC2148 boards von Keil.

Was auf anhieb funktionierte: master setzt den SELECT SLAVE auf LOW und 
schreibt etwas in das S0SPDR (Datenregister) zb 0x01 um es zum Slave zu 
schicken. Sobald ich dieses Register schreibe wird ein Interrupt 
ausgelöst. Man möchte es kaum glauben, der  Interrupt wurde wie gewollt 
ausgelöst. Der Slave hat diesen auch bemerkt in ging auch in die ISR 
Routine. Nun zu meinem Problem: das Datenregister beinhaltet nicht die 
daten(0x01) sonderen immer 0xFF, obwohl ich nirgendwo im code 0xFF 
übergebe( eine art DEFAULTwert)?!

Die dokumentation des LPC2148 ist auch so ziehmlich schwach in bezug auf 
SPI.

Hat jemand Ahnung, wie das protokoll von SPI aussieht bzw. wie man 
prinzipiell die kommunikation zwischen master und slave aufbaut?
Oder hat jemand einen zb Code zum LPC21XX? leider habe ich nur zum ATMEL 
etwas im forum gefunden.

gruss
  oli

von Obelix (Gast)


Lesenswert?

Was sagt dein Oszi zur Schnittstelle?

von Peter D. (peda)


Lesenswert?

Wenn ich mich recht erinnere, funktioniert das LPC-SPI nur dann, wenn 
sämtliche 4 Pins auf SPI gesetzt werden (MISO, MOSI, SCK, SS).


Peter

von Oli (Gast)


Lesenswert?

@Obelix,
leider habe ich ein anloges oszi, und soweit ich weis kann ich keine 
aperiodischen signale, sprich datenuebtragung, darstellen. SCLK ist aber 
vorhanden.

@ Peter Dannegger
Ja, ich hab es auch so gemacht, 3 leitungen (MOSI, MISO, SCLK 
->p0.4,p0.5,p0.6) 1 zu 1 zwischen master und slave verbunden. dann habe 
ich mir einen freien Port (zb port0.3) beim master. Dieses signal habe 
ich dann mit SSL des slaves verbunden.

Wie sollte es den eigentlich funktionieren?
Ist es so?: wenn man etwas in das S0SPSD (datenreg) schreibt , dass dann 
ein interrupt ausgelöst wird (master und slave), danach kann in der ISR 
- routine im slave aus dem Datenregister die daten ausgelesen werden.

von Peter D. (peda)


Lesenswert?

Oli wrote:

> @ Peter Dannegger
> Ja, ich hab es auch so gemacht, 3 leitungen (MOSI, MISO, SCLK


Ich sprach doch deutlich von allen 4 !

Also SS des Master einschalten und über pullup an VCC.


Peter

von Oli (Gast)


Lesenswert?

@ Peter Dannegger
ja, 3 leitung MISO, MOSI, CLK 1:1 PLUS SSL zwischen master(freier port) 
und slave(SSL), der SSL des masters bleibt doch frei oder? Wenn ich dann 
den slave ansprechen will, muss der master den "freien port" auf 
low-active setzen. korrekt?!


von Peter D. (peda)


Lesenswert?

Mach einfach mal, was ich geschrieben hab.


Peter

von Oli (Gast)


Lesenswert?

@Peter Dannegger

Sorry nochmal,
damit da nichts daneben geht, wie ich jetzt es von dir verstanden habe:



   MASTER:-SSL --------pullup VCC              SLAVE:
          -CLK --------------------------------CLK
          -MISO--------------------------------MISO
          -MOIS--------------------------------MOSI
          -Port zur Ansteuerung des SLaves-----SSL

Wie groß soll der PULLUP sein.

Nochmal danke für deine GEDULD!



von Oli (Gast)


Lesenswert?

Nachtrag:
natürlich soll MOIS -> MOSI sein

von holger (Gast)


Lesenswert?

Ich würde MISO-MOSI und MOSI-MISO anschließen.

von Dieter Werner (Gast)


Lesenswert?

> Ich würde MISO-MOSI und MOSI-MISO anschließen.

Wird das je nach Einstellung (Master / Slave) schon intern gekreuzt oder 
muss es so gemacht werden wie holger schrieb?

von Ralph (Gast)


Lesenswert?

MOSI bedeutet Master Out Slave In
MISO bedeutet Master In Slave Out

Also auf keine Fall drehen !!!! MOSI muss auf MOSI


Eine SPI Verbindung muss aus 3 Signalen bestehen, das sind :

1. CLK
2. MOSI
3. MISO

Jedes weitere Signal ist optional

4. Slaveselect : wird auf LOW gelegt um den Slave auszuwählen.
Ist nur ein Master und EIN Slave am Bus, dann kann Slaveselect am Slave 
auf GND gelegt werden.Damit ist dieser Slave IMMER ausgewählt.
Die Beschaltung am Master hängt in dem Fall vom µC ab, und ist nur dann 
notwendig wenn der Slaveselect von µC in Hardware unterstüzt wird.
Ist Slaveselect am Master nur in Software möglich, das heißt das der 
User einen Port von Hand schalten muss, kann man diesen Port auch 
weglassen, bzw, anderst verwenden.

Sind mehrere Slave am Bus, muss vom Master zu jedem Slave ein 
unabhängiges Signal gelegt werden.

5. Busy : mit Busy kann der Slave den Master anhalten wenn der Slave zb 
das Datenwort noch nicht in das Schieberegister gelegt hat.



Welche dieser optionalen Signale vom µC in Hardware und welche von User 
in Software programmiert werden müssen, häng von der SPI implementierung 
im µC ab.

von holger (Gast)


Lesenswert?

@ Ralph
> Also auf keine Fall drehen !!!! MOSI muss auf MOSI

Tatsächlich, du hast recht. Die werden quasi automatisch
gekreuzt. Ich nehme alles zurück und behaupte das Gegenteil. ;)

von holger (Gast)


Lesenswert?

Und da stehts ja auch eindeutig:

MISO Input/Output Master In Slave Out. The MISO signal is a 
unidirectional signal used to transfer serial data
from the slave to the master. When a device is a slave, serial data is 
output on this signal.
When a device is a master, serial data is input on this signal. When a 
slave device is not
selected, the slave drives the signal high impedance.


MOSI Input/Output Master Out Slave In. The MOSI signal is a 
unidirectional signal used to transfer serial data
from the master to the slave. When a device is a master, serial data is 
output on this signal.
When a device is a slave, serial data is input on this signal.

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.