driver for WS2812B LED, modified for better compatibility with LPC812 and LPC1549

Dependencies:   BurstSPI

Dependents:   RGB-balls cylon

Fork of wsDrive by Andy A

Committer:
AndyA
Date:
Wed Nov 05 16:47:48 2014 +0000
Revision:
0:b3665f91bedc
Child:
3:3c48065d20ff
Initial commit. Seems to work for me, needs more comments/documentaion

Who changed what in which revision?

UserRevisionLine numberNew contents of line
AndyA 0:b3665f91bedc 1 #include "wsDrive.h"
AndyA 0:b3665f91bedc 2
AndyA 0:b3665f91bedc 3 wsDrive::wsDrive(PinName mosi, PinName miso, PinName clk) : BurstSPI(mosi,miso,clk)
AndyA 0:b3665f91bedc 4 {
AndyA 0:b3665f91bedc 5 frequency(2400000);
AndyA 0:b3665f91bedc 6 format(12);
AndyA 0:b3665f91bedc 7 pixArray = NULL;
AndyA 0:b3665f91bedc 8 pixelLen = 0;
AndyA 0:b3665f91bedc 9 }
AndyA 0:b3665f91bedc 10
AndyA 0:b3665f91bedc 11 void wsDrive::setData(pixelInfo *dataStart, uint16_t dataLen)
AndyA 0:b3665f91bedc 12 {
AndyA 0:b3665f91bedc 13 pixArray = dataStart;
AndyA 0:b3665f91bedc 14 pixelLen = dataLen;
AndyA 0:b3665f91bedc 15 }
AndyA 0:b3665f91bedc 16
AndyA 0:b3665f91bedc 17 void wsDrive::sendData()
AndyA 0:b3665f91bedc 18 {
AndyA 0:b3665f91bedc 19 frequency(2400000);
AndyA 0:b3665f91bedc 20 format(12);
AndyA 0:b3665f91bedc 21 setFormat();
AndyA 0:b3665f91bedc 22
AndyA 0:b3665f91bedc 23
AndyA 0:b3665f91bedc 24 uint16_t pixIndex = 0;
AndyA 0:b3665f91bedc 25 while (pixIndex < pixelLen) {
AndyA 0:b3665f91bedc 26 sendPixel(pixArray + pixIndex++);
AndyA 0:b3665f91bedc 27 }
AndyA 0:b3665f91bedc 28 }
AndyA 0:b3665f91bedc 29
AndyA 0:b3665f91bedc 30 // each bytes sent as two 12 bit messages (3 bits of data per LED bit).
AndyA 0:b3665f91bedc 31 void wsDrive::sendByte(unsigned char value)
AndyA 0:b3665f91bedc 32 {
AndyA 0:b3665f91bedc 33
AndyA 0:b3665f91bedc 34 uint16_t dataToSend = 0;
AndyA 0:b3665f91bedc 35
AndyA 0:b3665f91bedc 36 uint8_t mask = 0x80;
AndyA 0:b3665f91bedc 37 while (mask) {
AndyA 0:b3665f91bedc 38 dataToSend += (value & mask)?0x06:0x4; // 100 for a 0 or 110 for a 1
AndyA 0:b3665f91bedc 39 if (mask & 0x11) { // trans
AndyA 0:b3665f91bedc 40 fastWrite(dataToSend);
AndyA 0:b3665f91bedc 41 dataToSend = 0;
AndyA 0:b3665f91bedc 42 }
AndyA 0:b3665f91bedc 43 dataToSend = dataToSend << 3;
AndyA 0:b3665f91bedc 44 mask = mask >> 1;
AndyA 0:b3665f91bedc 45 }
AndyA 0:b3665f91bedc 46 }
AndyA 0:b3665f91bedc 47
AndyA 0:b3665f91bedc 48 void wsDrive::sendPixel(pixelInfo *pixToSend)
AndyA 0:b3665f91bedc 49 {
AndyA 0:b3665f91bedc 50 sendByte(pixToSend->G);
AndyA 0:b3665f91bedc 51 sendByte(pixToSend->R);
AndyA 0:b3665f91bedc 52 sendByte(pixToSend->B);
AndyA 0:b3665f91bedc 53 }
AndyA 0:b3665f91bedc 54