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?