Routines to drive a chain of APA102 Leds.
Fork of APA102a by
Embed:
(wiki syntax)
Show/hide line numbers
APA102a.cpp
00001 #include "APA102a.h" 00002 #include "mbed.h" 00003 00004 APA102a::APA102a(PinName mosi,PinName miso,PinName sclk,int rate) 00005 : _spi(mosi, miso, sclk) 00006 00007 { 00008 // Setup the spi for 8 bit data, low steady state clock, 00009 // second edge capture, with clock rate, clock active low, rising edge 00010 _spi.format(8,0); 00011 _spi.frequency(rate); 00012 } 00013 00014 void APA102a::SetBuffer(unsigned int Buffer[],int Rows,int Cols, int Stride,int Offset, bool ZigZag,bool Wrap) 00015 { 00016 Buf = Buffer; 00017 NR = Rows; 00018 NC = Cols; 00019 NS = Stride; 00020 off = Offset; 00021 ZF = ZigZag; 00022 WF = Wrap; 00023 } 00024 00025 void APA102a::Repaint() 00026 { 00027 int index; 00028 int end_count; 00029 unsigned int val; 00030 00031 _spi.write(0X00); // Start 00032 _spi.write(0X00); 00033 _spi.write(0X00); 00034 _spi.write(0X00); 00035 00036 for(int r = 0;r<NR;r++) 00037 { 00038 for(int c = off;c<(NC+off);c++) 00039 { 00040 // int cc = (WF)?(c%NS):((c<NS)?c:NS); 00041 // if (ZF) 00042 // { if((r&0x01)>0) 00043 // index = r*NS + NC+off-cc; 00044 // else 00045 // index = r*NS + cc;} 00046 // else 00047 index = r*NS + c; 00048 00049 val = Buf[index]; 00050 _spi.write((val>>24)&0xFF); 00051 _spi.write((val>>16)&0xFF); 00052 _spi.write((val>>8)&0xFF); 00053 _spi.write(val&0xFF); 00054 } 00055 } 00056 00057 end_count = ((NR*NC)>>1); 00058 while (end_count>0){ 00059 _spi.write(0XFF); // Stop 00060 end_count = end_count-8; 00061 } 00062 // _spi.write(0XFF); 00063 // _spi.write(0XFF); 00064 // _spi.write(0XFF); 00065 00066 }
Generated on Mon Jul 18 2022 20:15:44 by 1.7.2