Forum: Mikrocontroller und Digitale Elektronik LPC1788: Wie kriege ich SSP1 ans Laufen?


von Thomas B. (Firma: Druckerei Beste) (virtupic)


Lesenswert?

Hi!

Mein Board hat einen LPC1788. An SSP0 hängt ein ADC, der funktioniert. 
Jetzt will ich externes Flash und EEPROM an SSP1 ans Rattern bringen.

Code sieht folgendermaßen aus (leicht aufbereitet):

LPC_SSP_T *ssp = LPC_SSP1;
Chip_SSP_Init(ssp);
Chip_SSP_SetBitRate(ssp, 30000000);
Chip_IOCON_PinMuxSet(LPC_IOCON, 0, 7, (IOCON_FUNC2 | IOCON_MODE_INACT));
Chip_IOCON_PinMuxSet(LPC_IOCON, 0, 8, (IOCON_FUNC2 | IOCON_MODE_INACT));
Chip_IOCON_PinMuxSet(LPC_IOCON, 0, 9, (IOCON_FUNC2 | IOCON_MODE_INACT));
Chip_SSP_SetFormat(ssp, SSP_BITS_8, SSP_FRAMEFORMAT_SPI, 
SSP_CLOCK_CPHA0_CPOL0);
Chip_SSP_SetMaster(ssp, 1);
Chip_SSP_Enable(ssp);

Mit SSP0 funktioniert dieses Setup, mit SSP1 nicht. Mein Oszi zeigt 
keine Signale auf SCLK, MISO oder MOSI.

Vielen Dank!
Thomas

von Jim M. (turboj)


Lesenswert?

Hast Du den SSP1 via SC->PCONP Register eingeschaltet? Der ist IIRC per 
default aus.

von Thomas B. (Firma: Druckerei Beste) (virtupic)


Lesenswert?

Jim M. schrieb:
> Hast Du den SSP1 via SC->PCONP Register eingeschaltet? Der ist IIRC per
> default aus.

Das User Manual sagt in "21.1 Basic Configuration":

"Remark: On reset, SSP interfaces 0 and 1 are enabled (PCSSP0/1 = 1), 
while SSP2 is disabled (PCSSP2 = 0)."

Habe es trotzdem mal probiert, macht keinen Unterschied. (Obwohl es 
irgendwie nach genau diesem Grund aussieht...)

von michi099 (Gast)


Lesenswert?

Ist der IOCON-Takt aktiv?
Chip_Clock_EnablePeriphClock(SYSCTL_CLOCK_IOCON);

Mfg
michael

von Thomas B. (Firma: Druckerei Beste) (virtupic)


Lesenswert?

michi099 schrieb:
> Chip_Clock_EnablePeriphClock(SYSCTL_CLOCK_IOCON);

Hmm... Meine LPCOpen Lib auf dem LPC1788 kennt keinen 
SYSCTL_CLOCK_IOCON. Für mich sieht es so aus, dass bei diesem Fehler 
SSP0 auch nicht funktionieren dürfte. (?)

Wenn ich Chip_Clock_EnablePeriphClock(SYSCTL_CLOCK_SSP1) probiere, dann 
ändert das auch nichts.

von michi099 (Gast)


Lesenswert?

> SYSCTL_CLOCK_IOCON. Für mich sieht es so aus, dass bei diesem Fehler
> SSP0 auch nicht funktionieren dürfte. (?)

Ist richtig, habe mir das UserManual vorher nicht angesehen, war nur ein 
Versuch. Bei diesem Conroller ist der Takt für IOCON bereits nach dem 
Reset aktiviert (Seite 26 im UM):
15 PCGPIO Power/clock control bit for IOCON, GPIO, and GPIO interrupts. 
1

Interessanterweise gilt das nicht für:
10         PCSSP1        SSP 1 interface power/clock control bit. 0
21         PCSSP0        SSP0 interface power/clock control bit. 0

obwohl wie von dir Zitiert eigentlich auch das Gegenteil behauptet wird!

Trotzdem kann das power/clock control bit nicht Ursache des Übels sein, 
da 1. SSP0 ja funktioniert und 2. dieses Bit mit Chip_SSP_Init() gesetzt 
wird.

Mfg
michael

von Thomas B. (Firma: Druckerei Beste) (virtupic)


Lesenswert?

...und es kommt noch besser. Nicht nur, dass sich das User Manual 
anscheinend selbst widerspricht. Ich habe da einen weiteren Tipp 
bekommen: In table 89 (Type W IOCON register) im Manual steht zu Bit 7:

"Note: this bit must be set to 1 for normal operation."

