Comment utiliser SPI en hardware sur un TFT 2.2" + Mega 2560

Bonjour,

J’ai fait l’acquisition d’un écran TFT 2.2" ici

Module d’Affichage à Cristaux Liquides 2.2"

J’arrive à le faire fonctionner en mode logiciel , mais je n’arrive pas à activer le mode SPI en hardware.

Bref je ne comprend pas comment utiliser le SPI en hardware.

Merci de votre aide.

Voici le code de test que j’utilise

#include <SPI.h>
#include <Adafruit_GFX.h>
#include <Adafruit_ILI9341.h>
//COMMUN
#define TFT_RST 8
#define TFT_DC 9
#define TFT_CS 10
//mega 2560
/
#define TFT_MISO 50
#define TFT_MOSI 51
#define TFT_CLK 52
/
//UNO
/*
#define TFT_MISO 12
#define TFT_MOSI 11
#define TFT_CLK 13
*/
// Use hardware SPI (on Uno, #13, #12, #11) and the above for CS/DC
Adafruit_ILI9341 tft = Adafruit_ILI9341(TFT_CS, TFT_DC);
// If using the breakout, change pins as desired
//Adafruit_ILI9341 tft = Adafruit_ILI9341(TFT_CS, TFT_DC, TFT_MOSI, TFT_CLK, TFT_RST, TFT_MISO);
void setup() {
// put your setup code here, to run once:
tft.begin();
tft.setRotation(2);
tft.fillScreen(ILI9341_BLACK);
tft.setTextColor(ILI9341_WHITE);
tft.setTextSize(3);
tft.setCursor(20,50);
tft.print(“TEST”);


}
void loop() {
// put your main code here, to run repeatedly:
}

Tu trouveras beaucoup d'explications sur le SPI sur Internet: voici un lien, et ici sur la référence Arduino. Si tu cherches uniquement le branchement sur Mega 2560, voici ce qu'il indique :


ou avec le connecteur ICSP (utilise un multimètre pour localiser le GND) :

Important:

Note about Slave Select (SS) pin on AVR based boards

All AVR based boards have an SS pin that is useful when they act as a slave controlled by an external master. Since this library supports only master mode, this pin should be set always as OUTPUT otherwise the SPI interface could be put automatically into slave mode by hardware, rendering the library inoperative.

It is, however, possible to use any pin as the Slave Select (SS) for the devices. For example, the Arduino Ethernet shield uses pin 4 to control the SPI connection to the on-board SD card, and pin 10 to control the connection to the Ethernet controller.

Sur la photo de ton écran, il n'y a pas le composant 'U3' : il est possible que le lecteur SD soit inactif.

lesept:
Tu trouveras beaucoup d’explications sur le SPI sur Internet: voici un lien, et ici sur la référence Arduino. Si tu cherches uniquement le branchement sur Mega 2560, voici ce qu’il indique :

Merci pour toutes ces infos

J’ai testé sur l’ICSP également mais toujours un écran blanc.
Si je dois brancher le SS pour activer le mode hardware, je ne vois pas comment l’ajouter à l’écran.
Pourtant dans le descriptif sur Amazon il y a bien

Fonctionnalités:

  1. Ce module LCD de 2,2 pouces utilise une puce de lecteur pour gérer 240X320 points, avec une résolution de 240X320
  2. L’interface périphérique série ne nécessite que 5 E / S pour éclairer l’affichage, ou une interface périphérique matérielle directe peut être pilotée
  3. Le module est équipé d’un circuit intégré stabilisé en tension pour prendre en charge l’alimentation 3.2v / 5V
  4. Reflux SMT, qualité du contrôle industriel, travail stable à long terme
  5. Avec la cage de carte SD, le circuit de commande de rétroéclairage, fournit le code source STM32 source C51 ← une idée de la signification ?
    6. Support du bus SPI matériel et logiciel

Je teste demain la carte SD. Si ça ne marche pas parce qu’il manque le composant U3, je retourne la carte.

Pour moi CS est équivalent à SS. Donc tu choisis une pin pour CS, par exemple la 10 comme dans ton code, et tu branches sur la pin CS de l’écran. Tu la déclares bien en OUTPUT, dans le pinMode.

Pour tester la carte SD, tu choisis une autre pin pour le CS de la SD par exemple la 11 et tu fais pareil.

en branchant CS sur le pin 10 et en le mettant en OUTPUT ça ne marche pas mieux

pour info voilà le code que j’utilise

#include “SPI.h”
#include “Adafruit_GFX.h”
#include “Adafruit_ILI9341.h”
//COMMUN
#define TFT_RST 8
#define TFT_DC 9
#define TFT_CS 10
//mega 2560
/
#define TFT_MISO 50
#define TFT_MOSI 51
#define TFT_CLK 52
/
//UNO
/*
#define TFT_MISO 12
#define TFT_MOSI 11
#define TFT_CLK 13
*/
// Use hardware SPI (on Uno, #13, #12, #11) and the above for CS/DC
Adafruit_ILI9341 tft = Adafruit_ILI9341(TFT_CS, TFT_DC);
// If using the breakout, change pins as desired
//Adafruit_ILI9341 tft = Adafruit_ILI9341(TFT_CS, TFT_DC, TFT_MOSI, TFT_CLK, TFT_RST, TFT_MISO);
void setup() {
// put your setup code here, to run once:
pinMode(TFT_CS, OUTPUT);
tft.begin();
tft.setRotation(2);
tft.fillScreen(ILI9341_BLACK);
tft.setTextColor(ILI9341_RED);
tft.setTextSize(4);
tft.setCursor(20,50);
tft.print(“TEST”);


}
void loop() {
// put your main code here, to run repeatedly:
}

