//////////////////////////////////////////////////////////
//Code example provided by Ploveday at PJRC forums.
//////////////////////////////////////////////////////////
#include <SPI.h>
#define TLC5940_N 1
#define SPI_SR_TXCTR 0x0000f000
#define len 24
//Define SPI clock speed:
#define BAUD_DIV 0 /* 24MHz SPI */
//#define BAUD_DIV 1 /* 12MHz SPI */
//#define BAUD_DIV 2 /* 8MHz SPI */
//#define BAUD_DIV 3 /* 6MHz SPI */
//#define BAUD_DIV 4 /* 3MHz SPI */
//Globals/members:
uint32_t ctar0, ctar1, mcr;
uint8_t gsData[24 * TLC5940_N] = {
0b00000000,
0b00000000,
0b00000000,
0b00000000,
0b00000000,
0b00000001,
0b00000000,
0b00100000,
0b00000100,
0b00000000,
0b10000000,
0b00010000,
0b00000010,
0b00000000,
0b01000000,
0b00001000,
0b00000001,
0b00000000,
0b00100000,
0b00000100,
0b00000000,
0b10000000,
0b00001111,
0b11111111,
};
void setup(){
//Init code:
// First set up SPI via library
SPI.begin();
SPI.setBitOrder(MSBFIRST);
SPI.setDataMode(SPI_MODE0);
// Now reconfigure some stuff
// remember MCR
mcr = SPI0_MCR;
// Use both CTARs, one for 8 bit, the other 16 bit
ctar0 = SPI_CTAR_FMSZ(7) | SPI_CTAR_PBR(0) | SPI_CTAR_BR(BAUD_DIV) | SPI_CTAR_CSSCK(BAUD_DIV) | SPI_CTAR_DBR;
ctar1 = SPI_CTAR_FMSZ(15) | SPI_CTAR_PBR(0) | SPI_CTAR_BR(BAUD_DIV) | SPI_CTAR_CSSCK(BAUD_DIV) | SPI_CTAR_DBR;
SPI0_CTAR0 = ctar0;
SPI0_CTAR1 = ctar1;
//And some macros:
#define SPI_WRITE_8(c) \
do { \
while ((SPI0_SR & SPI_SR_TXCTR) >= 0x00004000); \
SPI0_PUSHR = ((c)&0xff) | SPI0_PUSHR_CTAS(0) | SPI0_PUSHR_CONT; \
} while(0)
/*
#define SPI_WRITE_16(w) \
do { \
while ((SPI0_SR & SPI_SR_TXCTR) >= 0x00004000); \
SPI0_PUSHR = ((w)&0xffff) | SPI0_PUSHR_CTAS(1) | SPI0_PUSHR_CONT; \
} while(0)
#define SPI_WAIT() \
while ((SPI0_SR & SPI_SR_TXCTR) != 0); \
while (!(SPI0_SR & SPI_SR_TCF)); \
SPI0_SR |= SPI_SR_TCF;
*/
}
void loop(){
spi_send_bytes(gsData, len);
}
void spi_send_bytes(uint8_t *data, int len)
{
for (int i=0; i < len; i++)
SPI_WRITE_8(data[i]);
}