Arduino Due + Tlc5940

Here it is:

//TLC5940
#define GSCLK_PIN 2
#define SIN_PIN 3
#define SCLK_PIN 4
#define BLANK_PIN 5
#define DCPRG_PIN 6
#define VPRG_PIN 7
#define XLAT_PIN 8

#define TLC5940_N 2

//74HC595
#define LATCH_PIN 9
#define CLOCK_PIN 10
#define DATA_PIN 11

//Display
int rowId = 0;

uint16_t rowR[8][8] = 
{
  {
    4095,4095,4095,4095,4095,4095,4095,4095  }
  ,
  {
    4095,4095,4095,4095,4095,4095,4095,4095  }
  ,
  {
    4095,4095,4095,4095,4095,4095,4095,4095  }
  ,
  {
    4095,4095,4095,4095,4095,4095,4095,4095  }
  ,
  {
    4095,4095,4095,4095,4095,4095,4095,4095  }
  ,
  {
    4095,4095,4095,4095,4095,4095,4095,4095  }
  ,
  {
    4095,4095,4095,4095,4095,4095,4095,4095  }
  ,
  {
    4095,4095,4095,4095,4095,4095,4095,4095  }
};

uint16_t rowG[8][8] = 
{
  {
    4095,4095,4095,4095,4095,4095,4095,4095  }
  ,
  {
    4095,4095,4095,4095,4095,4095,4095,4095  }
  ,
  {
    4095,4095,4095,4095,4095,4095,4095,4095  }
  ,
  {
    4095,4095,4095,4095,4095,4095,4095,4095  }
  ,
  {
    4095,4095,4095,4095,4095,4095,4095,4095  }
  ,
  {
    4095,4095,4095,4095,4095,4095,4095,4095  }
  ,
  {
    4095,4095,4095,4095,4095,4095,4095,4095  }
  ,
  {
    4095,4095,4095,4095,4095,4095,4095,4095  }
};

uint16_t rowB[8][8] = 
{
  {
    4095,4095,4095,4095,4095,4095,4095,4095  }
  ,
  {
    4095,4095,4095,4095,4095,4095,4095,4095  }
  ,
  {
    4095,4095,4095,4095,4095,4095,4095,4095  }
  ,
  {
    4095,4095,4095,4095,4095,4095,4095,4095  }
  ,
  {
    4095,4095,4095,4095,4095,4095,4095,4095  }
  ,
  {
    4095,4095,4095,4095,4095,4095,4095,4095  }
  ,
  {
    4095,4095,4095,4095,4095,4095,4095,4095  }
  ,
  {
    4095,4095,4095,4095,4095,4095,4095,4095  }
};

uint8_t dcData[96 * TLC5940_N] = {
  //MSB          LSB
  //TLC 1
  1, 1, 1, 1, 1, 1, // Channel 15
  1, 1, 1, 1, 1, 1, // Channel 14
  1, 1, 1, 1, 1, 1, // Channel 13
  1, 1, 1, 1, 1, 1, // Channel 12
  1, 1, 1, 1, 1, 1, // Channel 11
  1, 1, 1, 1, 1, 1, // Channel 10
  1, 1, 1, 1, 1, 1, // Channel 9
  1, 1, 1, 1, 1, 1, // Channel 8
  1, 1, 1, 1, 1, 1, // Channel 7
  1, 1, 1, 1, 1, 1, // Channel 6
  1, 1, 1, 1, 1, 1, // Channel 5
  1, 1, 1, 1, 1, 1, // Channel 4
  1, 1, 1, 1, 1, 1, // Channel 3
  1, 1, 1, 1, 1, 1, // Channel 2
  1, 1, 1, 1, 1, 1, // Channel 1
  1, 1, 1, 1, 1, 1, // Channel 0
  //TLC 2
  1, 1, 1, 1, 1, 1, // Channel 15
  1, 1, 1, 1, 1, 1, // Channel 14
  1, 1, 1, 1, 1, 1, // Channel 13
  1, 1, 1, 1, 1, 1, // Channel 12
  1, 1, 1, 1, 1, 1, // Channel 11
  1, 1, 1, 1, 1, 1, // Channel 10
  1, 1, 1, 1, 1, 1, // Channel 9
  1, 1, 1, 1, 1, 1, // Channel 8
  1, 1, 1, 1, 1, 1, // Channel 7
  1, 1, 1, 1, 1, 1, // Channel 6
  1, 1, 1, 1, 1, 1, // Channel 5
  1, 1, 1, 1, 1, 1, // Channel 4
  1, 1, 1, 1, 1, 1, // Channel 3
  1, 1, 1, 1, 1, 1, // Channel 2
  1, 1, 1, 1, 1, 1, // Channel 1
  1, 1, 1, 1, 1, 1, // Channel 0
};

uint8_t gsData[192 * TLC5940_N] = {
  //MSB                            LSB
  //TLC 1
  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // Channel 15
  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // Channel 14
  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // Channel 13
  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, // Channel 12
  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, // Channel 11
  0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, // Channel 10
  0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, // Channel 9
  0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, // Channel 8
  0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, // Channel 7
  0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, // Channel 6
  0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, // Channel 5
  0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, // Channel 4
  0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, // Channel 3
  0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // Channel 2
  1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // Channel 1
  1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, // Channel 0
  //TLC 2
  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // Channel 15
  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // Channel 14
  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // Channel 13
  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, // Channel 12
  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, // Channel 11
  0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, // Channel 10
  0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, // Channel 9
  0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, // Channel 8
  0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, // Channel 7
  0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, // Channel 6
  0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, // Channel 5
  0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, // Channel 4
  0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, // Channel 3
  0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // Channel 2
  1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // Channel 1
  1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, // Channel 0
};

