Hallo, ich möchte ein TFT mit einem Epson S1D13748 ansteuern. Ich nutze dazu Routinen, die ich auch für ein RAM (auch auf der Platine) verwende (diese funktionieren auch soweit). Mein Ozsi sagt mir, dass die Daten korrekt am Chip ankommen, der gibt aber keinen Ton von sich. Der Oszillator läuft, aber selbst die asynchronen Register liefern immer nur 0x0000 zurück. Ich habe schon versucht die Powersave und PLL Controlregister zu beschreiben, leider bringt das aber auch nicht den gewünschten Erfolg. Gibt es vielleicht einen Trick bei den Controllern, den ich übersehen habe ? Grüße Stampede
Monolog geht weiter: Was ich auch nicht ganz verstehe: Wenn die asyncronen Register immer verfügbar sind, dann doch auch bevor ich die PLL etc. konfiguriert habe. Wenn dann da aber steht dass ich x Takte ein Signal anlegen muss, woher soll ich wissen, wie lange das ist ? Ich kann doch nicht auf gut Glück da mal was reinschreiben und hoffen, dass es geht. Wer hat sich sowas bloß ausgedacht?
Stampede wrote: > Was ich auch nicht ganz verstehe: Wenn die asyncronen Register immer > verfügbar sind, dann doch auch bevor ich die PLL etc. konfiguriert habe. Ja. > Wenn dann da aber steht dass ich x Takte ein Signal anlegen muss, woher > soll ich wissen, wie lange das ist ? Wo steht das? Passt der eingestellte Busmodus zum verwendeten?
Hallo Benedikt, schön, dass einer antwortet. Ich habe das Indirect 80 Interface gewählt, Datenformat Big Endian. Das Interface sieht so aus wie auf Seite 44 des DB: http://vdc.epson.com/index.php?option=com_docman&task=cat_view&gid=186&Itemid=99 Wenn man sich da beispielsweise t7 und t8 anschaut, weiß ich nicht wie lang die sein sollen. Habe den Controller mal so langsam gemacht wie mir möglich, da ist T(read low) über 1,5µs, die high time ist ca. 1µs. Das entspräche einem Takt von 1 MHz, eingestellt durch die PLL habe ich 58MHz. Aber ob das gelingt weiß ich nicht, denn ich kriege ja kein Feedback über die Register. Als CLKI nehme einen Oszilator mit 8Mhz (der läuft auch). Nach dem aktivieren der PLL warte ich 1ms, aber bringt alles nichts. Die Leitungen gammeln alle auf low... Ich sitze da schon den ganzen Tag vor und ich weiß einfach nicht mehr weiter >:(
Mal noch der Code für die Leseroutine :
1 | unsigned int ReadRegisterLCD(unsigned int Register) |
2 | {
|
3 | unsigned int data; |
4 | PMPSetAddress(0x00); // Dummy set |
5 | // SetIndexRegisterLCD();
|
6 | LCD_RS = 0; LCD_AUX = 0; |
7 | LCD_RS = 0; LCD_AUX = 0; |
8 | LCD_CS = 0; // |
9 | LCD_CS = 0; // |
10 | PMPMasterWrite((Register<<1)|0x1); // Adresse um ein nach links schieben, Bit0 gibt an, dass gelesen werden soll |
11 | // SetStatusRegisterLCD();
|
12 | LCD_RS = 1; LCD_AUX = 0; // |
13 | LCD_RS = 1; LCD_AUX = 0; |
14 | PMPMasterRead(); // Dummy Read |
15 | // SetDataRegisterLCD();
|
16 | LCD_RS = 0; LCD_AUX = 1; // |
17 | LCD_RS = 0; LCD_AUX = 1; |
18 | data = PMPMasterRead(); // Read Data |
19 | LCD_CS = 1; // |
20 | return data; |
21 | }
|
Stampede wrote: > schön, dass einer antwortet. Ich habe das Indirect 80 Interface gewählt, > Datenformat Big Endian. Welchen µC verwendest du? Irgendwas von Motorola? Die meisten anderen haben nämlich Little Endian. > Wenn man sich da beispielsweise t7 und t8 anschaut, weiß ich nicht wie > lang die sein sollen. Stimmt. Das Timing gilt wohl für die synchronen Register. Bei den Asynchronen dürfte das Timing nur durch irgendwelche Gatterlaufzeiten begrenzt sein, also um einiges unkritischer sein. Die Datenblätter von Epson sind leider nicht so ganz perfekt... Ich lese gerne das "REG[0002h] Product Information Register 1" aus, und verwende diese Info als Selbsttest des Busses. Vorher muss das "Power Save Mode Enable" Bit gelöscht werden, aber das hast du ja schon drin.
Ich nutze einen PIC32, dort das PMP Modul für die IO Zugriffe. Da bietet sich Big Endian und 80 INterface an. >Ich lese gerne das "REG[0002h] Product Information Register 1" aus, und >verwende diese Info als Selbsttest des Busses. Genau das versuche ich ja verzweifelt. Aber da ist alles 0. Vorher rufe ich das hier auf:
1 | void InitializeLCD(void) |
2 | {
|
3 | LCD_CS_TRIS = 0; |
4 | LCD_CS = 1; |
5 | LCD_RS_TRIS = 0; |
6 | LCD_VEN_TRIS = 0; |
7 | LCD_VEN = 1; |
8 | LCD_AUX_TRIS = 0; |
9 | mPMPOpen(PMP_LCD_CONTROL, PMP_LCD_MODE, PMP_LCD_PORT, PMP_LCD_INTERRUPT); |
10 | DelayMs(1); |
11 | WriteRegisterLCD(REG0018_SYSTEM_CLOCK ,0x0000); |
12 | WriteRegisterLCD(REG000C_PLL_0,0x3B07); // 0x§B: PLL Teiler 08: Input devide by 3+1=4 |
13 | WriteRegisterLCD(REG000E_PLL_1,0x0002); // Given by datasheet |
14 | WriteRegisterLCD(REG0010_PLL_2,0x0810); // Given by datasheet |
15 | WriteRegisterLCD(REG0012_PLL_3,0x0000); // Enable PLL |
16 | DelayMs(1); |
17 | WriteRegisterLCD(REG0014_MISC_CONFIG,0x0000); // |
18 | DelayMs(1); |
19 | |
20 | }
|
Es scheint mir so, als würde das der Kontroller gar nicht reagieren. Der versucht an keiner Stelle mal einen Pin auf high zu ziehen. Das PMP Modul sollte richtig konfiguriert sein, schließlich läuft der RAM damit (mit Latches und allem drum und dran). Hardware schon 10 Mal kontrolliert, ich kann einfach keinen Fehler finden... Hast du noch ne Idee ? Grüße Stampede
Stampede wrote: > Hast du noch ne Idee ? Ich sags mal so: Nachdem ich die Hardwarefehler alle beseitigt hatte, und die Software das Bustiming richtige machte, und nachdem der Power Save Mode abgeschaltet war, lief bei mir bisher jeder Epson Contoller. Bist du wirklich sicher, dass der PIC32 Big Endian auf dem externen Bus verwendet?
Benedikt K. wrote: > Stampede wrote: > >> Hast du noch ne Idee ? > > Ich sags mal so: > Nachdem ich die Hardwarefehler alle beseitigt hatte, und die Software > das Bustiming richtige machte, und nachdem der Power Save Mode > abgeschaltet war, lief bei mir bisher jeder Epson Contoller. > > Bist du wirklich sicher, dass der PIC32 Big Endian auf dem externen Bus > verwendet? So, Datenformat litte endian, timing so lahm wie irgend geht, CNF alle low, Powersave sollte off sein (obwohl die asynchronen ja angeblich so gehen), aber gleiches Bild. Das Statusregister 2 bleibt 0, andere Register auch. Hardware hab ich mal in den Anhang gepackt, sollte meines Erachtens auch ok sein. Ich weiß einfach nicht weiter .... oder übersehe ich einfach etwas ? Ich werde morgen mal den 36 Kanal Logikanalyser auf der Arbeiten dranwerfen, vielleicht gibt das Aufschluss. Gruß Stampede
Zitat aus dem Datenblatt: After power-on, an active low hardware reset pulse, which is two external clock cycles (CLKI) in length, must be input to the S1D13748B00 RESET# pin. All registers, including the Clock Configuration registers (REG[000Eh] ~ REG[0018h]) are reset by a hardware reset. After releasing the RESET# signal, the Clock Configuration registers are immediately accessible. Wenn ich davon ausgehe, dass der Quarzoszillator ein paar ms zum Starten braucht, denke ich nicht dass das RC Glied Reset solange auf Low hält. Keine Ahnung ob es daran liegt, aber versuch mal Reset etwas länger bzw. später auf Low zu ziehen, damit der 13748 wirklich 2 Takte während Reset erhält.
Der R167 (deine Reset-Kombination) kommt mir etwas sehr groß vor. Kann es sein, dass der S1D nie aus dem Reset kommt?
So, es geht nun, der Kontroller spricht. Hatte einen durch eine zu hohe PLL Spannung zerschossen. Aber das Gerätsele geht weiter: Was muss in die Register 0x40 und 0x42 (LCD1 Horizontal Total Register und LCD1 Horizontal Display Period Register) ? In das eine würde ich passen für 640 Pixel beschreiben, aber das andere? Hat da jmd mal ne kurze Erklärung ? Oder was soll das sein, Register 0x46: Horizontal Pulse Width in pixels ? Pulseweite wird für mich in sek gemessen.... verstehe ich grad gar nicht... Gruß Stampede
Hans W. schrieb: > In das eine würde ich passen für 640 Pixel beschreiben, Ja. > aber das andere? Hat da jmd mal ne kurze Erklärung ? Das ist die gesamte Bildbreite inkl. Zeilenrücklauf wie das bei CRTs hieß. Bei 640x480 liegt der übliche Wert um die 800, genaueres sollte im Datenblatt vom TFT stehen. > Oder was soll das sein, Register 0x46: Horizontal Pulse Width in pixels > ? Pulseweite wird für mich in sek gemessen.... verstehe ich grad gar > nicht... Für den Controller sind Pixel die Zeitbasis. Bei 640x480 beträgt der Pixeltakt meist 25,1MHz. Ein Pixel entspricht daher etwa 40ns. Auch dieser Wert sollte im Datenblatt des TFTs zu finden sein.
Aha, jetzt kommen wir der Sache langsam näher. Auf der Seite 17 scheint mir die relevanten Informationen zu stehen. Danke, das hilft mir schon mal weiter. Melde mich wenn ich nicht weiterkomme...
Das IC ist echt der Wahnsinn: Das Statusregister (0x2) lässt sich korrekt auslesen, bei allen anderen (asyncronen) Registern kommt nur 0x0 raus, obwohl für den Defaultzustand was ganz anderes angegeben ist. Ich verstehe das Teil einfach nicht !
Hallo, ich muss diesen alten Thread nochmal aktivieren, es tut sich wieder was. Die Kommunikation geht nun einwandfrei, der Chip sitzt nun auf einer neuen Platine. Zum Problem: Die Einstellungen für die Displaytakte sind mir einfach noch nicht ganz klar. Irgendetwas ist da auch nicht ok, denn es treten 2 Fehler auf: 1. Das Display flaktert in der linken Hälfte deutlich, rechts ist das nicht der Fall. 2. Die Backgroundfarbe lässt sich nicht korrekt einstellen. Wenn ich das entsprechende Register auf max. Rot setzte kommt so ein Blau raus, bei max. Blau so ein Rostbraun. Das lässt mich darauf schließen, dass die Daten nicht richtig beim LCD ankommen (HSYNC falsch etc.) Ich habe die Register wie folgt initialisiert:
1 | setReg(0x0040, (horTotal / 8) - 1); // LCD1 Horizontal Total (FPLINE Period) Register |
2 | setReg(0x0042, (DISP_HOR_RESOLUTION / 2) - 1); // LCD1 Horizontal Display Period Register |
3 | setReg(0x0044, 0x0009); // LCD1 Horizontal Display Period Start Position Register |
4 | setReg(0x0046, 0x001E); // LCD1 Horizontal Pulse (FPLINE) Register |
5 | setReg(0x0048, 0x0064); // LCD1 Horizontal Pulse (FPLINE) Start Position Register |
6 | setReg(0x004A, verTotal - 1); // LCD1 Vertical Total (FPFRAME Period) Register |
7 | setReg(0x004C, DISP_VER_RESOLUTION - 1); // LCD1 Vertical Display Period Register |
8 | setReg(0x004E, 0x0000); // LCD1 Vertical Display Period Start Position Register |
9 | setReg(0x0050, 0x0003); // LCD1 Vertical Pulse (FPFRAME) Register |
10 | setReg(0x0052, 0x0000); // LCD1 Vertical Pulse (FPFRAME) Start Position Registe |
Im Detail: Der Pixeltakt ist auf 27.5MHz eingestell, was laut DB des LCD ok ist 0x40: LCD1 Horizontal Total: horTotal = 844, laut DB typ 750 bis 850 0x42: LCD1 Horizontal Display Period Register: DISP_HOR_RESOLUTION = 640 0x44: LCD1 Horizontal Display Period Start Position Register: 9, da erlaubter Minimalwert ? 0x46: LCD1 Horizontal Pulse (FPLINE) Register: 0x1E = 30 Takte ? 0x48: LCD1 Horizontal Pulse (FPLINE) Start Position Register 0x64 = 144 ?? Stimmt das?? Takte ab gültigem Framebeginn? 0x4A: LCD1 Vertical Total (FPFRAME Period) Register: horTotal = 525 0x4C: LCD1 Vertical Display Period Register: DISP_VER_RESOLUTION = 480 0x4E: LCD1 Vertical Display Period Start Position Register: 0 ??? 0x50: LCD1 Vertical Pulse (FPFRAME) Register: 6 ? 0x52: LCD1 Vertical Pulse (FPFRAME) Start Position Register: 0 ? Bei den Werten ohne "?" denke ich mal, dass die stimmen. Aber bei den anderen? Kann mir da jmd helfen?+ Sonst sollten die Register passen, habe dem LCD entsprechend 24Bit RGB eingestellt. Gruß Stampede
Hi, das mit der Farbe hat sich nun erledigt, musste die controllerinterne LUT abschalten. Das Geflimmere ist aber immer noch vorhanden.
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.