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

Dependencies:   BurstSPI

Dependents:   colorsExample

Revision:
0:f7ac8595c47a
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/colors.cpp	Sat May 23 01:31:14 2015 +0000
@@ -0,0 +1,52 @@
+#include "mbed.h"
+#include "colors.h"
+
+BurstSPI Spi(p5, p6, p7);
+
+void Colors::setup(int n) {
+    num = n;
+    Spi.frequency(2400000);
+    Spi.format(12);
+}
+
+void Colors::sendOne(unsigned char r, unsigned char g, unsigned char b) {
+    int data;
+    //  W2812: g, r, b  (0:100, 1:110)
+    //  g[7:4]  0000abcdxxxx
+    //          1a01b01c01d0
+    data = ((g & 0x80) << 3) | ((g & 0x40) << 1)
+         | ((g & 0x20) >> 1) | ((g & 0x10) >> 3);
+    Spi.fastWrite(data | 0x924);
+    //  g[3:0]  0000xxxxabcd
+    //          1a01b01c01d0
+    data = ((g & 0x08) << 7) | ((g & 0x04) << 5)
+         | ((g & 0x02) << 3) | ((g & 0x01) << 1);
+    Spi.fastWrite(data | 0x924);
+    //  r[7:4]  0000abcdxxxx
+    //          1a01b01c01d0
+    data = ((r & 0x80) << 3) | ((r & 0x40) << 1)
+         | ((r & 0x20) >> 1) | ((r & 0x10) >> 3);
+    Spi.fastWrite(data | 0x924);
+    //  r[3:0]  0000xxxxabcd
+    //          1a01b01c01d0
+    data = ((r & 0x08) << 7) | ((r & 0x04) << 5)
+         | ((r & 0x02) << 3) | ((r & 0x01) << 1);
+    Spi.fastWrite(data | 0x924);
+    //  b[7:4]  0000abcdxxxx
+    //          1a01b01c01d0
+    data = ((b & 0x80) << 3) | ((b & 0x40) << 1)
+         | ((b & 0x20) >> 1) | ((b & 0x10) >> 3);
+    Spi.fastWrite(data | 0x924);
+    //  b[3:0]  0000xxxxabcd
+    //          1a01b01c01d0
+    data = ((b & 0x08) << 7) | ((b & 0x04) << 5)
+         | ((b & 0x02) << 3) | ((b & 0x01) << 1);
+    Spi.fastWrite(data | 0x924);
+}
+
+void Colors::send(unsigned char data[][3]) {
+    for (int i = 0; i < num; i++) {
+        sendOne(data[i][0], data[i][1], data[i][2]);
+    }
+    wait_us(50);
+}