Routines to drive a chain of APA102 Leds.

Dependents:   FRDM-K46Z_APA102

Fork of APA102a by Joel Rosiene

Committer:
rosienej
Date:
Tue Apr 07 13:55:11 2015 +0000
Revision:
8:3bb15df4903d
Parent:
6:5d4edfc955f3
corrected the end condition

Who changed what in which revision?

UserRevisionLine numberNew contents of line
rosienej 3:bf8c63d10824 1 #include "APA102a.h"
rosienej 3:bf8c63d10824 2 #include "mbed.h"
rosienej 3:bf8c63d10824 3
rosienej 4:2afea45fce8f 4 APA102a::APA102a(PinName mosi,PinName miso,PinName sclk,int rate)
rosienej 3:bf8c63d10824 5 : _spi(mosi, miso, sclk)
rosienej 3:bf8c63d10824 6
rosienej 3:bf8c63d10824 7 {
rosienej 6:5d4edfc955f3 8 // Setup the spi for 8 bit data, low steady state clock,
rosienej 5:863fb3a71efd 9 // second edge capture, with clock rate, clock active low, rising edge
rosienej 6:5d4edfc955f3 10 _spi.format(8,0);
rosienej 3:bf8c63d10824 11 _spi.frequency(rate);
rosienej 3:bf8c63d10824 12 }
rosienej 3:bf8c63d10824 13
rosienej 4:2afea45fce8f 14 void APA102a::SetBuffer(unsigned int Buffer[],int Rows,int Cols, int Stride,int Offset, bool ZigZag,bool Wrap)
rosienej 3:bf8c63d10824 15 {
rosienej 3:bf8c63d10824 16 Buf = Buffer;
rosienej 3:bf8c63d10824 17 NR = Rows;
rosienej 3:bf8c63d10824 18 NC = Cols;
rosienej 3:bf8c63d10824 19 NS = Stride;
rosienej 3:bf8c63d10824 20 off = Offset;
rosienej 3:bf8c63d10824 21 ZF = ZigZag;
rosienej 3:bf8c63d10824 22 WF = Wrap;
rosienej 3:bf8c63d10824 23 }
rosienej 3:bf8c63d10824 24
rosienej 4:2afea45fce8f 25 void APA102a::Repaint()
rosienej 3:bf8c63d10824 26 {
rosienej 3:bf8c63d10824 27 int index;
rosienej 8:3bb15df4903d 28 int end_count;
rosienej 3:bf8c63d10824 29 unsigned int val;
rosienej 3:bf8c63d10824 30
rosienej 3:bf8c63d10824 31 _spi.write(0X00); // Start
rosienej 3:bf8c63d10824 32 _spi.write(0X00);
rosienej 3:bf8c63d10824 33 _spi.write(0X00);
rosienej 3:bf8c63d10824 34 _spi.write(0X00);
rosienej 3:bf8c63d10824 35
rosienej 3:bf8c63d10824 36 for(int r = 0;r<NR;r++)
rosienej 3:bf8c63d10824 37 {
rosienej 3:bf8c63d10824 38 for(int c = off;c<(NC+off);c++)
rosienej 3:bf8c63d10824 39 {
rosienej 8:3bb15df4903d 40 // int cc = (WF)?(c%NS):((c<NS)?c:NS);
rosienej 4:2afea45fce8f 41 // if (ZF)
rosienej 4:2afea45fce8f 42 // { if((r&0x01)>0)
rosienej 8:3bb15df4903d 43 // index = r*NS + NC+off-cc;
rosienej 4:2afea45fce8f 44 // else
rosienej 4:2afea45fce8f 45 // index = r*NS + cc;}
rosienej 4:2afea45fce8f 46 // else
rosienej 4:2afea45fce8f 47 index = r*NS + c;
rosienej 3:bf8c63d10824 48
rosienej 3:bf8c63d10824 49 val = Buf[index];
rosienej 3:bf8c63d10824 50 _spi.write((val>>24)&0xFF);
rosienej 3:bf8c63d10824 51 _spi.write((val>>16)&0xFF);
rosienej 3:bf8c63d10824 52 _spi.write((val>>8)&0xFF);
rosienej 3:bf8c63d10824 53 _spi.write(val&0xFF);
rosienej 3:bf8c63d10824 54 }
rosienej 3:bf8c63d10824 55 }
rosienej 8:3bb15df4903d 56
rosienej 8:3bb15df4903d 57 end_count = ((NR*NC)>>1);
rosienej 8:3bb15df4903d 58 while (end_count>0){
rosienej 8:3bb15df4903d 59 _spi.write(0XFF); // Stop
rosienej 8:3bb15df4903d 60 end_count = end_count-8;
rosienej 8:3bb15df4903d 61 }
rosienej 8:3bb15df4903d 62 // _spi.write(0XFF);
rosienej 8:3bb15df4903d 63 // _spi.write(0XFF);
rosienej 8:3bb15df4903d 64 // _spi.write(0XFF);
rosienej 3:bf8c63d10824 65
rosienej 3:bf8c63d10824 66 }