view history edit print login register

Code for using the Sparkfun RGB matrix LED "backpack" on the Arduino

From danielh's post in the Arduino forum. The Sparkfun display is here.

// Simple program to test using the Arduino with the RGB Matrix 
// & Backpack from Sparkfun. Code is a combination of Heather Dewey-Hagborg,
// Arduino Forum user: Little-Scale, and // Daniel Hirschmann. Enjoy!
// 
// The Backpack requires 125Khz SPI, which is the slowest rate 
// at which the Arduino's hardware SPI bus can communicate at. 
// 
// We need to send SPI to the backpack in the following steps:
// 1) Activate ChipSelect; 
// 2) Wait 500microseconds;
// 3) Transfer 64bytes @ 125KHz (1 byte for each RGB LED in the matrix);
// 4) De-activate ChipSelect;
// 5) Wait 500microseconds
// Repeat however often you like!


#define CHIPSELECT 10//ss
#define SPICLOCK  13//sck
#define DATAOUT 11//MOSI
#define DATAIN 12//MISO

char spi_transfer(volatile char data)
{
  SPDR = data;			  // Start the transmission
  while (!(SPSR & (1<<SPIF)))     // Wait the end of the transmission
  {
  };
}

void setup()
{
  byte clr;
  pinMode(DATAOUT,OUTPUT);
  pinMode(SPICLOCK,OUTPUT);
  pinMode(CHIPSELECT,OUTPUT);
  digitalWrite(CHIPSELECT,HIGH); //disable device

  SPCR = B01010001;		 //SPI Registers
  SPSR = SPSR & B11111110;	//make sure the speed is 125KHz

  /*
  SPCR bits:
   7: SPIEE - enables SPI interrupt when high
   6: SPE - enable SPI bus when high
   5: DORD - LSB first when high, MSB first when low
   4: MSTR - arduino is in master mode when high, slave when low
   3: CPOL - data clock idle when high if 1, idle when low if 0
   2: CPHA - data on falling edge of clock when high, rising edge when low
   1: SPR1 - set speed of SPI bus
   0: SPR0 - set speed of SPI bus (00 is fastest @ 4MHz, 11 is slowest @ 250KHz)
   */

  clr=SPSR;
  clr=SPDR;
  delay(10);
}

void loop()		
{
    delay(100);			 
    digitalWrite(CHIPSELECT,LOW); // enable the ChipSelect on the backpack
    delayMicroseconds(500);
    for (int i=0;i<8;i++) for (int j=0;j<8;j++)
    {
	spi_transfer(i);	    
// There are only 8 colours available to the matrix with the 
// backpack, so this will present 1 colour per column on the matrix
    }
    digitalWrite(CHIPSELECT,HIGH); // disable the ChipSelect on the backpack
    delayMicroseconds(500);
}