tlc5920 16x8 led driver/controller

Pavel Hudecek edizon na seznam.cz
Pondělí Srpen 27 22:54:54 CEST 2018


Zkusil bych se buď podívat osciloskopem, jak to na těch COM vypadá, nebo to 
pustit tak pomalu, aby bylo vidět co to dělá.

Pokud by nebyl problém s polaritou COM, tak před pár lety jsem se 
ochomejtnul okolo něčeho s jiným TLC59.. (neměl COM, jen 16 výstupů) a tam 
měli problém, že na velké desce SCLK vesele clockoval i na odrazy hran. A 
měl taky BLANK a ten vypínal výstupy, ale už si nepamatuju, zda ho bylo 
potřeba používat.

PH

-----Původní zpráva----- 
From: David Belohrad
A cim vice se divam na ten datasheet, tim mene tomu rozumim.

Na strane 3 je uvedeno ze jak S[15:0] tak COM[7:0] jsou VYSTUPY, ovsem na 
nasledujici strane je napsano ze low-level output current na COM0-7 je 
640mA, a high-level output current na S[15:0] je -30mA. Pro me to znamena, 
ze S[15:0] je v podstate current sink, a tudiz moje diody ve schematu jsou 
zapojeny obracene (doufam, ze neurazim prilozenym schematem). Za 
predpokladu, ze 'cathode common' je to co si myslim, tak bych mel schema mit 
dobre. Diody sviti, takze predpokladam, ze by mely byt zapojene spravne.

Jsem zmaten a ocenim jakekoliv komentare. Pro uplnost prikladam 
systemverilog implementaci toho kontroleru. (pozn: data_ib indexy nejsou 
jeste ve spravnem poradi, ale na implementaci to nic nemeni)








import CKRSPkg::*;


module tlc5920
  #(
    // clock divider. Set to zero when ClkRs_ix provides 40MHz
    // stream. For all faster clocks give division ratio to get to
    // lower speeds
    parameter   g_divider  = 4
    )
  (
   // 40 MHz clock reset stream
   input   ckrs_t ClkRs_ix,
   // data input. Logic '1' turns the particular led on (= emits
   // light). The vector data are as follows:
   // [row][column][red/green]
   input logic [1:0][15:0][3:0] data_ib,
   // interface to the chip
   display_x display
   );

   // clock enable
   logic enable, latchdly1, latchdly2, latch;
   logic sclk = 0;

   // counting 32bits to be shifted in one go into both registers
   localparam CBITS = 7;
   logic [CBITS-1:0] counter_b = '0;
   logic frame, subframe;
   logic [63:0] hipart_b, lopart_b;

   // column selector
   logic [2:0] csel_b3 = '0;

   // first we get clock enable out of division, get maximum speed,
   // which is 10MHz. This is clock into serial register
   clock_divider
     #(.g_divider(g_divider))
   i_clock_divider
      (.enable_o(enable),
       .*);

   // simple counter to count the states
   always_ff @(posedge ClkRs_ix.clk)
     if (enable)
       counter_b <= counter_b + (CBITS)'(1);

   // always present clock
   always_ff @(posedge ClkRs_ix.clk)
     if (enable) sclk <= ~sclk;

   // latching is every 16bits, extend
   // pulse into SCLK domain, which is twice slower
   always_ff @(posedge ClkRs_ix.clk)
     if (enable) begin
if (~(|counter_b[4:0]))
  latchdly1 <= 1;
else
  latchdly1 <= 0;
latchdly2 <= latchdly1;
latch <= latchdly1 | latchdly2;
     end

   // frame is 4 16-bit cycles, two independent data outputs
   // for each driver separately
   always_ff @(posedge ClkRs_ix.clk)
     if (enable) begin
if (~(|counter_b))
  frame <= 1;
else
  frame <= 0;

if (~(|counter_b[3:0]))
  subframe <= 1;
else
  subframe <= 0;
     end // if (enable)

   // chip-selects (resp driver selects). The driver is set such, that
   // 16bits correspond to two-chip data (odd bits on com0,2,4... even
   // bits on com1,3,5,7)
   always_ff @(posedge ClkRs_ix.clk)
     if (enable)
       if (subframe && frame)
// with frame coming in we start to load the data into col0
// and 1, hence csel has to be two behind such, that on next
// latch we get values for csel 0 and 1
csel_b3 <= 3'd6;
       else if (subframe)
csel_b3 <= csel_b3 + 3'd1;


   // every frame we have to load the input data into shift register:
   logic [1:0][63:0] data_b = '0;
   always_ff @(posedge ClkRs_ix.clk)
     if (frame && enable)
       data_b <= data_ib;
     else if (sclk && enable) begin
data_b[0] <= {1'b0, data_b[0][63:1]};
data_b[1] <= {1'b0, data_b[1][63:1]};
     end

// assignments:
   assign display.blank_o = '0;

   always_ff @(posedge sclk)
     display.latch_o <= latch;

   // separate two data in streams. all other signals are common for
   // both chips
   always_ff @(posedge ClkRs_ix.clk)
     if (enable) begin
display.data1_o <= data_b[0][0];
display.data2_o <= data_b[1][0];
display.csel_ob3 <= csel_b3;
     end

   // invert clock to position data transitions wrt negative
   // edges. this makes timing margin and should work even with crappy
   // lines
   assign display.sclk_o = ~sclk;


   initial begin
      $display("Size of input vector: %d", $bits(data_ib));

   end


endmodule // tlc5920


David Belohrad <david na belohrad.ch> writes:

> Ahojte,
>
> ma prosim nekdo zkusenosti s tl5920?
>
> www.ti.com/lit/ds/symlink/tlc5920.pdf
>
>
> nevim jak spravne formulovat muj dotaz. ... nefunguje to a asi nerozumim, 
> jak to ma fungovat. Datasheet je velice skoupy na informace. a at delam co 
> delam, led matrix zobrazuje hovadiny. Vyrobil jsem kus systemverilog kodu, 
> ktery dava 'blank' signal trvale na log. L. Necham vzdy do 16 bitoveho 
> registru nacist pro dany radek tu 16-bitovou informaci, po kazdych 16 
> bitech vytvorim puls na LATCH (transision L->H->L), a na kazdych 16-bitech 
> cykluji csel vzdy dvakrat (tedy mezi dvema latch impulzy ma csel hodnotu 
> 0,1 pak 2,3 pak 4,5), a tedy jeden 'frame' vyzaduje 4x latch - celkove 64 
> bitu poslanych na kazdy frame, ktery cykluje csel od nuly do sedmi.
>
> Kdyz to spustim a divam se na data na SIN/SOUT, vsechno vypada perfektne, 
> logicky. Ovsem diody si delaji co chteji. nektere z nich slabe sviti, 
> nektere silne, skoro to vypada, jako kdyby nebyl dostatecny proud tema 
> diodama, nebo dochazelo k nejakemu mixu mezi logikou CSEL pinu a seriove 
> linky. Napada me jenom, ze signal BLANK proste z nejakeho neznameho duvodu 
> musi byt take pouzivan. Ja jej mam trvale na nule, protoze chci mit ty 
> diody neustale zapnute.
>
> Tak me napadlo, nema k tomuto driveru nekdo kod napsany pro ... cokoliv? 
> arduino/jakykoliv mikrokontroler, abych si mohl proverit jestli casuji jak 
> mam? K cemu je BLANK?
>
> ztratil jsem s tou hovadinou cely den 



Další informace o konferenci Hw-list