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. (jojos)


Angehängte Dateien:

Bewertung
0 lesenswert
nicht 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)


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

von Johannes S. (jojos)


Bewertung
0 lesenswert
nicht 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. (jojos)


Angehängte Dateien:

Bewertung
0 lesenswert
nicht 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)


Bewertung
0 lesenswert
nicht 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. (jojos)


Bewertung
0 lesenswert
nicht 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 :-/

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
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.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.