mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik LPC2138 SPI Problem


Autor: Christian J. (elektroniker1968)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Christian J. (elektroniker1968)
Datum:

Bewertung
0 lesenswert
nicht 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 :-(
void if_spiInit(hwInterface *iface)
{
  euint8 i;

  DBG((TXT("SPI(0) init...\n")));

  // Datenrichtungen für GPIO Ausgänge und Eingänge setzen
  SPI_IODIR |= (1<<SPI_SCK_PIN)|(1<<SPI_MOSI_PIN)|(1<<SPI_SS_PIN) | (1<<SPI_CS_PIN);
  SPI_IODIR &= ~(1<<SPI_MISO_PIN);

        UNSELECT_CARD();

  // Pin-Functionen rücksetzen auf 00 (Anm.: 00 = ~03)
  SPI_PINSEL &= ~( (3<<SPI_SCK_FUNCBIT) | (3<<SPI_MISO_FUNCBIT) |
    (3<<SPI_MOSI_FUNCBIT) | (3<<SPI_SS_FUNCBIT) );

        // Funktion der Pins als SPI0 definieren, auch SSEL !
        SPI_PINSEL |= ( (1<<SPI_SCK_FUNCBIT) | (1<<SPI_MISO_FUNCBIT) |
    (1<<SPI_MOSI_FUNCBIT)); // | (1<<SPI_SS_FUNCBIT) );

         // SPI als Master betreiben, Active HIGH Clock
  S0SPCR = (1<<MSTR)|(0<<CPOL)|(0<<CPHA);

  // kleine Geschwindigkeit bei Init der Karte
  if_spiSetSpeed(254);
        my_if_spiSend(iface,0xff);

}

Autor: Mario Pieschel (mariopieschel)
Datum:

Bewertung
0 lesenswert
nicht 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.

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
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.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.