Zur Ansteuerung der beliebten RGB-Leds auf Basis der WS2811/WS2812 chips
habe ich mal einen Treiber für den Stellaris ARM LM4F120 erstellt. Um
das zeitaufwändige Bit-Banging oder das speicherfressende Timer/DMA
Verfahren zu vermeiden, habe ich mal die SPI Schnittstelle mit DMA
probiert. Das es vorzüglich funktioniert stelle ich es hier mal rein.
Das ausgepackte ZIP kann direkt als Projekt in eclipse importiert
werden. Als Basis habe ich das Standardprojekt des TI-Launchpads
verwendet und entschlackt. Zusätzlich wird natürlich die system lib aus
dem Starterpack gelinkt.
Die Demo läßt einfach eine Lichtspur in zufällig wechselnden Farben über
den RGB-Strip laufen. Über die beiden Taster kann man die Helligkeit in
10 Stufen regeln. Die aktuelle Helligkeit wird als Overlay auf dem strip
angezeigt.
Die Länge des strips muss man in ws2812.h definieren. Er steht jetzt auf
15, da ich das ganze mit einem kurzen Reststück betrieben habe. Es geht
aber jede beliebige Länge für die der Speicher reicht.
Hier ein paar Hinweise zur Funktion:
Zu Erzeugung eines WS2812 konformen Taktsignals wird ein SPI port
verwendet (die SPI ports heißen bei TI SSI port). Standardmäßig wird nur
die SSI2 Senderichtung mit Port PB7 genutzt. TIPP: PB7 habe ich als open
drain eingestellt, da der strip ein 5V Taktsignal will. An PB7 ist
demnach noch ein Widerstand nach +5V vorzusehen, sonst bleibts dunkel.
Der SSI wird mit ca. 3,2Mhz getaktet, wobei jeweils 4 gesendete bits
einem WS2812-Bit entsprechen (so kommt man auf die geforderten 800kHz).
Um ein 0-bit zu senden wird ein 0b1000 übertragen, für ein 1-bit 0b1100.
Jeweils 2 solcher Übertragungen werden zu einem byte zusammengefasst.
Das ganze wird auf Basis der gewünschten RGB Werte vorbereitet und per
DMA an den SSI übergeben. Pro led werden 24 bit benötigt, so dass der
DMA buffer pro led 12 bytes umfasst. Bei den üblichen Timer/PWM Lösungen
ist das i.d.R. deutlich mehr.
Viel Spaß
pitschu