Liebe Mikrocontroller-Community, ich habe ein Display mit einem GT911 Touch-Controller, der per I2C angesteuert wird. Leider wurde offenbar ab einer bestimmten Revision die register map aus dem Datenblatt entfernt, und eine alte Version ist nur auf Chinesisch zu finden. Kann sich jemand erklären, warum der Hersteller sowas macht? Ich bin gerade ein wenig ratlos wie man ohne diese map damit arbeiten soll. Übersehe ich da irgendwas offensichtliches? Ich habe ein Datenblatt eines ähnlichen ICs des Herstellers gefunden, in dem möglicherweise die gleiche register map benutzt wird. Allerdings scheint der Controller keine Berührung zu erkennen, da sowohl der Interrupt-Ausgangständig auf Low bleibt, der den uC über eine Berührung informieren soll, als auch die Register, in denen mutmaßlich die Positionen stehen, Null sind. Im Datenblatt steht nicht, ob man noch irgendwas initialisieren muss, oder was sonst noch zu tun ist. Hat jemand Erfahrung mit diesem oder anderen Touch-Controllern, der mir sagen kann ob man da normalerweise irgendwelche bestimmten Einstellungen vornehmen muss bevor überhaupt irgendwas erkannt wird?
moritz schrieb: > ich habe ein Display mit einem GT911 Touch-Controller Wie schön für dich. Also:
1 | /* der Block ab 0x8140 im GOODIX GT911 */
|
2 | /* Block wird beim Init des Touch vom Controller gefüllt! */
|
3 | struct TIdentInfo |
4 | { char ProductID[4]; |
5 | byte BCDFirmwareLO; |
6 | byte BCDFirmwareHI; |
7 | byte XResolutionLow; |
8 | byte XResolutionHigh; |
9 | byte YResolutionLow; |
10 | byte YResolutionHigh; |
11 | byte VendorID; |
12 | };
|
13 | |
14 | struct TouchKoordinaten |
15 | { byte TrackID; |
16 | byte X_low; |
17 | byte X_high; |
18 | byte Y_low; |
19 | byte Y_high; |
20 | byte Size_low; |
21 | byte Size_high; |
22 | byte reserved; |
23 | };
|
24 | |
25 | struct TCoordinateInfo |
26 | { byte BufferStatus; |
27 | struct TouchKoordinaten Point[5]; |
28 | };
|
29 | |
30 | /* die Adressen im Touch-Controller */
|
31 | #define EventFeld 0x814E // hier struct TCoordinateInfo
|
32 | #define EventLaenge (1+(5*8))
|
33 | |
34 | #define Kommandofeld 0x8040
|
35 | #define KommandoLaenge 1
|
36 | |
37 | #define VendorIdent 0x814A
|
38 | #define VendorLaenge 1
|
39 | |
40 | #define KonfigFeld 0x8047
|
41 | #define KonfigLaenge (1 + 0x8100 - 0x8047)
|
42 | |
43 | #define IdentVersion 0x8140
|
44 | #define IdentLaenge 10
|
moritz schrieb: > Allerdings > scheint der Controller keine Berührung zu erkennen, da sowohl der > Interrupt-Ausgangständig auf Low bleibt, der den uC über eine Berührung > informieren soll, als auch die Register, in denen mutmaßlich die > Positionen stehen, Null sind. Da liegst du aber daneben. Also, der Touchcontroller versucht ganz verzweifelt, seine Touchdaten loszuwerden, schafft es aber nicht. Deshalb ist INT auch ständig low. Ja, es ist ein SCHEISSTRICK, den uns der Hersteller nicht verraten hat: Um die Daten abholen zu können, mußt du im Interruptprogramm zunächst das byte Bufferstatus mit einer Null beschreiben und dann erst die 5 Koordinatenblöcke auslesen. Sonst wird das nichts in Ewigkeit. Also nochmal: - Int geht auf low, damit soll die ISR gestartet werden - ISR: zuerst schreibe auf Adresse 0x814E im Touchcontroller ne 0 - ISR: lies aus Touchcontroller ab 0x814E alles aus, also den ganzen struct TCoordinateInfo. - jetzt sollte für etwa 13 ms INT wieder auf high gehen. Noch ne Besonderheit dieser Controller: Sie kennen kein Touch-Up Event. Du mußt also im µC eine Zeitüberwachung einbauen: Wenn für so etwa 100..200 ms kein INT vom Touchcontroller gekommen ist, dann bedeutet das, daß der/die Finger vom Display entfernt worden sind, also generiere dann ein Touch-Up Ereignis. Im Gegensatz dazu kennen die FT5336 sowohl Touch-DOWN, Touch-MOVE als auch Touch-UP. W.S.
Wao, ich bin sprachlos! Das hätte mich bestimmt Tage gekostet das herauszufinden (wenn überhaupt). Damit hast du mir wirklich weitergeholfen, vielen lieben Dank für die Erklärung und Mühe!
Hallo W.S. ich stand vor dem gleichen Problem wie Moritz. Vielen Dank für deinen ausführlichen Erklärungen. Das man den Bufferstatus zurücksetzen muss steht in den offiziellen Datenblätter nicht. Ein Touch Up Event kennt dieser Controller schon. Er wird jedoch nur ersichtlich wenn die Reihenfolge geändert wird in der ISR: 1. Int geht auf low, damit soll die ISR gestartet werden 2. ISR: lies aus Touchcontroller ab 0x814E alles aus, also den ganzen struct TCoordinateInfo. Das Byte an der Adresse 0x814E zeigt an wieviele Finger erkannt wurden (Bit 0 - 3). Wenn Touch Up dann ist bit0-3 = 0. Wenn Bit7 = 1, dann sind die Koordinaten gültig. Bit7 = 0, Daten ungültig 1ms später nochmals auslesen 3. ISR: schreibe auf Adresse 0x814E im Touchcontroller ne 0 Gruss Markus Update: Mittlerweile habe ich ein GT911 Programming Guide gefunden: https://www.google.com/url?sa=t&rct=j&q=&esrc=s&source=web&cd=2&ved=2ahUKEwjrirXZsvrkAhVQqaQKHTYjD4IQFjABegQIABAC&url=https%3A%2F%2Fwww.crystalfontz.com%2Fcontrollers%2FGOODIX%2FGT911ProgrammingGuide%2F478%2F&usg=AOvVaw1b9mH08uDh7bQ-djXDwEVQ Auf Seite 26 ist der Readout Process beschrieben.
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.