Hallo Leute,
ich habe eine kleine Schaltung mit einem ATXMega32e5 aufgebaut. Dieser
XMega hat ein SPI Flash (AT45DB161D), 3 PWM kanäle für RGB-LEDs und
einen für Sound sowie ein UART-Wlan Modul (ESP8266). Dabei nutze ich:
PWM Leds: PC0-PC2
PWM-Sound: PD5
SPI auf PORTC
UART auf PORTD
Soweit so gut.
Jetzt das Problem: Ich bekomme nichts zum Laufen auf dem XMega32e5
(meine Erfahrungen mit der A-Serie ging gut).
Ich habe folgende Phänomene:
Ich kann die PWM-Kanäle initialisieren und beschreiben (funktioniert,
siehe Quellcodeauszug).
1
//Timer PWM Configs
2
//Timer Counter 0 Type
3
TCC4.CTRLE=TC45_BYTEM_NORMAL_gc;//8-Bit Timer
4
TCC4.CTRLE=TC45_CCAMODE_COMP_gc|TC45_CCBMODE_COMP_gc|TC45_CCCMODE_COMP_gc;//Ausgabe bei A&B&C
5
TCC4.CTRLA=TC45_CLKSEL_DIV4_gc;//4 Div, 31,25khz
6
TCC4.CTRLB=TC45_WGMODE_SINGLESLOPE_gc;//SingleSlope mit PER als TOP
Jetzt wird es Interessant und es kommt das Problem:
Wenn ich SPI initialisiere, dann geht dieser außer MISO-Pin. Dieser
treibt weak gegen Masse (wenn ich bspw. Kurzschluss vom MISO und
SCK-Signal mache, habe ich auf MISO max. 1,5V als HIGH).
Wenn ich vom HW-PWM Initialisierung folgende Zeilen auskommentiere:
1
TCC4.CTRLE=TC45_BYTEM_NORMAL_gc;//8-Bit Timer
2
TCC4.CTRLE=TC45_CCAMODE_COMP_gc|TC45_CCBMODE_COMP_gc|TC45_CCCMODE_COMP_gc;//Ausgabe bei A&B&C
3
TCC4.CTRLA=TC45_CLKSEL_DIV4_gc;//4 Div, 31,25khz
dann geht das SPI nicht mehr. Es geht genauso wenig wenn ich
1
spi->port->DIRCLR=SPI_MISO_bm;
2
spi->port->PIN6CTRL=PORT_OPC_PULLUP_gc;
3
4
zu
5
6
spi->port->DIRCLR|=SPI_MISO_bm;
7
spi->port->PIN6CTRL=PORT_OPC_PULLUP_gc;
ändere. Dies bewirkt zwar dann, dass MISO wirklich INPUT gepullt ist,
dafür geht kein SPI mehr.
Ich habe das Gefühl, dass irgendwas da gesetzt ist, was irgendwelche
Portzugriffe überschreibt. Ich verstehe das absolut nicht. Es läuft auf
internem OSC mit 32MHz.
Hier die Initialisierung vom SPI.
Get das SPI an sich NUR (!) wenn ich die 3 ersten Zeilen vom TCC4
einkommentiere. Jedoch ist dabei das Signal auf MISO immer 0V. Wenn ich
ein High Signal (bspw Brücke zu SCK) herstelle, habe ich das Signal
jedoch mit einem max. Pegel von 1,5V, anstelle der 3,3V.
Dann poste bitte den kompletten Code oder ein Minimalbeispiel, das sich
genauso verhält wie von dir beschrieben. Anders lässt sich das nicht
sinnvoll gegenprüfen.
Es könnte sich höchstens jemand dazu äußern, der den ATxmega32e5 selbst
einsetzt und den SPI benutzt.
Hallo,
verste ich das richtig, dass man dann quasi keine Peripherie nutzen
kann, sobald Timer auf PORTC aktiviert ist?
Was haben die denn da gebaut?!
Aber! Jetzt trotzdem mal eine Sache: Lässt sich denn NUR das SPI
aktivieren auf PORTC? Also wenn man Timer komplett deaktiviert lässt,
das geht nämlich auch nicht bei mir.
Hatte schonmal sowas ähnliches mit den ATXMega256D3, da bin ich dann auf
A1 umgestiegen - schrecklich!
Wenn das in den Errata stimmt, wäre das ärgerlich. Aber dann müsste es
ohne die Timer ja gehen.
Eine letzte Frage hätte ich daher trotzdem:
wie sind die Macros
FLASH_ON;
AT45DB_SELECT;
definiert? Vielleicht hat sich genau hier der Fehler eingeschlichen. Der
Rest vom Code sieht durchaus richtig aus. Das Fehlerbild würde passen,
wenn der Chip keine Spannung bekommen würde. Dass auch die gemessen
wurde, konnte ich den Posts nicht entnehmen.
Hallo,
Spannungen passen alle, auch als Kontakte.
FLASH_ON schaltet nur den Reset Pin des Flash auf High
Select schaltet den Cs/Ss pin des flash auf low.
Hallo nochmal,
ich würde versuchen zu pfuschen. Ist es wohl möglich, dass Signal per
HW-SPI zu senden und per Software-SPI an anderem PIN auszulesen? Dann
kann die HW und der Chip bleiben, sonst ist es arg viel Mehraufwand für
mich...
Auch wenn der Thread schon etwas älter ist: Master SPI über USART geht,
auch wenn der Timer4 aktiv ist. Das USART muss auf die oberen Pins 5/6/7
des Ports gemappt sein.
Ahh okay das ist gut zu wissen. Jetzt wäre nur noch die Frage, ob der
nen Bootloader unterstützt, denn mein Bootloader der bei den A-Series
XMEGA geht, findet keine SPM Enable bits.