TLC6C5724-Q1: Can't able to control the driver over SPI protocol

Part Number: TLC6C5724-Q1

Tool/software:

#include <stdio.h>
#include <string.h>
#include "chip.h"
#include "Timer.h"

#define LATCH_HIGH()  { LPC_GPIO1->SET |= (1 << 2); }
#define LATCH_LOW()   { LPC_GPIO1->CLR |= (1 << 2); }
#define BLANK_HIGH()  { LPC_GPIO1->SET |= (1 << 18); }
#define BLANK_LOW()   { LPC_GPIO1->CLR |= (1 << 18); }
#define GCLK_HIGH()   { LPC_GPIO1->SET |= (1 << 3); }
#define GCLK_LOW()    { LPC_GPIO1->CLR |= (1 << 3); }
#define ERR_status    ( (LPC_GPIO1->PIN & (1 << 19)) == (1 << 19) )

#define BSY     (1 << 4)
#define TNF     (1 << 1)
#define TFE     (1 << 0)
#define RFF     (1 << 3)
#define RNE     (1 << 2)

#define SSP_CR1_SSE      (1 << 1)
#define SSP_CR1_LBM      (1 << 0)

static void spi_init(void) {
    LPC_SYSCTL->PCONP |= (1 << 20); // Enable SSP2
    LPC_IOCON->p[1][0] = (1 << 2);  // SCLK
    LPC_IOCON->p[1][4] = (1 << 2);  // MISO
    LPC_IOCON->p[1][1] = (1 << 2);  // MOSI

    LPC_SSP2->CR0 = 0x07;           // 8-bit, SPI frame format
    LPC_SSP2->CPSR = 4;             // Clock prescaler
    LPC_SSP2->CR1 = SSP_CR1_SSE;   // Enable SSP2
}

static void spi_write(uint8_t data) {
    while (!(LPC_SSP2->SR & TNF));
    LPC_SSP2->DR = data;
    while (LPC_SSP2->SR & BSY);
    while (LPC_SSP2->SR & RNE) { (void)LPC_SSP2->DR; }
}

static void tlc_send_288bits_spi(const uint8_t *buf) {
    for (int i = 0; i < 36; i++) {
        spi_write(buf[i]);
    }
}

//static inline void set_bit(uint8_t *b, int idx) { b[idx >> 3] |=  (1u << (idx & 7)); }
//static inline void clr_bit(uint8_t *b, int idx) { b[idx >> 3] &= ~(1u << (idx & 7)); }
//
//static void set_bits_u32(uint8_t *b, int start, int width, uint32_t val) {
//    for (int i = 0; i < width; ++i) {
//        int bit_index_in_val = (width - 1) - i;    // MSB first
//        int out_bit_pos = start + i;          // stream position
//        int byte_index = out_bit_pos >> 3;
//        int bit_in_byte = 7 - (out_bit_pos & 7);  // MSB-first in each byte
//        if ( (val >> bit_index_in_val) & 1u ) {
//            b[byte_index] |= (1u << bit_in_byte);
//        } else {
//            b[byte_index] &= ~(1u << bit_in_byte);
//        }
//    }
//}


static void tlc_write_fc_bc_dc(void) {
    uint8_t f[36] = {
    		0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,   // First 48 bits of DC=0x7F stream
    	    0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,   // Continuing DC bits
    	    0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,
    	    0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,
    	    0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,   // (covers 168+24=192 bits region)
    	    0xF8,0x00,0x00,0x00,0x00,0x10    // FC bits with required flags
    	};
//    int pos = 0;
    BLANK_LOW();
//
//
//    for (int grp = 0; grp < 8; ++grp) {
//        set_bits_u32(f, pos, 7, 0x7F); pos += 7; // R
//        set_bits_u32(f, pos, 7, 0x7F); pos += 7; // G
//        set_bits_u32(f, pos, 7, 0x7F); pos += 7; // B
//    }
//
//    set_bits_u32(f, 168, 8, 0xFF); // BC R
//    set_bits_u32(f, 176, 8, 0xFF); // BC G
//    set_bits_u32(f, 184, 8, 0xFF); // BC B
//
//    set_bits_u32(f, 192, 13, 0);   // Clear FC
//    set_bits_u32(f, 192, 1, 1);    // DC_RANGE_R
//    set_bits_u32(f, 193, 1, 1);    // DC_RANGE_G
//    set_bits_u32(f, 194, 1, 1);    // DC_RANGE_B
//    set_bits_u32(f, 195, 1, 1);    // AUTO_REPEAT
//    set_bits_u32(f, 196, 1, 1);    // TIMING_RESET
//    set_bits_u32(f, 204, 1, 1);    // LED_ERR_MASK

    tlc_send_288bits_spi(f);
    LATCH_HIGH();
    delay_10us(1);
    LATCH_LOW();
}

static void tlc_write_gs12( uint16_t gs[24]) {
    uint8_t frame[36]  = {
    		0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,
    	    0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,
    	    0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,
    	    0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,
    	    0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,
    	    0xFF,0xFF,0xFF,0xFF,0xFF,0xFF
    	};
//    int bitpos = 0;
//    for (int i = 0; i < 24; ++i) gs[i] = 0xFFF;
//    for (int grp = 0; grp <8; grp++) {
//        set_bits_u32(frame, bitpos, 12, gs[grp*3 + 0]); bitpos += 12;
//        set_bits_u32(frame, bitpos, 12, gs[grp*3 + 1]); bitpos += 12;
//        set_bits_u32(frame, bitpos, 12, gs[grp*3 + 2]); bitpos += 12;
//    }
    tlc_send_288bits_spi(frame);
    LATCH_HIGH();
    delay_10us(1);
    LATCH_LOW();
    delay_10us(1);
    BLANK_HIGH();
}

static void gclk_run_software(unsigned cycles) {
    for (unsigned i = 0; i < cycles; ++i) {
        GCLK_HIGH(); delay_10us(10);
        GCLK_LOW();  delay_10us(10);
    }
}

void tlc_example(void) {
    spi_init();

    tlc_write_fc_bc_dc();
    uint16_t gs[24];


    tlc_write_gs12(gs);

//    gclk_run_software(4096); // One PWM cycle

    while (1)
    {
    	gclk_run_software(4096);
        if (ERR_status) {
            LPC_GPIO4->CLR |= (1 << 31); // buzzer off
        } else {
            LPC_GPIO4->SET |= (1 << 31); // buzzer on
        }
    }
}

I’ve attached my working code for the LPC1788 controller, but I’m unable to control the 24-channel output. Is there any mistake or something I might have missed? Can anyone help me identify the issue?