Forum: Mikrocontroller und Digitale Elektronik LPC SPI (SSP Interface) erzeugen


von Lars (Gast)


Lesenswert?

Hi,

ich versuche gerade beim LPC1758 ein gültiges SPI Signal zu erzeugen via 
SSP Interface. Das Clocksignal kann ich zwar sehen, allerdings ist 
dessen Amplitude bei 1.2V und nicht bei 3V3. Ansonsten würde es sauber 
aussehen. Einen externen Pullup hab ich nicht installiert.

Meine Init sieht folgendermaßen aus:
1
    /* Enable SSPI0 block */
2
    LPC_SC->PCONP |= (1 << 21);
3
    
4
    /* Set SSEL0 as GPIO, output high */
5
    LPC_PINCON->PINSEL1 &= ~(3 << 0);          /* Configure P0.16(SSEL) as GPIO */
6
    LPC_GPIO0->FIODIR |= (1 << 16);            /* set P0.16 as output */
7
    
8
9
    /* Configure other SSP pins: SCK, MISO, MOSI */
10
    LPC_PINCON->PINSEL0 &= ~(3UL << 30);
11
    LPC_PINCON->PINSEL0 |=  (2UL << 30);          /* P0.15: SCK0 */
12
    LPC_PINCON->PINSEL1 &= ~((3<<2) | (3<<4));
13
    LPC_PINCON->PINSEL1 |=  ((2<<2) | (2<<4));  /* P0.17: MISO0, P0.18: MOSI0 */
14
    
15
    /* Configure SSP0_PCLK to CCLK(100MHz), default value is CCLK/4 */
16
    LPC_SC->PCLKSEL1 &= ~(3 << 10);
17
    LPC_SC->PCLKSEL1 |=  (1 << 10);  /* SSP0_PCLK=CCLK */
18
19
  /* 8bit, SPI frame format, CPOL=0, CPHA=0, SCR=0 */   
20
  LPC_SSP0->CR0 = (0x07 << 0) |     /* data width: 8bit*/
21
                    (0x00 << 4) |     /* frame format: SPI */
22
                    (0x00 << 6) |     /* CPOL: low level */
23
                    (0x00 << 7) |     /* CPHA: first edge */
24
                    (0x00 << 8);      /* SCR = 0 */
25
26
27
    /* Enable SSP0 as a master */
28
    LPC_SSP0->CR1 = (0x00 << 0) |   /* Normal mode */
29
                    (0x01 << 1) |   /* Enable SSP0 */
30
                    (0x00 << 2) |   /* Master */
31
                    (0x00 << 3);    /* slave output disabled */
32
33
    /* Configure SSP0 clock rate to 400kHz (100MHz/250) */
34
    SPI_ConfigClockRate (SPI_CLOCKRATE_LOW);
35
36
    /* Set SSEL to high */
37
    SPI_CS_High ();
38
39
    /* ************* Daten senden ******************** */
40
    SPI_CS_Low();
41
42
    SPI_SendByte (0x88);

Gruß
Lars

von Snr (Gast)


Lesenswert?

Hängt der Slave bereits dran? Vergleich liegt es an dem? Mal testweise 
wegmachen...

von Lars (Gast)


Lesenswert?

hab ich mir auch gerade gedacht, als ich den Text abgeschickt hatte. Als 
Slave hab ich einen Buffer/Driver (um von 3V3 auf 5V zu kommen) 
installiert

http://www.ti.com/lit/ds/symlink/sn74lvc07a.pdf

Die Ausgänge haben alle einen Pullup, bei den Eingängen hab ich nichts 
gemacht.

von Lars (Gast)


Lesenswert?

muss irgendwie anscheinend doch mit dem LPC zusammenhängen, weil wenn 
ich die Pins als I/O konfiguriere und auf High setze, dann hab ich 3V3. 
Normalerweise benötigt man beim SPI ja keine Pullups, weil der Prozessor 
es selbst schon integriert hat.

von Lars (Gast)


Lesenswert?

noch ein kleiner Test. Hab die Clock (SPI) so eingestellt, dass das 
Signal auf Highlevel gezogen wird, wenn nichts gesendet wird. Dieser 
Highlevel ist dann auch 3V3. Sobald aber was über SPI gesendet werden 
soll beträgt der Highlevel nur noch 1.3V ungefähr.

von Lars (Gast)


Lesenswert?

Hat noch irgendwer von euch ne Idee? Hab alles vom SPI-Bus entfernt und 
hab das gleiche Bild. Anschließend hab ich auch versucht einen Pullup zu 
installieren -> brachte aber auch keinen Erfolg.

Das Clk-Signal sieht gut aus, allerdings ist der Highpegel wie gesagt 
bei 1.3V statt bei 3V3. Wenn kein CLK Signal übertragen wird (und CPOL = 
1 gesetzt wurde) liegt das Signal bei 3V3.

Beim MOSI Signal hab ich das gleiche Szenario. Momentan weiß ich leider 
nicht mehr weiter. Ich hoffe von euch hat noch jmd ne Idee.

Gruß
Lars

von Erwin R. (er-tronik)


Lesenswert?

Da ich den SPI0 bei meinen Schaltungen selber sehr häufig benutze, habe 
ich mir dein Listing mal vorgenommen, es sieht eigentlich sehr gut aus, 
daran ist nichts auszusetzen. Mir scheint es, als wenn Du eventuell 
einen Kurzschluß zwischen zwei Controllerpins hast, vielleicht SCK und 
MOSI, mess das mal mit einem Ohmmeter durch. Ich hab auch schon so 
manches Mal verzweifelt nach Fehlern in der Soft gesucht und am Ende war 
es eine kaum zu erkennende Verbindung zwischen zwei Pins.

Erwin

von Snr (Gast)


Lesenswert?

Erwin Reuss schrieb:
> mess das mal mit einem Ohmmeter durch. Ich hab auch schon so
> manches Mal verzweifelt nach Fehlern in der Soft gesucht und am Ende war
> es eine kaum zu erkennende Verbindung zwischen zwei Pins.

Lars schrieb:
> muss irgendwie anscheinend doch mit dem LPC zusammenhängen, weil wenn
> ich die Pins als I/O konfiguriere und auf High setze, dann hab ich 3V3.

Dann müsste er aber bei seinem oben beschriebenen Vorgehen immer nur 
einen Pin als Ausgang definiert haben oder beide gleichzeitig auf 
High/Low gesetzt haben. Ansonsten hätte es da auch einen Kurzschluss 
gegeben...aber sowas oder ein Defekt der angeschlossenen Perepherie war 
auch mein erster Gedanke.

Hast Du schonmal den Pin belastet wenn Du ihn auf High gesetzt hast?
Evtl. ist auch bei Deinem Pegelwandler was falsch angeschlossen und hast 
Dir die Pins geschossen?

Pullup/Pulldown sind beide aus?

Grüße

von Jim M. (turboj)


Lesenswert?

1
/* Configure SSP0_PCLK to CCLK(100MHz), default value is CCLK/4 */
2
    LPC_SC->PCLKSEL1 &= ~(3 << 10);
3
    LPC_SC->PCLKSEL1 |=  (1 << 10);  /* SSP0_PCLK=CCLK */

Errata beachten - wenn die Kommentare stimmen tut das nicht so wie Du 
willst. 100 MHz gehen nur mit eingeschalteter PLL und dann kann PCLKSEL 
nicht mehr verändert werden.

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.