void TLC5940_Init()
{
  pinMode(GSCLK_PIN, OUTPUT);
  pinMode(SCLK_PIN, OUTPUT);
  pinMode(DCPRG_PIN, OUTPUT);
  pinMode(VPRG_PIN, OUTPUT);
  pinMode(XLAT_PIN, OUTPUT);
  pinMode(BLANK_PIN, OUTPUT);
  pinMode(SIN_PIN, OUTPUT);

  pinMode(LATCH_PIN, OUTPUT);
  pinMode(CLOCK_PIN, OUTPUT);
  pinMode(DATA_PIN, OUTPUT);

  digitalWrite(GSCLK_PIN, LOW);
  digitalWrite(SCLK_PIN, LOW);
  digitalWrite(DCPRG_PIN, LOW);
  digitalWrite(VPRG_PIN, HIGH);
  digitalWrite(XLAT_PIN, LOW);
  digitalWrite(BLANK_PIN, HIGH);
}

void TLC5940_ClockInDC()
{
  digitalWrite(DCPRG_PIN, HIGH);
  digitalWrite(VPRG_PIN, HIGH);

  uint8_t Counter = 0;

  while(true)
  {
    if (Counter > TLC5940_N * 96 - 1) {
      digitalWrite(XLAT_PIN, HIGH);
      digitalWrite(XLAT_PIN, LOW);
      break;
    } 
    else {
      digitalWrite(SIN_PIN, dcData[Counter]);
      digitalWrite(SCLK_PIN, HIGH);
      digitalWrite(SCLK_PIN, LOW);
      Counter++;
    }
  }
}

void TLC5940_SetGS_And_GS_PWM() 
{
  uint8_t firstCycleFlag = 0;
  if (digitalRead(VPRG_PIN)) 
  {
    digitalWrite(VPRG_PIN, LOW);
    firstCycleFlag = 1;
  }
  uint16_t GSCLK_Counter = 0;
  uint8_t Data_Counter = 0;
  digitalWrite(BLANK_PIN, LOW);
  while (true)
  {
    if (GSCLK_Counter > 4095) 
    {
      digitalWrite(BLANK_PIN, HIGH);
      digitalWrite(XLAT_PIN, HIGH);
      digitalWrite(XLAT_PIN, LOW);
      if (firstCycleFlag) 
      {
        digitalWrite(SCLK_PIN, HIGH);
        digitalWrite(SCLK_PIN, LOW);
        firstCycleFlag = 0;
      }
      break;
    } 
    else 
    {
      if (!(Data_Counter > TLC5940_N * 192 - 1)) 
      {
        if (gsData[Data_Counter])
          digitalWrite(SIN_PIN, HIGH);
        else
          digitalWrite(SIN_PIN, LOW);
        digitalWrite(SCLK_PIN, HIGH);
        digitalWrite(SCLK_PIN, LOW);
        Data_Counter++;
      }
    }
    digitalWrite(GSCLK_PIN, HIGH);
    digitalWrite(GSCLK_PIN, LOW);
    GSCLK_Counter++;
  }
}

void setLed(int ledId, int driverId, uint16_t value)
{
  for(int i = 0; i < 12; i++)
  {
    gsData[driverId * 12 * 16 + 12 * ledId + i] = value >> (12 - i - 1);
  }
}

/*void TC3_Handler()
{
  TC_GetStatus(TC1, 0);
  digitalWrite(LATCH_PIN, LOW);
  shiftOut(DATA_PIN, CLOCK_PIN, MSBFIRST, 1 << rowId);
  digitalWrite(LATCH_PIN, HIGH);
  for(int i = 0; i < 8; i++)
  {
   setLed(i, 0, rowR[i][rowId]);
   setLed(i, 1, rowG[i][rowId]);
   setLed(i + 8, 1, rowB[i][rowId]);
  }
  rowId++;
  if(rowId == 8) rowId = 0;
  TLC5940_SetGS_And_GS_PWM();
}*/

void startTimer(Tc *tc, uint32_t channel, IRQn_Type irq, uint32_t frequency) {
  pmc_set_writeprotect(false);
  pmc_enable_periph_clk((uint32_t)irq);
  TC_Configure(tc, channel, TC_CMR_WAVE | TC_CMR_WAVSEL_UP_RC | TC_CMR_TCCLKS_TIMER_CLOCK4);
  uint32_t rc = VARIANT_MCK/128/frequency; //128 because we selected TIMER_CLOCK4 above
  TC_SetRA(tc, channel, rc/2); //50% high, 50% low
  TC_SetRC(tc, channel, rc);
  TC_Start(tc, channel);
  tc->TC_CHANNEL[channel].TC_IER=TC_IER_CPCS;
  tc->TC_CHANNEL[channel].TC_IDR=~TC_IER_CPCS;
  NVIC_EnableIRQ(irq);
}

void setup()
{
  TLC5940_Init();
  TLC5940_ClockInDC();
 // startTimer(TC1, 0, TC3_IRQn, 84000000 / 2);
}

void loop()
{
digitalWrite(LATCH_PIN, LOW);
  shiftOut(DATA_PIN, CLOCK_PIN, MSBFIRST, 1 << rowId);
  digitalWrite(LATCH_PIN, HIGH);
  for(int i = 0; i < 8; i++)
  {
   setLed(i, 1, rowR[i][rowId]);
   //setLed(i, 0, rowG[i][rowId]);
   setLed(i + 8, 0, rowB[i][rowId]);
  }
 // rowId++;
 // if(rowId == 8) rowId = 0;
  TLC5940_SetGS_And_GS_PWM();
}

Maybe someone can fix it.