Forum: Mikrocontroller und Digitale Elektronik TLC5940 mit XMEGA ansteuern


von Peter B. (shaphard)


Angehängte Dateien:

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.

von Mw E. (Firma: fritzler-avr.de) (fritzler)


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.

von Peter B. (shaphard)


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

: Bearbeitet durch User
von Falk B. (falk)


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?

von Falk B. (falk)


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;

von Peter B. (shaphard)


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

von MCUA (Gast)


Lesenswert?

>bin aber der Meinung
>das die SPI eigendlich richtig gestalltet ist.
dann mach zuerst Schaltung mit simplem Shift-Register zum testen der 
SPI.

von Falk B. (falk)


Lesenswert?

@  MCUA (Gast)


>>bin aber der Meinung
>>das die SPI eigendlich richtig gestalltet ist.

>dann mach zuerst Schaltung mit simplem Shift-Register zum testen der
>SPI.

Wenn aus den Pins keine Signale kommen, braucht er auch kein 
Schieberegister.

von MCUA (Gast)


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..

von Falk B. (falk)


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.

von Peter B. (shaphard)


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

von Peter B. (shaphard)


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

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.