Skip to content

Instantly share code, notes, and snippets.

@CamelCaseName
Last active November 27, 2023 15:40
Show Gist options
  • Save CamelCaseName/59bd58b002521df8daf4efca69d01e2e to your computer and use it in GitHub Desktop.
Save CamelCaseName/59bd58b002521df8daf4efca69d01e2e to your computer and use it in GitHub Desktop.
Explaining how to interface with the ICND2153 16 channel constant current LED drivers

How to use the ICND2153, FM6124C or STP1612PW05 or similar 16 channel PWM LED drivers

Config registers (default is usually fine, i dont change them)

config register

^pulled from the STP1612PW05 datasheet, icnd2153 and FM6124C are identical.

It seems like the ICND2153 and FM6124C copied the STP1612PW05 datasheet, then they deleted all relevant info. Even the testing circuits, electrical properties and similar is identical.

Order of operations for default display use:

selecting a row

  • for 0th row clear the row indexing shift registers/clock C once more so all 4 shift registers are cleared
  • for the first row, set 1 to the A pin then clock the C pin
  • for every other of the 30 rows just clock the C pin

example code

inline void stepRow()
{
    //row is just a global uint8_t
    if (row == 0)
    {
        HIGH_RC;
        HIGH_RA;
        CLEAR_RA;
        CLEAR_RC;
    }
    else
    {
        HIGH_RA;
        CLEAR_RA;
    }
    row = (row + 1) & (uint8_t)31;
}

clocking in data

input a single row

      • set colors for the current bit(R1,R2,G1,G2,B1,B2), MSB comes first.
      • set CLK high, PWCLK(OE pin) high,
      • set CLK, PWCLK(OE pin) both low again. (if the panel input pins are not buffered, you can run the PWCLK independantly of the CLK, but at least my panel has all input pins buffered once)
      • repeat that for each chip x 16, except the last one, the last chip is special
      • clock in 15 led in the last chip
      • set LAT high
      • set your color pins
      • clock once
      • LAT low
    • this pushes the bits from the input buffers to the intermediate buffers
    • repeat for all bits of color depth you want
    • advance row pins
  • repeat the points above for every row

enable output

  • for the last bitdepth for the last chip in the last row, push 13 bits
  • LAT high
  • set color bits
  • CLK high
  • CLK low
  • LAT low
  • set data bits
  • LAT high
  • CLK high
  • CLK low
  • set data bits
  • CLK high
  • CLK low
  • LAT low

this will push the bits from the data buffers to the pwm generatiors and enabled the leds

1 bit colordepth example code here

for (uint8_t y = 0; y < 32; y++) // 32 rows
{
    stepRow();
    
    // SET_COLOR(); sets the color bits on the panel
    // PWCLK_GCLK; sets LAT, CLK high then LAT, CLK low again
    // LATCH_GCLK; keeps latch on, rest is the same as PWCLK_GLCK
    
    // repeat 16 times per chip minus the last three for the last chip, this is a one bit example
    // (61 times for a 64 pixel wide panel, 125 for 128px panels in the LSB, 63 and 127 times for all other bits)
    SET_COLOR(); 
    PWCLK_GCLK;
    // end repeat

// this after every row
    // move data from input to intermediate buffer
    HIGH_LAT;
    SET_COLOR();
    LATCH_GCLK;
    CLEAR_LAT;
// #########

// this here only in the LSB
    // display row once done, so move data from latch registers to pwm modules
    HIGH_LAT;
    SET_COLOR();
    LATCH_GCLK;
    SET_COLOR();
    LATCH_GCLK;
    CLEAR_LAT;
// #########
}

You can find more examples in this library, specifically the header, for 1, 2 and 4 bit of output. The Arduino nano cant do more, thats why i didnt explore more than 4 bits of output.

Hope this helps someone

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment