Forum: Mikrocontroller und Digitale Elektronik MSP430 SPI Fehler


von JonHendrik (Gast)


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
}

von Rufus Τ. F. (rufus) Benutzerseite


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.

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.