Écran blanc ILI9341 - trouver la cause en une minute

Vous branchez un petit écran ILI9341 SPI sur votre ESP32, vous téléversez une démo, et l’écran reste blanc. Pas d’image, pas d’erreur, rien. Ça m’est arrivé avec le module de 3,2” de ma visionneuse de photos sur ESP32.
Un écran blanc dit quelque chose de précis. Le rétroéclairage est alimenté, car le blanc est ce que montre la dalle avec la lumière allumée et sans image. Mais le contrôleur ILI9341 n’a jamais reçu de commande valide. Le problème est donc entre l’ESP32 et le contrôleur, pas dans la dalle ni dans le code graphique.
Demander son identifiant à la puce
L’ILI9341 peut répondre, pas seulement écouter. La commande 0xD3 (Read ID4) lui fait renvoyer son identifiant sur MISO. Un contrôleur qui marche répond 00 93 41. Cette seule réponse dit si la liaison fonctionne.
Ce petit sketch n’utilise que la bibliothèque SPI, il ne dépend donc d’aucune bibliothèque d’affichage ni de ses réglages. Les broches sont les miennes. Mettez les vôtres.
#include <SPI.h>
const int PIN_SCK = 18, PIN_MISO = 19, PIN_MOSI = 23;
const int PIN_CS = 5, PIN_DC = 16, PIN_RST = 17;
const int PIN_TOUCH_CS = 33; // keep the touch chip quiet on the shared bus
void setup() {
Serial.begin(115200);
pinMode(PIN_TOUCH_CS, OUTPUT); digitalWrite(PIN_TOUCH_CS, HIGH);
pinMode(PIN_CS, OUTPUT); digitalWrite(PIN_CS, HIGH);
pinMode(PIN_DC, OUTPUT);
pinMode(PIN_RST, OUTPUT);
// hardware reset
digitalWrite(PIN_RST, LOW); delay(20);
digitalWrite(PIN_RST, HIGH); delay(150);
SPI.begin(PIN_SCK, PIN_MISO, PIN_MOSI);
SPI.beginTransaction(SPISettings(1000000, MSBFIRST, SPI_MODE0)); // slow on purpose
digitalWrite(PIN_CS, LOW);
digitalWrite(PIN_DC, LOW); SPI.transfer(0xD3); // command: Read ID4
digitalWrite(PIN_DC, HIGH);
uint8_t id[4];
for (uint8_t& b : id) b = SPI.transfer(0x00); // the first byte is a dummy
digitalWrite(PIN_CS, HIGH);
SPI.endTransaction();
Serial.printf("ILI9341 ID: %02X %02X %02X\n", id[1], id[2], id[3]);
}
void loop() {}
Il tourne à 1 MHz exprès. La lecture de l’ILI9341 a une limite de vitesse plus basse que l’écriture, et une horloge lente écarte la vitesse comme cause.
Ce que veut dire la réponse
| Réponse | Sens | À vérifier |
|---|---|---|
00 93 41 |
La liaison marche | Les réglages de la bibliothèque d’affichage (broches, pilote, rotation) |
FF FF FF |
Personne ne pilote MISO | Les fils CS, SCK et MISO, et l’alimentation du module |
00 00 00 |
MISO est tenu bas, ou la puce n’est pas réinitialisée | Les fils RST et DC, et le CS de la puce tactile |
| Valeurs au hasard | Un faux contact | Renfoncer chaque fil et réessayer |
Le mien lisait FF et 00. La cause était un fil de connexion mal enfoncé. Renfoncer chaque fil dans la plaque d’essai a réglé le problème.
Si l’identifiant est bon mais que l’écran reste blanc, le câblage est bon et la bibliothèque est réglée pour une autre broche ou une autre puce. Vérifiez que ses broches, son pilote (ILI9341, pas ST7789) et son bus SPI correspondent à votre câblage.
Autres points à vérifier
- L’alimentation. Sur un ESP32, branchez le VCC du module sur 3,3 V. Certains modules ont un cavalier (souvent J1) qui court-circuite leur régulateur. Ne le fermez jamais avec VCC sur 5 V.
- Le bus partagé. Si la puce tactile (XPT2046) partage SCK, MOSI et MISO, son CS doit rester haut quand vous parlez à l’écran. Sinon les deux puces répondent en même temps.
- De mauvaises couleurs, mais une image. Ce n’est pas le câblage. Inversez l’ordre des couleurs (RGB/BGR) ou le réglage « invert » de votre bibliothèque.