Drives a strip of serial RGB LEDs (WS2812) through SPI port (mosi: p5).
colors.cpp
- Committer:
- xkozima
- Date:
- 2015-05-23
- Revision:
- 0:f7ac8595c47a
File content as of revision 0:f7ac8595c47a:
#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); }