Bonjour,
Pour ne pas avoir de croisement de pistes sur un CI (je suis un vieux : CI=circuit imprimé
) je souhaite réaffecter les pins du SPI et de l'I2C sur un ESP32-C3, carte super mini.
Quand on n'utilise pas de bibliothèque, c'est simple, on est libre de faire comme on veut.
Quand les bibliothèques se permettent d'activer elles-mêmes le SPI ou l'I2C sans laisser le choix à l'utilisateur, comment fait-on ?
Par défaut les pins sont définies dans le fichier "pins_arduino.h", c'est le cas avec platformio, je serais surpris qu'avec l'IDE arduino ce soit différent.
J'ai commencé par chercher comment il serait possible d'imposer l'usage d'un fichier "pins_arduino.h" particulier par projet.
C'est la solution qui me paraissait la plus propre.
Je n'ai rien trouvé, j'ai même consulté cinq IAs (oui, oui c'est possible
).
Ce qui est fort ennuyeux, c'est qu'avec strictement la même question, j'ai eu 5 solutions différentes, certaines contradictoires, et que je n'ai pas réussi à en faire fonctionner une seule.
Quand je regarde le contenu du fichier "pins_arduino.h", je me dis, peut-être que c'est une bêtise, que la déclaration en static + const ne facilite pas les choses.
static const uint8_t SDA = 8;
static const uint8_t SCL = 9;
static const uint8_t SS = 7;
static const uint8_t MOSI = 6;
static const uint8_t MISO = 5;
static const uint8_t SCK = 4;
Je précise que c'est plus pour le plaisir de réussir que par nécessité, ce ne sont pas deux croisements de pistes qui me bloquent.
Mais si quelqu'un a une solution "simple", je regarderai avec attention et grand intéret.
PS : "simple" = pas une solution comme Perplexity qui proposait de créer une nouvelle carte de A à Z à chaque fois qu'une pin est déplacée, sûr que cela devait fonctionner, mais à quel prix !
-----------------------------------------------------------------------------------------------------------
Il y a deux essais dont je souhaite vous parler.
- Premier essai avec un écran I2C
écran oled I2C
bibliothèque Adafruit SSD1306@^2.5.13 + Adafruit GFX
J'avais repèré dans la bibliothèque Adafruit, que l'initialisation de l' I2C est faite à l'intérieur de la méthode begin avec une ligne Wire.begin() sans argument, donc avec les valeurs de pins_arduino.h.
Je me dis : si j'ajoute une ligne Wire.begin(6 ,7 ) avant la ligne ecran.begin que va-t-il se passer ?
Note : dans "pins_arduino.h", 6 est Mosi et 7 est CS.
Dans setup() j'ai donc ces deux lignes :
Wire.begin(6 ,7 );
ecran.begin(SSD1306_SWITCHCAPVCC, 0x3C) ;
Je m'attendais à ce que le Wire.begin() sans argument de la bibliothèque Adafruit réinitialise l'I2C avec les valeurs de "pins_arduino.h" et annule ma ligne Wire.begin(6 ,7 );
Eh bien non, l'écran fonctionnait parfaitement.
- Même essais avec un écran SPI
J'ai fait la même manip avec un écran SPI :
SPI.begin(sck, miso, mosi, cs)
GC9A01 (écran rond)
Bibliothèque : diyables/DIYables TFT Round@^1.0.1 + adafruit Gfx
Cela n'a pas fonctionné.
Je ne peux que constater, je ne sais que dire.
Est-ce qu'il est possible de détecter une initialisation préalable ?
Certains auteurs sauraient le faire et d'autres non ?
Je rappelle que c'est surtout pour le plaisir de comprendre, je ne suis pas bloqué et accessoirement.....que j'ai pu faire des conneries.