Drives a strip of serial RGB LEDs (WS2812) through SPI port (mosi: p5).

Dependencies:   BurstSPI

Dependents:   colorsExample

Committer:
xkozima
Date:
Sat May 23 01:31:14 2015 +0000
Revision:
0:f7ac8595c47a
This library drives WS2812 Serial RGB LED strips.  See main.cpp as an example usage.

Who changed what in which revision?

UserRevisionLine numberNew contents of line
xkozima 0:f7ac8595c47a 1 #include "mbed.h"
xkozima 0:f7ac8595c47a 2 #include "colors.h"
xkozima 0:f7ac8595c47a 3
xkozima 0:f7ac8595c47a 4 BurstSPI Spi(p5, p6, p7);
xkozima 0:f7ac8595c47a 5
xkozima 0:f7ac8595c47a 6 void Colors::setup(int n) {
xkozima 0:f7ac8595c47a 7 num = n;
xkozima 0:f7ac8595c47a 8 Spi.frequency(2400000);
xkozima 0:f7ac8595c47a 9 Spi.format(12);
xkozima 0:f7ac8595c47a 10 }
xkozima 0:f7ac8595c47a 11
xkozima 0:f7ac8595c47a 12 void Colors::sendOne(unsigned char r, unsigned char g, unsigned char b) {
xkozima 0:f7ac8595c47a 13 int data;
xkozima 0:f7ac8595c47a 14 // W2812: g, r, b (0:100, 1:110)
xkozima 0:f7ac8595c47a 15 // g[7:4] 0000abcdxxxx
xkozima 0:f7ac8595c47a 16 // 1a01b01c01d0
xkozima 0:f7ac8595c47a 17 data = ((g & 0x80) << 3) | ((g & 0x40) << 1)
xkozima 0:f7ac8595c47a 18 | ((g & 0x20) >> 1) | ((g & 0x10) >> 3);
xkozima 0:f7ac8595c47a 19 Spi.fastWrite(data | 0x924);
xkozima 0:f7ac8595c47a 20 // g[3:0] 0000xxxxabcd
xkozima 0:f7ac8595c47a 21 // 1a01b01c01d0
xkozima 0:f7ac8595c47a 22 data = ((g & 0x08) << 7) | ((g & 0x04) << 5)
xkozima 0:f7ac8595c47a 23 | ((g & 0x02) << 3) | ((g & 0x01) << 1);
xkozima 0:f7ac8595c47a 24 Spi.fastWrite(data | 0x924);
xkozima 0:f7ac8595c47a 25 // r[7:4] 0000abcdxxxx
xkozima 0:f7ac8595c47a 26 // 1a01b01c01d0
xkozima 0:f7ac8595c47a 27 data = ((r & 0x80) << 3) | ((r & 0x40) << 1)
xkozima 0:f7ac8595c47a 28 | ((r & 0x20) >> 1) | ((r & 0x10) >> 3);
xkozima 0:f7ac8595c47a 29 Spi.fastWrite(data | 0x924);
xkozima 0:f7ac8595c47a 30 // r[3:0] 0000xxxxabcd
xkozima 0:f7ac8595c47a 31 // 1a01b01c01d0
xkozima 0:f7ac8595c47a 32 data = ((r & 0x08) << 7) | ((r & 0x04) << 5)
xkozima 0:f7ac8595c47a 33 | ((r & 0x02) << 3) | ((r & 0x01) << 1);
xkozima 0:f7ac8595c47a 34 Spi.fastWrite(data | 0x924);
xkozima 0:f7ac8595c47a 35 // b[7:4] 0000abcdxxxx
xkozima 0:f7ac8595c47a 36 // 1a01b01c01d0
xkozima 0:f7ac8595c47a 37 data = ((b & 0x80) << 3) | ((b & 0x40) << 1)
xkozima 0:f7ac8595c47a 38 | ((b & 0x20) >> 1) | ((b & 0x10) >> 3);
xkozima 0:f7ac8595c47a 39 Spi.fastWrite(data | 0x924);
xkozima 0:f7ac8595c47a 40 // b[3:0] 0000xxxxabcd
xkozima 0:f7ac8595c47a 41 // 1a01b01c01d0
xkozima 0:f7ac8595c47a 42 data = ((b & 0x08) << 7) | ((b & 0x04) << 5)
xkozima 0:f7ac8595c47a 43 | ((b & 0x02) << 3) | ((b & 0x01) << 1);
xkozima 0:f7ac8595c47a 44 Spi.fastWrite(data | 0x924);
xkozima 0:f7ac8595c47a 45 }
xkozima 0:f7ac8595c47a 46
xkozima 0:f7ac8595c47a 47 void Colors::send(unsigned char data[][3]) {
xkozima 0:f7ac8595c47a 48 for (int i = 0; i < num; i++) {
xkozima 0:f7ac8595c47a 49 sendOne(data[i][0], data[i][1], data[i][2]);
xkozima 0:f7ac8595c47a 50 }
xkozima 0:f7ac8595c47a 51 wait_us(50);
xkozima 0:f7ac8595c47a 52 }