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.
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.
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
@ 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?
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; |
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
>bin aber der Meinung >das die SPI eigendlich richtig gestalltet ist. dann mach zuerst Schaltung mit simplem Shift-Register zum testen der SPI.
@ 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.
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..
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.
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
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.