Forum: Mikrocontroller und Digitale Elektronik MSP430 SPI sendet in falscher Reihenfolge -> LSB zuerst


von Hannes S. (herrhannes)


Lesenswert?

Moin,

hier stehe ich schon wieder mit einem Problem:
1
void spi_init(void)
2
{
3
  WDTCTL = WDTPW + WDTHOLD;       // Stop WDT
4
  //Verwende UCB0, da UCA0 von serieller Kommunkation belegt, UCB0 kann kein UART
5
    /* Disable USCI */
6
    UCB0CTL1 |= UCSWRST;
7
8
    /*
9
     * Control Register 0
10
     *
11
     * ~UCCKPH -- Data is changed on the first UCLK edge and captured on the following edge
12
     * UCCKPL -- Inactive state is high
13
     * UCMSB -- MSB first
14
     * ~UC7BIT -- 8-bit
15
     * UCMST -- Master mode
16
     * UCMODE_0 -- 3-Pin SPI
17
     * UCSYNC -- Synchronous Mode
18
     *
19
     * Note: ~<BIT> indicates that <BIT> has value zero
20
     */
21
    UCB0CTL0 = UCCKPH + UCMSB + UCMST + UCMODE_0 + UCSYNC; //mode(0,0)
22
23
    /*
24
     * Control Register 1
25
     *
26
     * UCSSEL_2 -- SMCLK
27
     * UCSWRST -- Enabled. USCI logic held in reset state
28
     */
29
    UCB0CTL1 = UCSSEL_2 + UCSWRST;
30
31
    /* Bit Rate Control Register 0 */
32
    UCB0BR0 = 2;
33
34
    /* Enable USCI */
35
    UCB0CTL1 &= ~UCSWRST;
36
    //_EINT();                              // Enable interrupts
37
}
38
39
40
void spi_send_char(char c)             // ein einzelnes zeichen über die serielle schnittstelle (USART1) senden
41
{
42
    while (!(IFG2 & UCB0TXIFG));           // warten, bis USART1 TX-buffer sendebereit
43
    UCB0TXBUF = c;
44
45
46
}

Wenn ich nicht vollkommen zu blöd bin mein Oszilloskop abzulesen (nicht 
ganz ausgeschlossen), sendet dieser Code-Schnippsel einen übergebenen 
char mit dem LSB zuerst, also rückwärts. Wieso tut er das?

Gruß
Hannes

von Dennis (Gast)


Lesenswert?

Was ist c?

von Hannes S. (herrhannes)


Lesenswert?

c ist ein char, den ich als hex übergebe.
Im Falle des Auslesen des Statusregisters also zB. 0xa0.

von dummschwaetzer (Gast)


Lesenswert?

UCMSB invertiert?

von Dennis (Gast)


Lesenswert?

Also mal ein Beispiel und noch besser ein Bild vom Ostia.

von Dennis (Gast)


Lesenswert?

Ostia...Sorry, Handy! Vom Oszi natürlich.

von Hannes S. (herrhannes)


Lesenswert?

dummschwaetzer schrieb:
> UCMSB invertiert?

Wie meinst du das?

Edit: Die Header habe ich nicht angerührt.

von dummschwaetzer (Gast)


Lesenswert?

debugge was hier rauskommt, und ob ucmsb wirklich gesetzt ist
>    UCB0CTL0 = UCCKPH + UCMSB + UCMST + UCMODE_0 + UCSYNC; //mode(0,0)
alternativ:
invertiere UCMSB

von Hannes S. (herrhannes)


Lesenswert?

Habe es invertiert. Da kommt derselbe Mist raus.
Dass es wie in falscher Reihenfolge gesendet aussah, war wohl Zufall.

Edit: Ah nee, das stimmt. Habe nur aus Versehen die Triggerflanke 
verstellt oO.
Mache gleich ein Foto.

von Hannes S. (herrhannes)


Angehängte Dateien:

Lesenswert?

So. Da ist das Bild. Wie man leicht erkennt, ist oben der SPI-Takt und 
unten das gesendete Signal.

Edit: Ich habe nun die Invertierung des UCMSB rückgängig gemacht. Et 
voilà, es ist richtig herum. Das ist mir jetzt peinlich.

von Hmm (Gast)


Lesenswert?

Es wäre hilfreich zu wissen, welches Zeichen Du bei dem Aufruf von 
spi_send_char übergeben hast, als Du das Oszilloskop-Bild gemacht hast. 
Meinst Du nicht auch?

von Hannes S. (herrhannes)


Lesenswert?

Das war 0xA1

von Hannes S. (herrhannes)


Lesenswert?

Jetzt kommt vom MCP aber immer noch nur Murks bzw. gar nichts zurück.
Taktausgang funktioniert, VSS und VDD sind angeschlossen.

von Hannes S. (herrhannes)


Lesenswert?

Ziehe ich den SO per Pull-Up auf VDD, sehe ich, dass sobald ein SPI-Takt 
anliegt, der MCP die Spannung auf 0V herunterzieht. Sobald kein SPI-Takt 
mehr gegeben wird, schnurrt die Spannung wieder hoch auf VDD. Das ist 
doch so gewünscht?

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


Lesenswert?

Was ist ein MCP?
Was würdest du erwarten und was kommt?
Warum muss man jedesmal nachfragen?
Scheixx Salamitaktik...

von Hannes S. (herrhannes)


Lesenswert?

Oh Mist.

Ich hätte schwören können, dass ich erwähnt habe, dass ich versuche, mit 
einem MCP2515 zu kommunizieren.

Daher auch der Befehl 0xa0, um das Statusregister auszulesen.
Während ich diesen Befehl sende, sollte (laut Datenblatt) der Ausgang 
auf high-impedance sein (ist er auch) und dann beim Lesen die Daten 
ausgegeben werden. Dabei wird der Ausgang aber nur auf GND gezogen, 
Daten spuckt er nicht aus.

Hoffentlich liegt es nicht daran, dass das Register leer ist, wäre es 
das, wäre die Mühe umsonst.

von Hannes S. (herrhannes)


Lesenswert?

Mist. Offenbar war es das.
An sich funktioniert es nun.
Da kann ich ja beruhigt ins Bettchen gehen, bin schon seit 
Donnerstagmorgen auf den Beinen. Das tut meinen grauen Zellen 
offensichtlich nicht wirklich gut.

Danke an alle, die mir geholfen haben ;)

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.