TLC5940 mit XMEGA ansteuern

OP #4531102
Lesenswert?

Hallo,

ich habe vor einen LED Tisch zu bauen und möchte gerne einen TLC 5940 
(16 Kanal LED Treiber) mit einem ATXMEGA 256 A3U über die Hardware SPI 
ansteuern.
Dafür habe ich mich an der Beschreibung vom "Demystifying the TLC5940" 
von Matthew Pandina orientiert (Viel Dank an Matt an dieser Stelle).
Hat auch alles super funktioniert bis ich die Hardware SPI mit eingebaut 
habe. Ich habe mich im Forum auch schon umgesehen, bin aber der Meinung 
das die SPI eigendlich richtig gestalltet ist.
Nachdem ich mich jetzt 2 Wochen intensiv damit beschäftigt habe und ich 
leider immer noch nicht weiß warum die Hardware SPI nicht funktioniert 
hoffe ich das mir hier jemand weiterhelfen kann. Ist ja vermutlich nur 
eine Kleinigkeit.
Der Code ist im Anhang und die Beschaltung vom TLC auch.

Schon mal Danke für eure Bemühungen im vorraus.
Angehängte Dateien:
(Firma: fritzler-avr.de) #4531523
Lesenswert?

Häng doch mal nen Logic Analyzer an den SPI udn guck ob überhaupt was 
kommt.

ANsonsten guck nochmal ins Datenblatt des LED Treibers, der ist nicht 
soo ganz SPI kompatibel.

After all data is clocked in, a high-level pulse of XLAT
signal latches the serial data to the internal registers.
The internal registers are level-triggered latches of XLAT

So und wie war nochmal die normale polarität vom Chipselect eines SPI 
;)?

Alles weietre im datenblatt unter 8.3.1 Serial Interface
Sollte unbedingt zu 100% verstanden sein.
OP #4531761
Lesenswert?

Hallo Martin,

>After all data is clocked in, a high-level pulse of XLAT signal latches<
>the serial data to the internal registers. The internal registers are<
>level-triggered latches of XLAT<

guter Hinweis, habe natürlich an den XLAT gedacht, hab auch ein Programm 
mit Soft SPI was schon funktioniert möchte aber lieber die Hardware 
verwenden. Weil das doch einiges einfacher macht.
Das Datenblatt kann ich bald auswendig...
Denke es hängt am Mikrokontroller, hier muss irgendwo der Bock begraben 
sein, es kommt kein passendes Ausgangssignal.

>So und wie war nochmal die normale polarität vom Chipselect eines SPI<
>;)?<

Ich verwende SPI Mode 0
#4531769
Lesenswert?

@ Peter Bauer (shaphard)

>Denke es hängt am Mikrokontroller, hier muss irgendwo der Bock begraben
>sein, es kommt kein passendes Ausgangssignal.

Das ist oft ein Irrtum ;-)

>Ich verwende verwende SPI Mode 0

Kommen denn überhaupt irgendwelche Signale aus dem SPI?

Der Klassiker, gilt auch für die Xmega.

"If the SS pin is not used and is configured as input, it must be held 
high to ensure master operation. If the SS pin is set as
input and is being driven low, the SPI module will interpret this as 
another master trying to take control of the bus. To
avoid bus contention, the master will take the following action:
1. The master enters slave mode.
2. The SPI interrupt flag is set."

Welche Pin ist SS für dieses SPI-Modul?
#4531784
Lesenswert?

Kleiner Tip nebenbei. Bei den ATxmega Headern sollte man besser die 
normalen BitMASKEN (Endung _bm) nutzen, das spart vor allem sinnlose 
Tiparbeit. Mischformen sollte man möglichst vermeiden.

1
  //SPI Konfigurieren
2
  //max Spi-Takt F_CPU/2 = 16 Mhz. Pinkonfiguration für SPI-Master
3
  SPIC.CTRL = SPI_MODE_0_gc | SPI_PRESCALER_DIV4_gc| SPI_CLK2X_bm | SPI_ENABLE_bm | SPI_MASTER_bm;
4
  SPIC.STATUS = 0;
5
  SPIC.INTCTRL = SPI_INTLVL_OFF_gc;
OP #4531794
Lesenswert?

Hallo Falk,

>Welche Pin ist SS für dieses SPI-Modul?<

Der SS Pin liegt am Port C Pin 4 und ist mit dem Blank Pin vom TLC 
verbunden

