Forum: Mikrocontroller und Digitale Elektronik Probleme bei SPI Übertragung


von Mathias (Gast)


Angehängte Dateien:

Lesenswert?

Hallo, ich habe ein Problem bei meiner SPI Übertragung. Wenn ich die
Daten per Logic Analyser am Ausgang des uC anschaue, bekomme ich nie
die Daten die ich in den Datenpuffer geschrieben habe. Meiner Meinung
nach werden die Daten nicht richtig in den Puffer übernommen.

Im Anhang ist ein Screenshot vom Logic Analyser, nach dem Senden von
0x00. Was auf dem Bild zu sehen ist, entspricht jedoch 0xEF und nicht
0x00!!

Einen Fehler in der SPI Initialisierung kann ich ausschließen. Kann es
sein dass die Daten nicht stimmen da die SPI Schnittstelle unbeschaltet
ist? Greife die Daten (MOSI - Leitung) über einen Serienwiderstand ( 470
Ohm ) direkt am uC ab.

Mfg, Mathias

von Jens (Gast)


Lesenswert?

Wie hoch ist denn dein SPI-Takt?

von Mathias (Gast)


Lesenswert?

8MHZ/128

von Jens (Gast)


Lesenswert?

Gut, dann sind 500kHz Samplerate ok :)

von Mathias (Gast)


Lesenswert?

jupp :-)

von Mathias (Gast)


Lesenswert?

muss der Datenbuffer ausgelesen werden, bevor man neue Daten
hineinschreiben kann?

von Ulrich (Gast)


Lesenswert?

NEIN

ich kenne deinen Code nicht, ich denke auch nicht das es daran liegt,
aber man darf nix in das register reinschreiben solange noch
rausgetaktet wird....

von Mathias (Gast)


Angehängte Dateien:

Lesenswert?

so hier mal ein auszug aus meinem code

mfg, mathias

von Mathias (Gast)


Lesenswert?

Kann es sein, dass das SPI Probleme mit der Verwendung des internen
Quarzes hat (7.3728Mhz) => LPC936

von Mathias (Gast)


Lesenswert?

keiner eine ahnung was das sein kann?

von Peter Dannegger (Gast)


Lesenswert?

"keiner eine ahnung was das sein kann?"


Naja, den LPC936 benutzen (hier) wohl nicht sehr viele.

Außerdem reichlich spät, daß Du damit rausrückst.
Mit fehlenden fundamental wichtigen Angaben kann man schnell jemanden
vergnatzen.


Peter

von Peter Dannegger (Gast)


Lesenswert?

"Kann es sein, dass das SPI Probleme mit der Verwendung des internen
Quarzes hat"


Kein MC hat Probleme mit den internen Quarz, da keiner einen internen
Quarz hat !

Wäre ja viel zu teuer sowas. Guck Dir mal die Preise von RTC-Bausteinen
mit internem Quarz an.

Der interne RC-Oszillator macht nur Probleme bei UART oder
RTC-Anwendungen.


Peter

von Mathias (Gast)


Lesenswert?

lpc901 hat einen internen 7.3728Mhz Quartz und kostet bei größeren
stückzahlen um die 80Cent!! genau genommen hat die ganze lpc900 serie
einen internen quarz!

Das problem hab ich übrigens gelöst. lag daran, dass ich ein
übersprechen der leitung am logicanalyser hatte.... somit hatte ich bei
jeder pos. flanke von clk bzw. cs einen kurzen impuls auf mosi!

von Rahul D. (rahul)


Lesenswert?

da frage ich mich, was der Unterschied zwischen einem RC- und einem
Quarz-Oszilator ist.

In diesem Dokument steht nur was von RC-Oszillator:

http://www.semiconductors.philips.com/acrobat/datasheets/P89LPC901_902_903-02.pdf

von Mathias (Gast)


Lesenswert?

auf jeden fall habe ich schon mehrere projekte mit einem lpc931
realisiert und dabei den internen quartz verwendet!

