Forum: Projekte & Code TI-Launchpad LM4F120: WS2812 driver demo with SPI-DMA


von Pit S. (pitschu)


Angehängte Dateien:

Lesenswert?

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

von Tim  . (cpldcpu)


Lesenswert?

Ergänze das doch mal im Wiki-Artikel:
http://www.mikrocontroller.net/articles/WS2812_Ansteuerung

von Ben W. (ben_w)


Lesenswert?

hey klasse
bin auch dabei sowas gerade auf dem STM32F4 zu realisieren
schön zu sehen das es prinzipiell möglich ;)

von Frieder S. (frsc)


Lesenswert?

Ben W. schrieb:
> bin auch dabei sowas gerade auf dem STM32F4 zu realisieren

Wie weit bist du damit? Ich würde mich für die DMA/SPI Lösung auf dem 
STM32 interessieren. Also falls du von deinen Erfahrungen berichten 
könntest wäre das super...
Danke!

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.