definiert ist er als Ausgang und initial auf High gesetzt
1
#define GSCLK_PORT PORTC
2
#define GSCLK_PIN 2
3
//SIN TLC = MOSI
4
#define SIN_PORT PORTC
5
#define SIN_PIN 5
6
//SCLK TLC = CLK 
7
#define SCLK_PORT PORTC
8
#define SCLK_PIN 7
9
//Blank TLC = SS
10
#define BLANK_PORT PORTC
11
#define BLANK_PIN 4
12
#define DCPRG_PORT PORTC
13
#define DCPRG_PIN 0 
14
#define VPRG_PORT PORTC
15
#define VPRG_PIN 3  
16
#define XLAT_PORT PORTC
17
#define XLAT_PIN 1
18
//MISO wird nicht gebraucht
19
#define MISO_PORT PORTC
20
#define MISO_PIN 6

1
void TLC5940_Init(void) {
2

3
  setOutput(GSCLK_PORT.DIR,GSCLK_PIN);
4
  setOutput(SCLK_PORT.DIR,SCLK_PIN);
5
  setOutput(DCPRG_PORT.DIR,DCPRG_PIN);
6
  setOutput(VPRG_PORT.DIR,VPRG_PIN);
7
  setOutput(XLAT_PORT.DIR,XLAT_PIN);
8
  setOutput(BLANK_PORT.DIR,BLANK_PIN);
9
  setOutput(SIN_PORT.DIR,SIN_PIN);
10
  setLow(GSCLK_PORT.OUT, GSCLK_PIN);
11
  setLow(SCLK_PORT.OUT, SCLK_PIN);
12
  setLow(DCPRG_PORT.OUT, DCPRG_PIN);
13
  setHigh(VPRG_PORT.OUT, VPRG_PIN);
14
  setLow(XLAT_PORT.OUT, XLAT_PIN);
15
  setHigh(BLANK_PORT.OUT, BLANK_PIN);
16
    
17
  //SPI Konfigurieren
18
  //max Spi-Takt F_CPU/2 = 16 Mhz. Pinkonfiguration für SPI-Master
19
  SPIC.CTRL = SPI_MODE_0_gc | SPI_PRESCALER_DIV4_gc| (1<< SPI_CLK2X_bp) | (1<< SPI_ENABLE_bp) | (1<< SPI_MASTER_bp);
20
  SPIC.STATUS = 0;
21
  SPIC.INTCTRL = SPI_INTLVL_OFF_gc;
22
  
23
}

>Kommen denn überhaupt irgendwelche Signale aus dem SPI?<

leider nein nur der SS Pin ist High

mit den Bitmasken werd ich in Zukunft berücksichtigen
Gast #4532743
Lesenswert?

meine schon, er sollte mit was einfacherem anfangen, denn

>Nachdem ich mich jetzt
>2 Wochen
>intensiv damit beschäftigt habe und ich
>leider immer noch nicht weiß warum die Hardware SPI nicht funktioniert..
#4532775
Lesenswert?

Und das Schieberegister bewirkt genau was? Magie, und plötzlich kommen 
die SPI-Signale raus?

Der Op sollte erstmal die gleichen IO-Pins per Software wackeln lassen, 
dann weiß man erstmal, dass die IOs funktionieren. Dazu muss man nicht 
mal Soft-SPI machen, wackeln reicht. Danach wieder auf Hardware-SPI und 
weiter suchen. So viel kann man ja nicht falsch machen bei EINEM 
Konfigurationsregister. Ich vermute einen trivialen Fehler wie z.B. 
falsches Hex-File geladen etc.
OP #4533682
Lesenswert?

Schon mal Danke für die ganzen Antworten.
Ich werde erstmal ein einfaches SPI Programm schreiben und das so 
ausprobieren.

@Falk: Die Pins am Mikrocontroller funktionieren benutze die selben bei 
der Soft SPI

Ich meld mich sobald ich weiter Tests mit der Hardware SPI gemacht habe
OP #4620769
Lesenswert?

So bevor ich es endgültig vergessen habe...

ich habe meinen Fehler gefunden haben einen SPI Port vertauscht beim 
Wechsel von Soft auf Hard SPI, nach der Korrektur ist der SPI-Bus 
gelaufen.
Dann hat ich noch vergessen bei der Hard-SPI den GSCLK mit einem PWM 
Takt zu beschalten (Kopfschütteln) dadurch hat natürlich auch nichts 
geleuchtet. Jetzt geht alles.

Nochmal Danke an alle

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren