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

Dependencies:   BurstSPI

Dependents:   colorsExample

Embed: (wiki syntax)

« Back to documentation index

Show/hide line numbers colors.cpp Source File

colors.cpp

00001 #include "mbed.h"
00002 #include "colors.h"
00003 
00004 BurstSPI Spi(p5, p6, p7);
00005 
00006 void Colors::setup(int n) {
00007     num = n;
00008     Spi.frequency(2400000);
00009     Spi.format(12);
00010 }
00011 
00012 void Colors::sendOne(unsigned char r, unsigned char g, unsigned char b) {
00013     int data;
00014     //  W2812: g, r, b  (0:100, 1:110)
00015     //  g[7:4]  0000abcdxxxx
00016     //          1a01b01c01d0
00017     data = ((g & 0x80) << 3) | ((g & 0x40) << 1)
00018          | ((g & 0x20) >> 1) | ((g & 0x10) >> 3);
00019     Spi.fastWrite(data | 0x924);
00020     //  g[3:0]  0000xxxxabcd
00021     //          1a01b01c01d0
00022     data = ((g & 0x08) << 7) | ((g & 0x04) << 5)
00023          | ((g & 0x02) << 3) | ((g & 0x01) << 1);
00024     Spi.fastWrite(data | 0x924);
00025     //  r[7:4]  0000abcdxxxx
00026     //          1a01b01c01d0
00027     data = ((r & 0x80) << 3) | ((r & 0x40) << 1)
00028          | ((r & 0x20) >> 1) | ((r & 0x10) >> 3);
00029     Spi.fastWrite(data | 0x924);
00030     //  r[3:0]  0000xxxxabcd
00031     //          1a01b01c01d0
00032     data = ((r & 0x08) << 7) | ((r & 0x04) << 5)
00033          | ((r & 0x02) << 3) | ((r & 0x01) << 1);
00034     Spi.fastWrite(data | 0x924);
00035     //  b[7:4]  0000abcdxxxx
00036     //          1a01b01c01d0
00037     data = ((b & 0x80) << 3) | ((b & 0x40) << 1)
00038          | ((b & 0x20) >> 1) | ((b & 0x10) >> 3);
00039     Spi.fastWrite(data | 0x924);
00040     //  b[3:0]  0000xxxxabcd
00041     //          1a01b01c01d0
00042     data = ((b & 0x08) << 7) | ((b & 0x04) << 5)
00043          | ((b & 0x02) << 3) | ((b & 0x01) << 1);
00044     Spi.fastWrite(data | 0x924);
00045 }
00046 
00047 void Colors::send(unsigned char data[][3]) {
00048     for (int i = 0; i < num; i++) {
00049         sendOne(data[i][0], data[i][1], data[i][2]);
00050     }
00051     wait_us(50);
00052 }