Fonctionnement d'une puce ILI9341

Bonjour à tous.
Je voudrais vous posez des question, assez difficile à résoudre, je suppose :

Comment fonctionne une puce ILI9341, pour contrôler son écran ?
Comment afficher un pixel sur son écran en envoyant des signaux à ses broches, sans bibliothèque ?
Comment détecter si c'est bien une puce ILI9341 et pas une puce ILI9486 ?

Répondez aux questions une par une, si vous le voulez bien.

:warning:
Post mis dans la mauvaise section, on parle anglais dans les forums généraux. déplacé vers le forum francophone.

Merci de prendre en compte les recommandations listées dans Les bonnes pratiques du Forum Francophone

Désolé. Mais pour en parler, je tenais à dire que si on met dans Français, Il n'y a que trois possibilités de catégories et, la catégorie questions n'apparaît pas dans le forum français. Voilà.

Bonjour

En consultant les Bonnes Pratiques du Forum Francophone on découvre vite où et comment poser ici les questions

Document , bien mis en évidence, dont @UKHeliBob a donné le lien

3 catégories, plus une qui sert pour tout le reste, en particulier les questions et demandes d'aide.
Donc, maintenant, tu es au bon endroit.

Est-ce une question purement rhétorique, ou bien est-ce lié à un écran en particulier ? Dans ce cas, vas directement au fait et à la vraie question, avec des références, photos voire un code que tu aurais déjà commencé, on gagnera du temps à essayer de chercher ton problème.

Pour la première question , @techvij , rien de plus complet que la notice technique du circuit intégré ILI9431

On y découvre une floppée de registres avec des fonctions bien définies.

Pour le 'sans bibliothèque' de la econde question : oui, en envoyant au bon moment, les bonnes infos dans les bons registres on peut , si on est très motivé et un peu maso, se passer de bibliothèque.

Merci. J'ai déja fait des recherches, mais rien d'accessible.
Maintenant, je vais voir le lien.
Mais tout est en anglais !
Je ne comprends pas, c'est compliqué !
Tous simplement, pour afficher un pixel, sans librairie, comment faire ?

Bonjour,

Pourquoi tu veux te passer de bibliothèque?
Pour répondre à ta question, tu trouveras les réponses dans la datasheet. Bon courage.
Pour t'aider tu peux t'inspirer du source de la librairie.

il faut :

  • configurer les registres qui vont assurer l'alimentation, le balayage correct de l'écran, le format de codage des couleurs. Il doit y avoir environ une bonne douzaine de registres pour faire ça (et encore je pense être optimiste en disant 12).
  • entrer les coordonnées x et y du point
  • entrer la valeur du point.

D'ailleurs, au passage, je pense que c'est ILI9341 et non ILI9431, mais je peux me tromper.

Concernant le 'sans bibliothèque', je dirais:

  1. si c'est un exercice de style ou un travail imposé, il faut apprendre à te débrouiller avec les datasheets. Mais il te faut la datasheet du ILI9341 mais aussi celle de la dalle TFT utilisée parce que la configuration du driver et très dépendante des caractéristiques de la dalle TFT
  2. si c'est juste par ignorance de ce qui t'attend, fais-toi une raison et utilise une bibliothèque.

Dans le cas 1. tu peux effectivement t'inspirer d'une bibliothèque existante mais alors où est l'intérêt?

je veux me passer de bibliothèque pour savoir toutes les fonctions, et ne pas avoir d'embetement avec les créations d'objets, etc..

#include<librairieecran>
création d'objet
//etc

Bon, je vois que vous essayez de me raisonner un peu, mais je suis têtu et je continue avec les bibliothèques.

MAIS. ce serait tout de même bien de savoir comment ça fonctionne, etc..

Une puce ILI9341, comme la plus part des pces qui gèrent les écrans TFT contient principalement une mémoire d'écran. Comme il s'agit d'un driver spécifiquement fait pour un écran 240x320 en 18 bits de couleurs, la mémoire est orienté en 12800 mots de 18 bits. Un séquenceur vient lire la mémoire et gère l'interface de sortie (3*240+320 sorties). Le circuit est programmable et des registres permettent de paramétrer les signaux, ainsi que de lire/écrire dans la mémoire...

Tout se fait par l'accès aux registres. Par exemple pour accéder à une case de la mémoire, il faut programmer deux registres donnant les deux coordonnés du pixel, puis en écrivant dans le registre tampon de donnée, on donne la valeur de la couleur.
Mais pour accéder aux registres, il y a une étape supplémentaire d'accès. Le ILI9341 possède plusieurs modes d'accès, aussi bien série que parallèle. Je suppose que celui dont tu dispose est déjà soudé sur un afficheur (sinon il faut avoir une pointe bien fine pour souder le millier de sorties du circuit). Dans ce cas les broches IM0:IM3 sont soudées hard et informent le ILI9341 du type de dialogue souhaité (série ou parallèle et lequel). En présence d'un écran possédant in ILI9341, on ne peut dialoguer que d'une seule façon. Ce qui veut dire que si j'écris pour un écran à ILI9341, un autre écran avec le même driver peur ne pas être compatible du tout, le dialogue étant différent.