sehr genau ist das ganze natürlich nicht, aber zuwas auch. wenn ich
damit eine uhr machen will verwende ich ja so und so einen externen
takt wie zb. den ds32khz oder überhaupt einen rtc mit integriertem,
temperaturstabilem quartz

von Peter Dannegger (Gast)


Lesenswert?

"und dabei den internen quartz verwendet!"

Dann verrate mal, wie Du etwas verwendest, das gar nicht existiert !

Im Datenblatt steht nämlich nur: "On-Chip RC oscillator Option"


"sehr genau ist das ganze natürlich nicht"

Weil es eben kein Quarz ist !


Peter

von Rahul D. (rahul)


Lesenswert?

Vielleicht hat da jemand Probleme, den Unterschied zwischen Quarz und
Oszillator zu verstehen...

von Mathias (Gast)


Angehängte Dateien:

Lesenswert?

lol @ peter

nur kann ich das ganze programm mit dem rc ocsillator laufen lassen (
mehrere LPC931 Projekte von mir funktionieren so ohne Probs.) und sogar
die oszillator pins alls i/o pins verwenden

kannst es ja selber probieren, wenn du lust und laune dazu hast..
einfach in der startup datei bzw. in der configuration den int. rc
oszillator auswählen und laufen lassen

im anhang noch eine art "beweis", dass man keinen ext. quarzt
benötigt

von Rahul D. (rahul)


Lesenswert?

1. hat der LPC eine internen RC-Oszillator (deiner Meinung nach war der
interne Quarz kaputt o.ä)
2. Bei SPI ist die Übertragungsgeschwindigkeit ziemlich egal, da es
sich um eine synchrone Datenübertragung handelt; der Takt wird also auf
einer separaten Leitung übertragen, und muß nicht wie bei asynchroner
Übertragung durch den Empfänger erzeugt werden.
3. Was ist das den fürn Beweis? Zeigt nur, was ich in 1.) schon
geschrieben habe.

von Mathias (Gast)


Lesenswert?

k @ peter ich habe keinen internen quarzt sondern den int. rc oszillator
verwendet. wollte eben nur wissen ob der rc oszillator mit spi probleme
hat... hat er jedoch nicht.. ob es probleme mit dem uart gibt wage ich
zu bezweifeln, da man ja auf den int. baudragengenerator zurückgreifen
kann, welcher sich vom rc oszillator ableitet. Dass man auf eine
begrentzte anzahl von baudraten beschränkt ist ( genau genommen 9),
muss man halt dann in kauf nehmen. bei den 9 baudraten ist jedoch
gewährleistet dass die toleranz in einer gew. grenze gehalten wird,
damit der empf. noch richtig abtasten kann

von Mathias (Gast)


Lesenswert?

@ rahul:

1: jupp habe den oszillator mit dem quartz verwechselt => sry
2. eigentlich logisch
3. stimmt wohl :-)

=> dann noch ein schönes we

von Johann (Gast)


Lesenswert?

Hallo @ all

Ich möchte 2 Bytes über die SPI-Schnittstelle übertragen. Jedoch wenn 
ich die SPI-Clock-Leitung messe, dann sind 10 Takte zwischen der 
Übertragung des 1. Bytes und der Übertragung des 2. Bytes pause.

// 1. Byte übertragen
SPDR = 0x01;
//warten bis das 1. Byte übertragen ist
while(!(SPSR & 0x80));

Hier zwichen ist eine lange Pause. Ich denke mal das der Whilevergleich 
einfach zu lange dauert. Gibt es da keine bessere Alternative die nicht 
so lange dauert?

// 2. Byte übertragen
SPDR = 0x01;
// warten bis 2. Byte übertragen wude
while(!(SPSR & 0x80));

von (prx) A. K. (prx)


Lesenswert?

Warum einen uralten Thread hijacken?

von Johann (Gast)


Lesenswert?

Wollte einen neuen aufmachen. ^^

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.