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
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 | }
|
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.