Drives a strip of serial RGB LEDs (WS2812) through SPI port (mosi: p5).
Embed:
(wiki syntax)
Show/hide line numbers
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 }
Generated on Sun Jul 17 2022 19:48:50 by 1.7.2