bonsoir,
ça pourrait fonctionner, on ne sait pas : il faudrait avant tout dé-commenter un des deux blocs de définitions pour MISO, MOSI et CLK

EDIT : OK, pigé (voir messages suivants): en fait ces #def ne sont qu'une sorte de pense-bête, un "mode d'emploi" destiné à l'utilisateur pour le câblage... quand même pas très propre leur façon d'écrire, à leur place j'aurais fait un tableau, ou en tout cas je n'aurais pas écrit de #def, c'est trompeur.

Non, pas nécessaire, je pense que ce sont des pins par défaut pour le hardware SPI.
Tu peux bien sûr essayer, pour voir si ça fonctionne mieux.

//COMMUN
#define TFT_RST 8
#define TFT_DC 9
#define TFT_CS 10

//mega 2560
#define TFT_MISO 50
#define TFT_MOSI 51
#define TFT_CLK 52
// Use hardware SPI (on Uno, #13, #12, #11) and the above for CS/DC
Adafruit_ILI9341 tft = Adafruit_ILI9341(TFT_CS, TFT_DC);

Sinon, il y a un autre constructeur :

Adafruit_ILI9341 tft = Adafruit_ILI9341(TFT_CS, TFT_DC, TFT_RST);

Quand tu crées une instance avec
Adafruit_ILI9341 tft = Adafruit_ILI9341(TFT_CS, TFT_DC, TFT_RST);
ou
Adafruit_ILI9341 tft = Adafruit_ILI9341(TFT_CS, TFT_DC);
Le hardware SPI est utilisé et les numéros de pin sont gérés en interne, utilisation du SPI déclaré par les include AVR.

Si tu crées une instance avec
Adafruit_ILI9341 tft = Adafruit_ILI9341(TFT_CS, TFT_DC);
tu es supposé assurer par toi même la gestion du reset alors que si tu crées une instance avec
Adafruit_ILI9341 tft = Adafruit_ILI9341(TFT_CS, TFT_DC, TFT_RST);
c'est la librairie qui en assure la gestion

Merci pour vos réponses, mais ça ne fonctionne toujours pas.

fdufnews:
Quand tu crées une instance avec
Adafruit_ILI9341 tft = Adafruit_ILI9341(TFT_CS, TFT_DC, TFT_RST);
ou
Adafruit_ILI9341 tft = Adafruit_ILI9341(TFT_CS, TFT_DC);
Le hardware SPI est utilisé et les numéros de pin sont gérés en interne, utilisation du SPI déclaré par les include AVR.

Si tu crées une instance avec
Adafruit_ILI9341 tft = Adafruit_ILI9341(TFT_CS, TFT_DC);
tu es supposé assurer par toi même la gestion du reset alors que si tu crées une instance avec
Adafruit_ILI9341 tft = Adafruit_ILI9341(TFT_CS, TFT_DC, TFT_RST);
c'est la librairie qui en assure la gestion

Effectivement c'est ce que je me dis.
J'ai testé sur la UNO et la MEGA
en mode logiciel ça fonctionne, en mode hardware j'ai un écran blanc.

Une solution est proposée ici : modifier la bibliothèque Adafruit_ILI9341.cpp en changeant la ligne 191

initSPI(freq);

en

initSPI(freq, SPI_MODE3);

C’est un peu embêtant de modifier une bibliothèque car la modification ne suivra pas les mises à jour.

A tester…

EDIT : As-tu testé ceci du site Adafruit ? C’est un exemple qui utilise le HW SPI.

lesept:
Une solution est proposée ici : modifier la bibliothèque Adafruit_ILI9341.cpp en changeant la ligne 191
...

A tester...

EDIT : As-tu testé ceci du site Adafruit ? C'est un exemple qui utilise le HW SPI.

Je viens de tester mais toujours écran blanc.

Entre temps je suis tombé sur cette vidéo : https://youtu.be/n13RQMNFDOA
L'écran 2.2" est le même que le mien.

Mais je ne comprends pas comment réaliser le branchement physiquement.
Par ex à 0:40 :

3.3K TO GND AND 2.2K TO PIN 10

C'est un point diviseur, car les signaux du Mega sont en 5V et l'écran demande du 3V. Mais selon ton lien, ton écran supporte le 5V et tu as réussi à le faire fonctionner avec le SW SPI. Donc je pense que tu n'en as pas besoin.

2.2k to GND and 1.3k to pin 13 - - > SCK
signifie un montage comme ceci
GND - R 2200 ohms -|- R 1300 ohms - pin 13
|
SCK

Finalement, et bien que sur le site il est stipulé que l'écran est équipé d’un circuit intégré stabilisé en tension pour supporter une alimentation 3.2v / 5V
en ajoutant simplement une résistance de 2K vers les PINS 10, 9, RESET, 51, 52 et 10ohms pour le LED le mode SPI hardware est activé

Merci pour votre aide.

Je vais tester la carte SD maintenant

Cool!