Cela veut dire que pour accéder à un registre, il faut commencer par gérer des procédures simples "écrire dans un registre" et éventuellement "lire un registre".
Dans un deuxième temps initialiser le circuit (perso je compte 10 registres à programmer)
Dans un troisième temps seulement donner l'adresse du pixel et sa couleur

Je suis maso.... mais surtout intéressé par écrire en français (donc avec des accents), ce que ne permet pas Adafruit.

Si on a accès à la lecture des registres (il me semble que certains écrans sont câblés sans la possibilité de lire les registres), il suffit de demander la signature du driver. Pour un ILI9341, il faut lire l'ID4 du circuit:

  • Envoyer une commande 0xD3
  • Lire les 3 valeurs retournées qui suit. La première valeur n'a pas d'information (valeur poubelle), les deux octets qui suivent sont 0x93 et 0x41. 9341 en clair
    Pour un ILI9486, après écriture d'une commande 0xD3, on doit lire XX009386
    Les driver pour TFT on en principe un Id lisible, mais qui ne se trouve pas aux même adresses. Par exemple un ST7781 c'est suite à une commande en 0x00 et pas en 0xD3.
    Pour identifier un driver, il faut en gros lire pleins registres et voir si il n'y a pas une correspondance avec un connu. C'est ainsi que procède Adafruit, en début de programme, ils testent certains registres pour identifier la puce et agir ensuite en conséquence.

Une autre solution pour connaitre la puce est de faire tourner un programme écrit pour un driver. Ceux ci sont suffisamment différents pour qu'un programme spécifique pour un driver ne tourne pas avec un autre (écran blanc alors)

La dernière solution est d'utiliser un programme de test qui sait rechercher le driver.

[edit]
le ILI9341 ne permet de gérer que des écrans 240x320 et un ILI9386 ne gère que les 320x480. En fonction de la taille de l'écran, on peut éliminer certains drivers. Mais en 320x240, les drivers suivants peuvent être utilisés:
HX8312 HX8346 HX8347 HX8367 HX8368 ILI9320 ILI9325 ILI9328 ILI9331 ILI9335 ILI9340 ILI9341 ILI9342 OTM3225 R61505 R61580 RM68090 S6D0129 SPFD5408 SSD1269 SSD1279 SSD1289 SSD1298 SSD2119 SSD2119 ST7781 ST7787 ST7789
J'en oublie certainement!

1 Like

OUAW !
C'est donc BEL et BIEN compliqué ! Merci aussi d'avoir écrit un aussi long message, pour bien m'expliquer, et donc d'avoir consacré ton temps à ceci.

Pour faire clair, j'en déduis qu'il faut TOUT faire par les registres, et que je vais devoir me renseigner sur le sujet.

Tout est dans la datasheet de l'ILI9341

Toutes les informations y sont, mais il faut quand même deviner pas mal de choses. Cela n'a pas été évident au début se voir quel mode est utilisé pour le dialogue. Je dirais que la datasheet est plus un très bon résumé.

Disons que c'est pareil pour faire clignoter une led sur une uno. Il faut posséder déjà une bonne base. Ma compagne n'y arrivera jamais. Pour le ILI9341, c'est pareil. Vu de loin, c'est complexe, mais une fois écrit les premières fonctions, le reste va plus simplement. Pour moi le ILI9341 est plus simple d'emploi que toutes le fonction du timer d'une Uno.

Profite des recherches que j'ai faites. Je ne crois pas avoir trouvé quelque chose sur le net. La seule doc utilisable, c'est la datasheet. Et par expérience, si elle m'était traduite en français, elle ne serait pas plus lisible.
Si tu veux jouer avec le ILI9341, commence par dire quel est le type de liaison disponible (référence de l'écran, nom des broches ...)

Non, seulement les accès de base, genre:
écrire dans un registre
lire un registre si possible
écrire un point
écrire dans une zone rectangulaire.
Pour le reste, si il faut faire des droites inclinées, des cercles, des lettres, c'est de la programmation indépendante des registres. On utilise par exemple un algorithme de tracé de droite qui va utiliser "écrire un point"
Il y a donc intérêt à écrire une couche de base spécifique ILI9341, puis des couches supplémentaires indépendantes du ILI9341.

1 Like

Les seules choses que j'ai besoin, c'est de savoir quel pilote est utilisé, et de tracer un point.

Quel est l'interface (ou l'écran)?

Voilà mes écrans :

et

Oups, j'ai oublié: quelle carte utilises-tu? Uno? Méga?

[edit]
Il faut pour que l'on puisse se comprendre, que l'on ait la même datasheet. J'utilise:
http://arduino.dansetrad.fr/ILI9341.pdf
http://arduino.dansetrad.fr/ILI9486.pdf
Si tu as une autre doc, merci de me le dire