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.

Committer:
rosienej
Date:
Wed Mar 11 14:13:13 2015 +0000
Revision:
1:ce2f23241f88
Parent:
0:2fd584b4a9b8
Child:
2:b8dc9a84801c
Formatting

Who changed what in which revision?

UserRevisionLine numberNew contents of line
rosienej 0:2fd584b4a9b8 1 #ifndef MBED_APA102_H
rosienej 0:2fd584b4a9b8 2
rosienej 0:2fd584b4a9b8 3 #define MBED_PING_H
rosienej 0:2fd584b4a9b8 4
rosienej 0:2fd584b4a9b8 5 #include "mbed.h"
rosienej 0:2fd584b4a9b8 6
rosienej 0:2fd584b4a9b8 7 /** Create an APA102_IRGB helper macro to construct a 4 byte LED Frame
rosienej 0:2fd584b4a9b8 8 *
rosienej 0:2fd584b4a9b8 9 * @param I : 5 bits of intensity (0,1,2,...,31)
rosienej 0:2fd584b4a9b8 10 * @param R : 8 bits of Red (0,1,...,255)
rosienej 0:2fd584b4a9b8 11 * @param G : 8 bits of Green (0,1,...,255)
rosienej 0:2fd584b4a9b8 12 * @param B : 8 bits of Blue (0,1,...,255)
rosienej 0:2fd584b4a9b8 13 */
rosienej 0:2fd584b4a9b8 14
rosienej 0:2fd584b4a9b8 15 #define APA102_IRGB(I,R,G,B) ((0xE0 + 0x1F&I)<<24)|((0xFF&R)<<16)|((0xFF&G)<<8)|(0xFF&B)
rosienej 0:2fd584b4a9b8 16
rosienej 0:2fd584b4a9b8 17 class APA102{
rosienej 0:2fd584b4a9b8 18 public:
rosienej 1:ce2f23241f88 19 /** Create an APA102 object connected to the specified mosi,miso,sclk pins
rosienej 0:2fd584b4a9b8 20 *
rosienej 0:2fd584b4a9b8 21 * @param mosi : SPI Master Out Slave In pin
rosienej 0:2fd584b4a9b8 22 * @param miso : SPI Master In Slave Out pin (ignored)
rosienej 0:2fd584b4a9b8 23 * @param sclk : SPI Clock
rosienej 0:2fd584b4a9b8 24 * @param rate : SPI Rate
rosienej 0:2fd584b4a9b8 25 */
rosienej 0:2fd584b4a9b8 26 APA102(PinName mosi,PinName miso,PinName sclk,int rate);
rosienej 0:2fd584b4a9b8 27
rosienej 1:ce2f23241f88 28 /** Set the Buffer
rosienej 0:2fd584b4a9b8 29 *
rosienej 0:2fd584b4a9b8 30 * @param buffer[] : a buffer of unsigned integers (4 bytes) *Rows*Stride in size
rosienej 0:2fd584b4a9b8 31 * @param Rows : Number of Rows
rosienej 0:2fd584b4a9b8 32 * @param Cols : Number of Columns
rosienej 0:2fd584b4a9b8 33 * @param Stride : The actual number of columns (useful for data alignment)
rosienej 0:2fd584b4a9b8 34 * @param Offset : The offset into a row
rosienej 0:2fd584b4a9b8 35 * @param ZigZag : A boolean, do we alternate count up/ count down per row?
rosienej 0:2fd584b4a9b8 36 * @param Wrap : A boolean, do we wrap if (Offset+Cols) > Stride? (handy for scrolling messages)
rosienej 0:2fd584b4a9b8 37 */
rosienej 0:2fd584b4a9b8 38 void SetBuffer(unsigned int Buffer[],int Rows,int Cols, int Stride,int Offset, bool ZigZag,bool Wrap);
rosienej 0:2fd584b4a9b8 39
rosienej 1:ce2f23241f88 40 /** Repaint the Strip
rosienej 0:2fd584b4a9b8 41 *
rosienej 0:2fd584b4a9b8 42 * @param none
rosienej 0:2fd584b4a9b8 43 */
rosienej 0:2fd584b4a9b8 44 void Repaint();
rosienej 0:2fd584b4a9b8 45
rosienej 0:2fd584b4a9b8 46 protected:
rosienej 0:2fd584b4a9b8 47 // SPI _spi(PTA16, PTA17, PTA15); // mosi, miso, sclk
rosienej 0:2fd584b4a9b8 48 SPI _spi;
rosienej 0:2fd584b4a9b8 49 private:
rosienej 0:2fd584b4a9b8 50 int NR;
rosienej 0:2fd584b4a9b8 51 int NC;
rosienej 0:2fd584b4a9b8 52 int NS;
rosienej 0:2fd584b4a9b8 53 int off;
rosienej 0:2fd584b4a9b8 54 bool ZF;
rosienej 0:2fd584b4a9b8 55 bool WF;
rosienej 0:2fd584b4a9b8 56 unsigned int * Buf;
rosienej 0:2fd584b4a9b8 57 };
rosienej 0:2fd584b4a9b8 58
rosienej 0:2fd584b4a9b8 59 #endif