Forum: Mikrocontroller und Digitale Elektronik WS2812 Ansteuerung mit SPI


von Martin S. (drunkenmunky)


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?

von Martin H. (disjunction)


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

von Martin H. (disjunction)


Lesenswert?

Im Datenblatt des WS2811 sind diese Zeiten für 1 und 0 gleich (2,5µs bzw 
1,25µs)

von rumpelrausch (Gast)


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.

von Max H. (hartl192)


Lesenswert?

Martin S. schrieb:
> Hat schon jemand die LEDs über SPI angesteuert?
Ja, hier zum Beispiel: Beitrag "[ASM & C] PIC12/PIC18/PIC24 WS2812 SPI Library"

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.