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:
JojoS
Date:
Sun Oct 09 16:49:21 2016 +0000
Revision:
4:c965e448d96b
Parent:
3:3c48065d20ff
Child:
6:270a9728ee29
changed SPI format to mode=1 for better compatiblity, removed setting of format in sendPixel.

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);
JojoS 4:c965e448d96b 6 format(12, 1);
JojoS 4:c965e448d96b 7 //setFormat();
JojoS 4:c965e448d96b 8
AndyA 0:b3665f91bedc 9 pixArray = NULL;
AndyA 3:3c48065d20ff 10 pixArray16 = NULL;
AndyA 0:b3665f91bedc 11 pixelLen = 0;
AndyA 0:b3665f91bedc 12 }
AndyA 0:b3665f91bedc 13
AndyA 0:b3665f91bedc 14 void wsDrive::setData(pixelInfo *dataStart, uint16_t dataLen)
AndyA 0:b3665f91bedc 15 {
AndyA 0:b3665f91bedc 16 pixArray = dataStart;
AndyA 0:b3665f91bedc 17 pixelLen = dataLen;
AndyA 3:3c48065d20ff 18 pixArray16 = NULL;
AndyA 3:3c48065d20ff 19 }
AndyA 3:3c48065d20ff 20
AndyA 3:3c48065d20ff 21 void wsDrive::setData(pixelInfo16 *dataStart, uint16_t dataLen)
AndyA 3:3c48065d20ff 22 {
AndyA 3:3c48065d20ff 23 pixArray16 = dataStart;
AndyA 3:3c48065d20ff 24 pixelLen = dataLen;
AndyA 3:3c48065d20ff 25 pixArray = NULL;
AndyA 0:b3665f91bedc 26 }
AndyA 0:b3665f91bedc 27
AndyA 0:b3665f91bedc 28 void wsDrive::sendData()
AndyA 0:b3665f91bedc 29 {
AndyA 0:b3665f91bedc 30 uint16_t pixIndex = 0;
AndyA 3:3c48065d20ff 31 if (pixArray) {
AndyA 3:3c48065d20ff 32 while (pixIndex < pixelLen) {
AndyA 3:3c48065d20ff 33 sendPixel(pixArray + pixIndex++);
AndyA 3:3c48065d20ff 34 }
AndyA 3:3c48065d20ff 35 } else if (pixArray16) {
AndyA 3:3c48065d20ff 36 while (pixIndex < pixelLen) {
AndyA 3:3c48065d20ff 37 sendPixel(pixArray16 + pixIndex++);
AndyA 3:3c48065d20ff 38 }
AndyA 3:3c48065d20ff 39 }
AndyA 0:b3665f91bedc 40 }
AndyA 0:b3665f91bedc 41
AndyA 0:b3665f91bedc 42 // each bytes sent as two 12 bit messages (3 bits of data per LED bit).
AndyA 0:b3665f91bedc 43 void wsDrive::sendByte(unsigned char value)
AndyA 0:b3665f91bedc 44 {
AndyA 3:3c48065d20ff 45
AndyA 0:b3665f91bedc 46 uint16_t dataToSend = 0;
AndyA 3:3c48065d20ff 47
AndyA 0:b3665f91bedc 48 uint8_t mask = 0x80;
AndyA 0:b3665f91bedc 49 while (mask) {
AndyA 0:b3665f91bedc 50 dataToSend += (value & mask)?0x06:0x4; // 100 for a 0 or 110 for a 1
AndyA 0:b3665f91bedc 51 if (mask & 0x11) { // trans
AndyA 3:3c48065d20ff 52 fastWrite(dataToSend);
AndyA 3:3c48065d20ff 53 dataToSend = 0;
AndyA 0:b3665f91bedc 54 }
AndyA 0:b3665f91bedc 55 dataToSend = dataToSend << 3;
AndyA 0:b3665f91bedc 56 mask = mask >> 1;
AndyA 0:b3665f91bedc 57 }
AndyA 0:b3665f91bedc 58 }
AndyA 0:b3665f91bedc 59
AndyA 0:b3665f91bedc 60 void wsDrive::sendPixel(pixelInfo *pixToSend)
AndyA 0:b3665f91bedc 61 {
AndyA 0:b3665f91bedc 62 sendByte(pixToSend->G);
AndyA 0:b3665f91bedc 63 sendByte(pixToSend->R);
AndyA 0:b3665f91bedc 64 sendByte(pixToSend->B);
AndyA 0:b3665f91bedc 65 }
AndyA 0:b3665f91bedc 66
AndyA 3:3c48065d20ff 67 void wsDrive::sendPixel(pixelInfo16 *pixToSend)
AndyA 3:3c48065d20ff 68 {
AndyA 3:3c48065d20ff 69 if (pixToSend->G > 0xff)
AndyA 3:3c48065d20ff 70 sendByte(0xff);
AndyA 3:3c48065d20ff 71 else if (pixToSend->G < 0)
AndyA 3:3c48065d20ff 72 sendByte(0xff);
AndyA 3:3c48065d20ff 73 else
AndyA 3:3c48065d20ff 74 sendByte((unsigned char)pixToSend->G);
AndyA 3:3c48065d20ff 75
AndyA 3:3c48065d20ff 76 if (pixToSend->R > 0xff)
AndyA 3:3c48065d20ff 77 sendByte(0xff);
AndyA 3:3c48065d20ff 78 else if (pixToSend->R < 0)
AndyA 3:3c48065d20ff 79 sendByte(0xff);
AndyA 3:3c48065d20ff 80 else
AndyA 3:3c48065d20ff 81 sendByte((unsigned char)pixToSend->R);
AndyA 3:3c48065d20ff 82
AndyA 3:3c48065d20ff 83 if (pixToSend->B > 0xff)
AndyA 3:3c48065d20ff 84 sendByte(0xff);
AndyA 3:3c48065d20ff 85 else if (pixToSend->B < 0)
AndyA 3:3c48065d20ff 86 sendByte(0xff);
AndyA 3:3c48065d20ff 87 else
AndyA 3:3c48065d20ff 88 sendByte((unsigned char)pixToSend->B);
AndyA 3:3c48065d20ff 89
AndyA 3:3c48065d20ff 90 }