MSP430 SPI Fehler

Gast #5591864
Lesenswert?
• ▲
▼
Hallo,


ich habe an meinem MSP430G2553 ein 74HC595 angeschlossen über die 
UCA-Schnittstelle. Das benutze ich als ein 3-pin, 8-bit Master SPI. Am 
Schieberegister hängen wiederum acht LEDs.
Das senden funktioniert soweit ganz gut, jedoch scheint es, dass die 
übergebene Variable an das TXBUF "verschoben" bei den LEDs wieder 
herauskommt.
Das sieht wie folgt aus:

übergebebenes |       Empfangenes Byte
Byte an TXBUF |       an LEDs

00000000       |      00111111
10000000        |     00000000
11000000        |     00100000
11100000        |     00110000
11110000        |     00111000
11111000       |      00111100
11111100       |      00111110
11111110       |      10111111
11111111       |      11111111

Ich kann dort leider keine Zusammenhang finden, warum sich das 
verschoben hat.

Vielen Dank für eure Hilfe.



Quellcode:
1
#include<msp430.h>
2

3
#define latchPIN BIT5
4
#define serPIN BIT2
5
#define clkPIN BIT4
6

7

8
void WriteData(unsigned char data)
9
{
10
  P1OUT &= ~(latchPIN);
11

12
  while (!(IFG2 & UCA0TXIFG));
13
  UCA0TXBUF = data;
14

15
  P1OUT |= latchPIN;
16
}
17

18

19
int main()
20
{
21
  // stop watchdog-timer
22
  WDTCTL = WDTPW | WDTHOLD;
23

24
  // initialise special-register
25
  P1SEL = serPIN + clkPIN;
26
  P1SEL2 = serPIN + clkPIN;
27

28
  // initialise latchPIN
29
  P1OUT = 0x00;
30
  P1DIR |= latchPIN;
31

32

33
  // SPI configuration
34
  UCA0CTL1 |= UCSWRST;
35

36
  UCA0CTL0 = UCMST + UCSYNC;  // 3-pin, 8-bit SPI master
37
  UCA0CTL0 &= ~(UCCKPH) & ~(UCCKPL);
38
  UCA0CTL1 |= UCSSEL_2;                     // SMCLK
39
  UCA0BR0 |= 0x01;                          // /2
40
  UCA0BR1 = 0;                              //
41
  UCA0MCTL = 0;                             // No modulation
42

43
  UCA0CTL1 &= ~UCSWRST;
44

45

46
  unsigned char data;
47
  volatile int iCount, delay;
48

49

50
  // Hauptschleife
51
  for (;;)
52
  {
53
    data = 0;
54

55
    for (iCount = 7; iCount >= 0; iCount--)
56
    {
57
      // Byte senden
58
      WriteData(data);
59

60
      // SW Delay
61
      delay = 10000;
62
      do delay--;
63
      while(delay != 0);
64

65
      // weiteres bit setzen
66
      data |= (1 << iCount);
67
    }
68

69
    // letztes Byte senden
70
    WriteData(data);
71

72
    // SW Delay
73
    delay = 10000;
74
    do delay--;
75
    while(delay != 0);
76
      }
77

78

79
  return 0;
80
}
Persönliche Seite #5591904
Lesenswert?
• ▲
▼
>  UCA0CTL0 &= ~(UCCKPH) & ~(UCCKPL);

Das bedeutet, daß Daten mit der fallenden Flanke des Takts in das 
Schieberegister übernommen werden.

("MPS430x2xxx Family User's Guide", slau144j.pdf, Seite 442, 16.3.6.1 
"Serial Clock Polarity and Phase", Fig. 16-4)

Wenn ich mir das Datenblatt des '595 ansehe, übernimmt das aber die 
Daten mit der steigenden Flanke des Taktsignals.

(http://www.ti.com/lit/ds/symlink/sn74hc595.pdf, Seite 13, 9.4 "Device 
Functional Modes", Table 1)


Setze das Bit UCCKPH auf 1.

Antwort schreiben

Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt. Bitte hier nur auf die ursprüngliche Frage antworten, für neue Fragen einen neuen Beitrag erstellen.

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.