LPC SPI (SSP Interface) erzeugen

Gast #2573566
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
Gast #2573630
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.
Gast #2573656
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.
Gast #2573821
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
#2574440
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
Gast #2574604
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
#2574693
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.

Antwort schreiben

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.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.