WS2812 Ansteuerung mit SPI

OP #3285284
Lesenswert?

Servus,

Hat schon jemand die LEDs über SPI angesteuert?

Wie ist hier die Vorgehensweise? Stellt man z.B. für 400kbit/s  einen 
SPI Clock Takt von 3,2MHz ein, damit man mit einem Byte vom SPI ein Bit 
für die LED erzeugen kann?

Und dann sendet man für eine Null 0xC0 und für eine Eins 0xF0, oder wie?
#3285310
Lesenswert?

Könnte ich mir vorstellen, auch über Uart, da es eine asynchrone 
Schnittstelle ist. Solange Du kein RET code erzeugst wenn du nicht am 
Ball bleibst. Sonst bleibt Dir auch noch Output compare.
Ich weiß ja nicht ob ich da richtig rechne, aber die Bitzeiten sind auch 
unterschiedlich 1.15µs für ne 0 und 1,3µs für ne 1
Gast #3554052
Lesenswert?

Ja, das geht. Habe es gerade mit einem STM8S105 hinbekommen; Das 
Discovery-Board wird ja gerade als Promo-Hardware für die beiden 
kommerziellen Compiler verschleudert (irgenwas um 8 Örö).

UARTs sind meist nicht geeignet, da sie im asynchronen Betrieb Start- 
und Stopbits einfügen. Das passt nicht zum Protokoll des WS2812.

Der Trick mit SPI liegt darin, für jedes Bit, das an die WSS2812-Kette 
gesendet werden soll, drei Bits aus dem SPI-Schieberegister zu senden. 
Das erste Bit ist immer 1, dann folgt das "Nutzdatenbit" und als drittes 
eine 0. Diese Dreierkette nenne ich jetzt mal "Triplet".
Eine LED wird mit drei Bytes zu je drei Triplets übertragen, also werden 
pro LED insgesamt 9 Bytes benötigt.

Der Datenstrom am SPI-MOSI-Pin darf nicht unterbrochen werden. Diese 
SPI-Lösung funktioniert daher nur mit Controllern, die für das 
SPI-Senderegister einen Puffer verwenden. Bei den STMs ist das der Fall. 
Sobald der SPI-Block meldet, dass das Register beschreibbar ist, muss 
das nächste Byte übergeben werden. Das funktioniert am besten, wenn 
sämtliche Triplets bereits im RAM aufbereitet vorliegen. Dadurch steigt 
der Speicherbedarf zwar auf das Dreifache, aber im Fall des STM8S105 
reicht's noch immer locker für 150 LEDs.

Die Dinger reagieren in einem recht weiten Timingbereich. Laut 
Datenblatt wird ein Bit in 1,25us +/- 600ns erwartet. Das sind 0,65us - 
1,84us oder 544KHz - 1,53MHz. Da wir Triplets benötigen, steht für einen 
Takt am SPI-Schieberegister nur ein Drittel dieser Zeit zur Verfügung. 
Bei 2MHz SPI-Takt sind das 1,5us pro Bit, also noch gut innerhalb der 
Spezifikation. 2MHz lassen sich prima mit den üblichen Prescalern aus 
8MHz oder 16MHz teilen. Bei meinen ersten Versuchen habe ich einen 
Timerausgang mit dem SPI-Eingang verbunden, um per PWM möglichst nach an 
die 800KHz heranzukommen - völlig unnötig, wie sich herausgestellt hat. 
Die Teile sind gutmütiger, als es gemeinhin dargestellt wird.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren