Drives a strip of serial RGB LEDs (WS2812) through SPI port (mosi: p5).
colors.cpp@0:f7ac8595c47a, 2015-05-23 (annotated)
- 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?
User | Revision | Line number | New 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 | } |