Forum: Mikrocontroller und Digitale Elektronik Problem mit SPI


von Sigfried (Gast)


Angehängte Dateien:

Lesenswert?

Hallo!

Ich habe ein kleines Problem mit dem SPI. Ich versuche ein L3G4200D 
Gyroskop auszulesen. Dazu verwende ich zunächst ein Register in dem eine 
ID gespeichert ist, damit ich immer einen satischen Wert habe und sehe, 
ob er das Richtige ausliest.
Eigentlich soll "D3" zurückgegeben werden. Leider kommt jedoch nur ein 
anderer Wert, der zwar jeweils der Bitfolge entspricht, allerdings um 
ein Bit nach Links oder Rechts verschoben ist. "D3" habe ich schon 
einmal aus ihm herausbekommen, allerdings nur als ich die an Phase und 
Polarität so gedreht habe, dass es nicht mit den Werten im Datenblatt 
übereinstimmt.

Hat jemand eine Idee?
Danke!

von h_ (Gast)


Lesenswert?

Hallo,

vielleicht ist das DB falsch? Vielleicht sind Polarität und Phase 
invertiert angegeben, vielleicht auch invertiert im Mikrokontroller 
implementiert, so dass man anscheinend falsche  (in Wirklichkeit sind 
sie nur kontraintuitiv) Werte einstellen muss.

von h_ (Gast)


Lesenswert?

Ich habe gerade einen Blick ins DB geworfen. Laut DB ist die Clock 
idle-high. Das ist bei deinem Screenshot aber nicht der Fall. Oder ist 
es das Bild, wo es mit den falschen Einstellungen geklappt hat? 
Vielleicht Interpretiere ich das Oszi-Bild aber auch nur falsch.
Meine Interpration vom DB wäre, dass sowohl Polarität als auch Phase '1' 
sein müssten.

von Sigfried (Gast)


Lesenswert?

Hallo!

Ich denke es ist noch ein generelles Pronlem mit dem SPI. Ich nutze den 
MSP430F5438 und hier ist mal mein Code zur Config:
1
UCB3CTL1 |= UCSWRST;                                                          // reset UCB3 during setup
2
  UCB3CTL0 |= UCMST  + UCSYNC + UCMODE_2 + UCMSB + UCCKPL;                      // Data is changed on the first UCLK edge and captured on the following edge.
3
                                                                                // The inactive state is high
4
                                                                                // Master mode
5
                                                                                // 4-pin SPI with UCxSTE active low: Slave enabled when UCxSTE = 0
6
                                                                                // Synchronous mode
7
  UCB3CTL1 |= UCSSEL_2;            // Clocksource is SMCLK with 18MHz
8
  UCB3BR0   = 0x0F;                // Speed = SMCLK/4 = 4,5MHz
9
  P10DIR   |= 0xCB;              // P10.0+1+3 are outputs
10
  P10SEL   |= 0x0F;                // Peripheral function activated for Pin 10.0...10.3  
11
  
12
  UCB3CTL1 &= ~UCSWRST;            // restart UCB3
13
  
14
  __delay_cycles(100);

Damit lese ich nun das ID-Register eines ADXL345 aus, allerdings kommen 
auf dem MISO nur die aktuellen Lottozahlen (und beliebige andere, bei 
jedem auslesen) und nicht der Registerwert.

Clock und Phase sind für den ADXL richtig, auch das Timing habe ich 
überprüft.
Hatte jemand schon ähnliche "Symptome" auf seinem Bus? Woran lag es?

von Sigfried (Gast)


Lesenswert?

Achso, der Takt liegt bei 1.8 MHz, steht in dem Kommentar noch als 
4.5MHz.

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

Sigfried schrieb:
> Leider kommt jedoch nur ein anderer Wert, der zwar jeweils der Bitfolge
> entspricht, allerdings um ein Bit nach Links oder Rechts verschoben ist.
Sigfried schrieb:
> Hatte jemand schon ähnliche "Symptome" auf seinem Bus?
Ja.
> Woran lag es?
Falscher SPI-Mode.

Es kann sogar ab&zu funktionieren. Es kann aber auch temperaturabhängig 
und natürlich baustein- und leitungsabhängig sein...

> Clock und Phase sind für den ADXL richtig, auch das Timing habe
> ich überprüft.
Mit dem Oszi?
> Achso, der Takt liegt bei 1.8 MHz
Wie sieht das Signal am Baustein aus? Überschwinger?

von Sigfried (Gast)


Lesenswert?

Die Modes habe ich schon alle durchprobiert. Ebenso wie verschiedene 
Taktraten. Das Timing habe ich mit dem Oszi überprüft.

Teilweise funktioniert das SPI, allerdings nur, wenn ich ein Byte 
abfrage, wenn ich mehrere Register auslesen oder beschreiben will, kommt 
es zu Fehlern...

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.