driver for WS2812B LED, modified for better compatibility with LPC812 and LPC1549
Fork of wsDrive by
wsDrive.cpp@4:c965e448d96b, 2016-10-09 (annotated)
- 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?
User | Revision | Line number | New 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 | } |