Forum: Mikrocontroller und Digitale Elektronik LPC2138 SPI Problem


von Christian J. (elektroniker1968)


Lesenswert?

Hallo,

ich mache doch mal einen neuen Beitrag auf.

Was tickt bloss mit der SPI0 am LPC2138 nicht richtig?

Sie soll als Master für die SD Karte arbeiten. Setze ich den SSEL0 Pin 
im PINSEL0 Register auf GPIO nimmt sie auch Daten an und verschickt 
diese wie auf dem Oszi zu sehen ist. Takt, Daten ... alles da. Auch die 
Karte reagiert, nur leider nicht mit 0x01 sondern immer 0 obwohl auf dem 
Oszi was zu sehen ist. Das löse ich später...

Setze ich aber den SSEL0 Pin auf SS_SLAVE, also aktiviere seine 
eigentliche Slave Select Funktion im PINSEL0, dann bleibt das Programm 
bei dem Versenden eines Bytes hängen und zwar dort wo ich den Status 
abfrage ob die SPI frei ist. Die hat ja keinen Buffer sondern man sendet 
direkt ins Shift Register.
Die SPI0 läuft nur, wenn ich SSEL0 als normlen GPIO definiere. Ich stehe 
da etwas in Kollision mit Ulrich Radigs Lösung, die ja ausddrücklich 
darauf hinweist, dass SSEL gsetzt werden muss.

Meinen Chipselect für die SD lasse ich jetzt übeer einen anderen Pin 
laufen, der Sicherheit halber, weil ich mit dem SSEL so diese Sorgen 
habe.

Hat da keiner eine Lösung?

Gruss,
Christian

von Christian J. (elektroniker1968)


Lesenswert?

Anbei der Code.... der SPI_SS_PIN ist der von der SPI, der SPI-CS_PIn 
ist mein eigener Chipselect. Mit CPOL und CPHA habe ich auch alle 
Kombinationen durch :-(
1
void if_spiInit(hwInterface *iface)
2
{
3
  euint8 i;
4
5
  DBG((TXT("SPI(0) init...\n")));
6
7
  // Datenrichtungen für GPIO Ausgänge und Eingänge setzen
8
  SPI_IODIR |= (1<<SPI_SCK_PIN)|(1<<SPI_MOSI_PIN)|(1<<SPI_SS_PIN) | (1<<SPI_CS_PIN);
9
  SPI_IODIR &= ~(1<<SPI_MISO_PIN);
10
11
        UNSELECT_CARD();
12
13
  // Pin-Functionen rücksetzen auf 00 (Anm.: 00 = ~03)
14
  SPI_PINSEL &= ~( (3<<SPI_SCK_FUNCBIT) | (3<<SPI_MISO_FUNCBIT) |
15
    (3<<SPI_MOSI_FUNCBIT) | (3<<SPI_SS_FUNCBIT) );
16
17
        // Funktion der Pins als SPI0 definieren, auch SSEL !
18
        SPI_PINSEL |= ( (1<<SPI_SCK_FUNCBIT) | (1<<SPI_MISO_FUNCBIT) |
19
    (1<<SPI_MOSI_FUNCBIT)); // | (1<<SPI_SS_FUNCBIT) );
20
21
         // SPI als Master betreiben, Active HIGH Clock
22
  S0SPCR = (1<<MSTR)|(0<<CPOL)|(0<<CPHA);
23
24
  // kleine Geschwindigkeit bei Init der Karte
25
  if_spiSetSpeed(254);
26
        my_if_spiSend(iface,0xff);
27
28
}

von Mario P. (mariopieschel)


Lesenswert?

Hallo  Christian,
Laut Datenblatt vom LPC2138 unterstützt dieser den SSELx-Pin nur im 
Slave-Mode, da er nur ein Eingang ist wenn dieser Pin im PINSELx 
aktiviert ist. Und im Master-Mode ist ja ein Ausgang nötig.

Datenblatt Seite 9:

P0.7/SSEL0/PWM2/EINT2
I SSEL0 — Slave Select for SPI0. Selects the SPI interface as a slave.
O PWM2 — Pulse Width Modulator output

Im Usermanual wird das wohl sehr undurchsichtig dargestellt.

Nimm einfach Deine erst Variante mit dem GPIO-Pin.

Ich habe die SPI-Schnittstelle auch immer so betrieben. Es ist natürlich 
verwunderlich, dass die SPI-Schnittstelle plötzlich nicht mehr geht wenn 
der SSEL-Pin in PINSELx aktiviert wird. Ich habe leider genau die 
gleiche (zeitraubende) Erfahrung machen müssen.

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.