MSP430 SPI sendet in falscher Reihenfolge -> LSB zuerst

OP #3117434
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
Gast #3117461
debugge was hier rauskommt, und ob ucmsb wirklich gesetzt ist
>    UCB0CTL0 = UCCKPH + UCMSB + UCMST + UCMODE_0 + UCSYNC; //mode(0,0)
alternativ:
invertiere UCMSB
Gast #3117484
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?
OP #3117540
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.
OP #3117557
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 ;)

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 13 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.