UCA0TXBUF=0x04;//Read display identification information
30
_delay_cycles(500000);
31
unsignedinta=UCA0RXBUF;
32
}
Der Plan war, dass sich das Display verfinstert durch die Inversion des
selbigen. Leider passiert nichts. Die Display Identifikation spuckt auch
nichts aus. Hat jemand einen Tipp für mich?
H. D. schrieb:> UCA0TXBUF = 0x11;//Sleep Out> _delay_cycles(500000);
Für eine spi-steuerung scheint das Beschreiben eines buffers ein bischen
kurz zu sein. Wo bleibt das CS Signal an den slave?
Beim ili9320 werden Register ausgewählt und mit Werten gefüllt. Das sind
immer 3bytes. wird beim 9420 auch nicht viel anders sein. Du hast nur 1
byte. Kann so eigentlich nicht stimmen.
Versuch mal das ganze als software-spi aufzubauen. Wenn das funktioniert
kannst du auf dem msp-spezifischen hardware-spi umstellen.
leluno schrieb:> Für eine spi-steuerung scheint das Beschreiben eines buffers ein bischen> kurz zu sein. Wo bleibt das CS Signal an den slave?
CS ist habe ich an GND gekettet.
leluno schrieb:> Beim ili9320 werden Register ausgewählt und mit Werten gefüllt. Das sind> immer 3bytes. wird beim 9420 auch nicht viel anders sein. Du hast nur 1> byte. Kann so eigentlich nicht stimmen.
Die verwendeten Commands scheinen lauf Datasheet
(http://www.orientdisplay.com/pdf/ILI9341.pdf) nur ein byte lang zu
sein.
leluno schrieb:> Versuch mal das ganze als software-spi aufzubauen. Wenn das funktioniert> kannst du auf dem msp-spezifischen hardware-spi umstellen.
Ich ich hatte gehofft, dass Hardware-SPI besser geeignet ist für den
Anfang, da weniger fehleranfällig.
H. D. schrieb:> Die verwendeten Commands scheinen lauf Datasheet> (http://www.orientdisplay.com/pdf/ILI9341.pdf) nur ein byte lang zu> sein.
auf Seite 64 ist der Aufbau eines spi-Befehls dargestellt. Das sind
mehrere Bytes, eingeleitet durch den Wechsel von cs von high auf low.
>CS ist habe ich an GND gekettet.
Das ist dann aber kein spi mehr.
Das kann so nicht gehen, weil du die Konventionen über den spi-
Datenaustausch – Seite 64 des manuals – nicht einhältst.
Du müsstest dir zunächst grundsätzliche Kenntnisse über den
Datenaustausch per spi verschaffen
leluno schrieb:> Du müsstest dir zunächst grundsätzliche Kenntnisse über den> Datenaustausch per spi verschaffen
Naja, das ist der Sinn dessen, das ich hier mache. Das Problem ist nur,
dass ich nicht damit rumprobieren kann, solange nichts geht, weil ich
keine Effekte sehe.
leluno schrieb:> Das kann so nicht gehen, weil du die Konventionen über den spi-> Datenaustausch – Seite 64 des manuals – nicht einhältst.
Ok, streichen wir einfach den letzten Befehl. Dann stehen da nur 3
Befehle, die keine Daten anfordern, folglich sollte es auch keine
Antwort geben, richtig?
Noch einmal zu dem CS: Ich dachte, dass das nur auswählt welcher Slave
verwendet wird, weshalb ich davon ausgegangen war, dass ich ihn einfach
immer aktivieren kann. Ist es stattdessen richtig, dass CS den Slave
auswählt und ihm den Startimpuls gibt, Daten zu empfangen/senden?
Wie kann das dann mit dem Hardware-SPI überhaupt funktionieren, wenn CS
nicht daran gekoppelt ist. Dann stimmt doch das Timing gar nicht.
Lese ich aus der Abbildung richtig, dass D/CX bei Befehlen dauerhaft 0
sein darf? Bzw. nur die D/CX Einstellung beim übertragen des letzen Bits
von Interesse ist?
H. D. schrieb:> Lese ich aus der Abbildung richtig, dass D/CX bei Befehlen dauerhaft 0> sein darf?
nein
Bzw. nur die D/CX Einstellung beim übertragen des letzen Bits
> von Interesse ist?
ja
auf dem von dir angegebenen link
(http://www.elecfreaks.com/wiki/index.php?title=2.2...)
ist ein verstädlicher code mit sw-spi abgedruckt. Nimm diesen Code und
versuch ihn nachzuvollziehen bzw. abzuarbeiten. Dann hast du eine
Chance, dein lcd zum laufen zu bringen.
Für eine eigene Entwicklung fehlen dir - mir auch- die Grundlagen.
LCD_Write_COM(0xB1);//Frame Rate Control (In Normal Mode/Full Colors)
121
LCD_Write_DATA(0x00);
122
LCD_Write_DATA(0x18);
123
124
LCD_Write_COM(0xB6);// Display Function Control
125
LCD_Write_DATA(0x08);
126
LCD_Write_DATA(0x82);
127
LCD_Write_DATA(0x27);
128
129
LCD_Write_COM(0x11);//Exit Sleep
130
_delay_cycles(120000);
131
132
LCD_Write_COM(0x29);//Display on
133
LCD_Write_COM(0x2c);
134
}
135
136
voidPant(charVL)
137
{
138
inti,j;
139
Address_set(0,0,240,320);
140
for(i=0;i<320;i++)
141
{
142
for(j=0;j<480;j++)
143
{
144
LCD_Write_DATA(VL);
145
}
146
}
147
}
148
149
voidsetup()
150
{
151
P1DIR=BIT0+BIT2+BIT3+BIT4+BIT5;
152
LCD_Init();
153
}
154
155
voidloop()
156
{
157
Pant(0xFF);
158
Pant(0xF0);
159
Pant(0xE0);
160
Pant(0x05);
161
Pant(0x1F);
162
Pant(0x00);
163
}
164
165
voidmain(void){
166
WDTCTL=WDTPW|WDTHOLD;// Stop watchdog timer
167
BCSCTL1=CALBC1_1MHZ;// Set range
168
DCOCTL=CALDCO_1MHZ;
169
BCSCTL3=LFXT1S_2;
170
BCSCTL2=0;
171
172
setup();
173
174
for(;;){
175
loop();
176
/*LCD_Write_COM(0x21);
177
_delay_cycles(500000);
178
LCD_Write_COM(0x20);*/
179
//_delay_cycles(500000);
180
}
181
}
Funktioniert soweit mit der Demo "loop".
leluno schrieb:> H. D. schrieb:>> Lese ich aus der Abbildung richtig, dass D/CX bei Befehlen dauerhaft 0>> sein darf?> nein>> Bzw. nur die D/CX Einstellung beim übertragen des letzen Bits>> von Interesse ist?> ja
Hm, aus dem Code geht hervor, dass D/CX immer 0 sein darf bei Befehlen.
Funktioniert auch.
Dieser Code lässt MISO komplett aus. Wird er nur ignoriert, da nichts
gelesen werden soll?
Mein nächster Schritt wird wohl die Umstellung auf Hardware-SPI sein.
Irgendwie muss das doch gehen!
H. D. schrieb:> Funktioniert auch.
Gratulation, das ist doch ein toller ERfolg, habe ich so schnell nicht
erwartet.
> Hm, aus dem Code geht hervor, dass D/CX immer 0 sein darf bei Befehlen.
Nach dem manual gibt es einen 3line(ohne dcx) und einen 4line modus (mit
dcx). 4line ist wahrscheinlich schneller. Sonst hätten die das nicht
gemacht.
Der umstieg auf hw ist so schwierig nicht. Du hast schon die richtige
Frage gestellt.
>...hardware-SPI überhaupt funktionieren, wenn CS
nicht daran gekoppelt ist. Dann stimmt doch das Timing gar nicht.
Normalerweise macht man das timing mit einer Warteschleife. musst du dir
in der msp dokumentation anschauen
leluno schrieb:>> Hm, aus dem Code geht hervor, dass D/CX immer 0 sein darf bei Befehlen.> Nach dem manual gibt es einen 3line(ohne dcx) und einen 4line modus (mit> dcx). 4line ist wahrscheinlich schneller. Sonst hätten die das nicht> gemacht.
Ich muss sowieso 4-wire nehmen.
1. Es ist fest so eingestellt bei dem Display.
2. Der MSP430 kann nur 7- oder 8-Bit-SPI
H. D. schrieb:> P1OUT &= ~LCD_CS;> UCA0TXBUF = data;> while(UCA0TXIFG & UC0IFG){> _delay_cycles(120000);> }> _delay_cycles(120000);> P1OUT |= LCD_CS;
das delay in der Schleife ist zumindest überflüssig
while(UCA0TXIFG & UC0IFG){;} bleibt so lange in der Schleife wie die
Bedingung erfüllt ist.
mÜSSTE aber trotzdem funktionieren. Bei anderen Systemen muss spi erst
initialisiert werden. Braucht man ds bei msp gar nicht?
H. D. schrieb:> void LCD_Init(void)> {>> P1OUT &= ~LCD_REST;> _delay_cycles(120000);> P1OUT |= LCD_REST;>> LCD_Write_COM(0xCB);//Power control A> LCD_Write_DATA(0x39);> LCD_Write_DATA(0x2C);
Du hast zwar bei Reset aktiv eine Pause, aber danach nicht. Das Display
braucht etwas Zeit, nachdem man den Reset deaktiviert hat.
Siehe Datenblatt, Kapitel 12.4.
Viele Grüße
Jens-Uwe
P.S.: Mein Display läuft auch ohne die vielen Registerinitialisierungen.
Es reicht RESET, SLEEP_OUT und DISPLAY_ON.
Christoph Kessler (db1uq) schrieb:> Witzbold
:-)
Freudscher Vertipper: ich meinte Kapitel 15.4
Aus den Ausführungen in Kapitel 12 werde ich auch nicht so richtig
schlau...
Viele Grüße
Jens-Uwe