Hallo
Das Problem ist, dass ich den SPI einfach nicht zum ordnungsgemässen
Funktionieren bringe. Der AVR ist ein Mega328p, und ich will über den
SPI ein Grafikdisplay ansteuern.
Dazu verwende ich den Hardware-SPI, jedoch nicht das SS-Signal des SPI
sondern ein separates chip select Signal, weil später einmal mehrere
Slaves damit angesteuert werden sollen. Der SS-Pin ist als Out
konfiguriert und unbenutzt.
Beiliegend ein KO-Bild, oben Clock und unten MOSI, mir scheints die
Datenpulse sind nicht ganz sauber, sehe ich das recht? Die dürfen ja
wohl nicht so verschiedene Breiten haben, oder?
Wenn dem so ist, was könnte das Problem sein? Ich habe den Takt so weit
runter geschraubt wie möglich, bei einem 8MHz-Quarz habe ich die
CLKDIV8-Fuse gesetzt und den SPI-Taktteiler nochmal auf 128 eingestellt.
Wahrscheinlich übersehe ich irgendwas, da ich auch kein geübter
SPI-Benutzer bin...
Grüsse
Martin
Da ist garnichts kurios:
SPI sendet 8bits am Stück, dazwischen ist halt eine mehr oder weniger
große Pause in der Clock länger ist, und MOSI auf high liegt. Also
vollkommen normal.
Der Fehler liegt also wo anders.
Danke für eure Antworten.
@Bensch: Ich versuche gar nicht zu empfangen, weil der Slave nicht
gelesen werden kann. Es handelt sich um ein BL12896A-Display.
@Michael M: Beiliegend die Display-Treiber .c und .h (abgeändert von
Luminary Micro).
main sieht so aus:
Wie sieht denn die Beschaltung aus? Ohne die sagen uns deine
Port-Konfigurationen leider nichts.
Es ist desweiteren moeglich, dass du reset falsch angeschlossen, chip
select invertiert und/oder D0/D1 vertauscht hast. Das sehen wir im Code
nicht :)
> @Bensch: Ich versuche gar nicht zu empfangen, weil der Slave nicht
gelesen werden kann. Es handelt sich um ein BL12896A-Display
Also wenn das Display nichts empfangen soll, warum dann das Ganze?
Nochmal gaaaaanz langsam: Sender=AVR, Empfänger=Display.
Wenn also das Display auf der negativen Flanke sampled, geht schief.
Ok klar, hatte ich ganz vergessen. Die Beschaltung ist wie folgt:
SS = B2 (wie erwähnt unbenutzt)
MOSI = B3
MISO = B4
SCK = B5
Display D/C = C0
Display RES = C1
Display CS = C2
@Bensch: Doch das Display soll empfangen, aber kann nichts senden.
Beiliegend noch das Timing-Diagramm aus dem Datenblatt, meiner Meinung
nach siehts schon so aus als ob bei steigender Flanke gelesen wird.
Das Display wird nie resettet (RES_DISP ist unbenutzt). Da du VCC nicht
ueber den uC steuerst, wirst du die specs nicht einhalten koennen (VDD
an, Reset, VCC an). Vermutlich nicht tragisch, aber erwaehnenswert.
Schau also bitte mal, ob es schon funktioniert, wenn du vor dem SPI-Init
das Display resettest (C1 low fuer >3uS, ab dann konstant high).
Geile Sache, vielen Dank für den Hinweis! Ich habe also
OLED_CMD_PORT &= ~(1<<RES_DISP);
_delay_us(10);
OLED_CMD_PORT |= (1<<RES_DISP);
vorne in die SSD1329_Init() geschrieben und siehe da, endlich eine
Anzeige auf dem Display!
Danke dir und allen anderen für die Hilfe, falls ich später weitere
Fragen habe melde ich mich natürlich gerne wieder!
Grüsse
Martin
Freut mich, dass es funktioniert.
Kleiner Hinweis am Rande: meine Aussage, dass der Controller nie
resettet wird, war falsch - er wird vielmehr staendig resettet, da
reset invertiert ist und nie auf high gesetzt wird.