Da frage ich mich, warum überhaupt irgendwelche IO-operationen 
funktionieren. Die Bits 7 waren in der Tat gelöscht (von 
Chip_IOCON_PinMuxSet), aber setzen half auch nix.

Gibt es weitere Vorschläge?
Thomas

von Thomas B. (Firma: Druckerei Beste) (virtupic)


Lesenswert?

Neue Beobachtung: Zwei Pins werden für CS im GPIO Modus benutzt und 
arbeiten wie gewünscht. Ich habe die SSP Pins jetzt mal als GPIO 
Ausgänge konfiguriert und triggere sie in der Hoffnung, eine 
Rechteckfunktion auf dem Oszi zu sehen:

 Chip_GPIO_SetPinDIROutput(LPC_GPIO, 0, 5);
 Chip_GPIO_SetPinDIROutput(LPC_GPIO, 0, 6);
 Chip_GPIO_SetPinDIROutput(LPC_GPIO, 0, 7);
 Chip_GPIO_SetPinDIROutput(LPC_GPIO, 0, 8);
 Chip_GPIO_SetPinDIROutput(LPC_GPIO, 0, 9);
 Chip_IOCON_PinMuxSet(LPC_IOCON, 0, 5, 1 << 7);
 Chip_IOCON_PinMuxSet(LPC_IOCON, 0, 6, 1 << 7);
 Chip_IOCON_PinMuxSet(LPC_IOCON, 0, 7, 1 << 7);
 Chip_IOCON_PinMuxSet(LPC_IOCON, 0, 8, 1 << 7);
 Chip_IOCON_PinMuxSet(LPC_IOCON, 0, 9, 1 << 7);
 while (1)
 {
    vTaskDelay(1); // FreeRTOS delay by 1 ms
    Chip_GPIO_SetPinOutLow(LPC_GPIO, 0, 5);
    Chip_GPIO_SetPinOutLow(LPC_GPIO, 0, 6);
    Chip_GPIO_SetPinOutLow(LPC_GPIO, 0, 7);
    Chip_GPIO_SetPinOutLow(LPC_GPIO, 0, 8);
    Chip_GPIO_SetPinOutLow(LPC_GPIO, 0, 9);
    vTaskDelay(1); // FreeRTOS delay by 1 ms
    Chip_GPIO_SetPinOutHigh(LPC_GPIO, 0, 5);
    Chip_GPIO_SetPinOutHigh(LPC_GPIO, 0, 6);
    Chip_GPIO_SetPinOutHigh(LPC_GPIO, 0, 7);
    Chip_GPIO_SetPinOutHigh(LPC_GPIO, 0, 8);
    Chip_GPIO_SetPinOutHigh(LPC_GPIO, 0, 9);
  }

Aber nix is. Ich kriege 500 Hz an Port 0 Pins 5 und 6 aber die anderen 
schalten nur einmal bei Booten von high auf low, wohl wegen Pull Ups.

von Jim M. (turboj)


Lesenswert?

Thomas B. schrieb:
> Ich kriege 500 Hz an Port 0 Pins 5 und 6 aber die anderen
> schalten nur einmal bei Booten von high auf low, wohl wegen Pull Ups.

Dann schau Dir mal im Debugger die ganzen Pin Config Register an. Wenn 
die Pins nicht auf GPIO Funktionen reagieren, dann stehen sie auf 
irgendeiner Hardware Funktion.

Hängt da eventuell noch irgendwelche externe Hardware dran (Schaltplan)?

von Thomas B. (Firma: Druckerei Beste) (virtupic)


Lesenswert?

Jim M. schrieb:
> Thomas B. schrieb:
>> Ich kriege 500 Hz an Port 0 Pins 5 und 6 aber die anderen
>> schalten nur einmal bei Booten von high auf low, wohl wegen Pull Ups.
>
> Dann schau Dir mal im Debugger die ganzen Pin Config Register an. Wenn
> die Pins nicht auf GPIO Funktionen reagieren, dann stehen sie auf
> irgendeiner Hardware Funktion.
>
> Hängt da eventuell noch irgendwelche externe Hardware dran (Schaltplan)?

Die GPIO-Ansteuerung habe ich inzwischen im Griff. Es gibt da ein "fast 
GPIO port mask register" (User Manual 8.5.1.2). Seit ich das passend 
modifiziert habe klappt es. Aber auf SSP1 wirkt es sich nicht aus.

Externe Hardware sind ein Flash und ein EEPROM an eben diesem SSP und 
Bits 5 und 6 für CS.

Also bin ich keinen Schritt weiter.

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.