driver for WS2812B LED, modified for better compatibility with LPC812 and LPC1549
Fork of wsDrive by
wsDrive.cpp@0:b3665f91bedc, 2014-11-05 (annotated)
- 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?
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); |
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 |