Forum: Mikrocontroller und Digitale Elektronik WS2812 Ansteuerung mit SPI


Announcement: there is an English version of this forum on EmbDev.net. Posts you create there will be displayed on Mikrocontroller.net and EmbDev.net.
von Johannes S. (Gast)


Angehängte Dateien:

Lesenswert?

Ich habe WS2812B LED mit einem LPC1347 per SPI angesteuert. Fertige 
wsDrive von mbed.org, hatte auf Anhieb funktioniert. Dann habe ich das 
Gleiche mit dem LPC812 gemacht, funktioniert nicht. Bei der Fehlersuche 
mit LA viel sofort auf das der MOSI Ruhepegel unterschiedlich ist: beim 
LPC1347 ist er low und die Ansteuerung damit ok, beim LPC812 ist er high 
und das verstehen die LED nicht. Ich habe alle CPOL/CPHA Modi probiert, 
die ändern am MOSI Ruhepegel aber nichts.
Kennt hier jemand die LPC8xx so gut und weiss ob und wie man den MOSI 
Ruhepegel umdrehen kann? Habe dazu im Usermanual nichts finden können.

von Ludwig (Gast)


Lesenswert?

CPOL=1 sollte deine Freund sein. Besteht die Möglichkeit, dass du einen 
Opencollektor/-drain Ausgang hast?

von Johannes S. (Gast)


Lesenswert?

Danke, aber CPOL beeinflusst nur den 'rest state of the clock (between 
transfers)'.
Für die LED Ansteuerung wird nur der MOSI verwendet, der SPI Takt auf 
2,4 MHz gestellt und dann wird ein WS2812 bit aus drei SPI bits 
gebildet.
Damit ist das SPI zweckentfremdet, bei 'bestimmungsgemässen' Gebrauch 
ist der Ruhezustand der MOSI Leitung eigentlich egal.
Open drain sind nur PIO0_10 und _11, die verwende ich nicht. Ansonsten 
kann der MOSI auf einen beliebigen anderen IO Pin gelegt werden.

von Johannes S. (Gast)


Angehängte Dateien:

Lesenswert?

habe es hinbekommen. Die Lib benutzt eine BurstSPI Implementierung die 
für SPI write only ist. Das HW SPI im LPC8xx hat wieder neue Features 
und der Treiber hat nach dem Senden ein EOT Flag gesetzt. Das schaltet 
dann das SPI ab. Für 'richtiges' SPI ok, für WS2812 Ansteuerung nix gut.
1
void BurstSPI::fastWrite(int data) {
2
    while (!(_spi.spi->STAT & (1 << 1)));
3
4
    _spi.spi->TXDAT = (data & 0xffff);
5
    // set receive ignore flag
6
    _spi.spi->TXDATCTL |= (1 << 22);
7
}

Jetzt muss ich nur herausfinden warum meine Endlosschleife im main() 
nach 72s zu Ende ist...

von Harald (Gast)


Lesenswert?

Hat zwar nicht direkt mit deinem Anliegen zu tun, aber kennst Du das 
hier:
https://www.lpcware.com/content/forum/controlling-ws2812-led-strips-lpc810

von Johannes S. (Gast)


Lesenswert?

Ja, Danke.
Das passt schon, benötigt aber zusätzlich den SCT timer als Hardware 
Ressource. Da die SPI Variante mit dem LPC1347 sofort gut funktionierte 
dachte ich das geht auf dem kleinen Bruder 8xx genau so gut. Aber trotz 
gleichem Hersteller ist die SPI Unit doch neuer und nur dann kompatibel 
wenn man es richtig macht :-/

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.