Routines to drive a chain of APA102 Leds.

Dependents:   blink_led_threading

The APA102 is an LED with a built in pwm driver which can be drive by SPI.

An array of Intensity, Red, Green, Blue values packed in to integers is displayed on a strip of APA102 elements.

The array is characterized by Rows, (active) Columns, Offset, Stride, and flags which determine how to traverse the data.

To support scrolling messages, it is possible to allocate an array which is Rows x Stride in size, and use offset to "scroll" the message. The Wrap flag is used to allow the index into the array to wrap back to zero.

To support the physical construction of arrays, the zigzag flag is used to cause the display order of odd rows to be reversed. For a 3x3 array the values are displayed in the following order is zigzag is set.

1 2 3
6 5 4
7 8 9

This allows the 3rd element to be wired to the fourth element, shortening the length of the wires on the array.

APA102.cpp

Committer:
rosienej
Date:
2015-03-11
Revision:
2:b8dc9a84801c
Parent:
0:2fd584b4a9b8

File content as of revision 2:b8dc9a84801c:

#include "APA102.h"
#include "mbed.h"

APA102::APA102(PinName mosi,PinName miso,PinName sclk,int rate)
        : _spi(mosi, miso, sclk)
      
        {
            // Setup the spi for 8 bit data, high steady state clock,
            // second edge capture, with a 1MHz clock rate
            _spi.format(8,3);
            _spi.frequency(rate);
        } 
        
void APA102::SetBuffer(unsigned int Buffer[],int Rows,int Cols, int Stride,int Offset, bool ZigZag,bool Wrap)
{
    Buf = Buffer;
    NR = Rows;
    NC = Cols;
    NS = Stride;
    off = Offset;
    ZF = ZigZag;
    WF = Wrap;
    }
    
void APA102::Repaint()
{   
    int index;
    unsigned int val;
    
    _spi.write(0X00);  // Start
    _spi.write(0X00);
    _spi.write(0X00);
    _spi.write(0X00);
    
    for(int r = 0;r<NR;r++)
    {
        for(int c = off;c<(NC+off);c++)
        {
            int cc = (WF)?(c%NS):((c<NS)?c:NS);
            if (ZF) 
               if((r&0x01)>0)
                    index = r*NS + NC+off-cc;
                else
                    index = r*NS + cc;
            else 
                index = r*NS + cc;
                
            val = Buf[index];
            _spi.write((val>>24)&0xFF);  
            _spi.write((val>>16)&0xFF);  
            _spi.write((val>>8)&0xFF);  
            _spi.write(val&0xFF);  
        }
    }
    _spi.write(0XFF); // Stop
    _spi.write(0XFF);
    _spi.write(0XFF);
    _spi.write(0XFF);
    
}