ESP32 : un peu de SPI harware ...

dans ce court tuto nous verrons comment :

  • générer automatiquement un latch, genre signal RCLK du 74hc595
  • inverser les signaux genre MOSI ou SCLK sur une ligne SPI hardware, voire sur tout autre module hardware

la doc de l'ESP32 est minable, mais la bestiole est formidable, au point qu'on ne peut plus s'en passer ...
il est doté, entre autres caractéristiques remarquables, d'une matrice de multiplexage des io, ce qui permet d'acheminer les lignes des périphériques (ici on parlera du SPI hardware) vers (presque) n'importe quelle broche io de la bête : peu d'interrêt pour certains, mais c'est le graal pour ceux qui dessinent des circuits imprimés : il suffit d'amener la piste vers la broche la plus proche, le logiciel et la matrice feront le reste

mais c'est pas tout : la matrice permet aussi :
de connecter plusieurs périphériques sur la même broche : géant
de connecter une ligne d'un périphérique sur plusieurs broche : intérêts moins évidents, mais il y en a
inverser le signal
inverser la propriété output enable du signal

dans l'exemple il y a un 74hc595 sur le pcb ; on se sert du signal CS (ou SS) pour provoquer automatiquement le latch (fil RCLK du (ou des ...) 74hc595) : pas besoin d'attendre la fin de la transaction ni de rajouter de digitalWrite(595latch, HIGH); ou LOW
[Edit] la fonction "setHwCs(true);" a un comportement spécial, elle semble marcher en sonnette ...
cad. que si elle est réitérée, elle s'anulle ; je l'ai donc accompagnée d'un flag qui permet de vérifier si elle n'est pas déjà à l'état qu'on veut (true ou false), auquel cas il ne faut pas y toucher ... il y a peut-être mieux à faire en allant lire directement dans le registre
ceci car je suis amené à devoir éviter le latch quand je veux utiliser, forcément temporairement, la 9ème sortie du 74hc595 soit la H', sans toucher aux 8 autres
! attention, ce n'est peut-être pas le seul registre de l'ESP32 à faire pareil !

sur l'autre périphérique SPI (on dispose de 2 périphériques SPI hardware sur l'ESP32 : le hspi et le vspi), comme les même signaux SCLK et MOSI sont utilisés pour plusieurs lignes SPI extérieures à la carte, ils sont bufferisés sur la carte par des 74HC04 : comme ces derniers sont inverseurs, il faut les inverser préalablement ces signaux au niveau de l'ESP32

le code prend la partie initialisation appelée par le setup :
(vous pouvez utiliser l'excellent "arduino-esp32/libraries/SPI/examples/SPI_Multiple_Buses/" et y apporter mes compléments

uint8_t cs_hspi_true;

void setup_spi(void) {
  hspi = new SPIClass(HSPI); // initialisation of onboard 74hct595
  hspi->begin(HSPI_SCLK, HSPI_MISO, HSPI_MOSI, HSPI_SS);
  hspi->setHwCs(true); // end of /CS triggers automatically the latch of 74hct595
  cs_hspi_true = 1; // mémorise "setHwCs(true)"

  vspi = new SPIClass(VSPI); // initialisation of outboard SPIs
  vspi->begin(VSPI_SCLK, VSPI_MISO_s88n, VSPI_MOSI, VSPI_SS);
  // void gpio_matrix_out(uint32_t gpio, uint32_t signal_idx, bool out_inv, bool oen_inv)
  gpio_matrix_out(VSPI_SCLK, VSPICLK_OUT_IDX, true, false); // true = invert SCLK on VSPI
  gpio_matrix_out(VSPI_MOSI, VSPID_OUT_IDX, true, false); // true = invert MOSI on VSPI
 }

Bonsoir et Merci.

La doc du composant est encore légère sur certains points (le Technical Reference Manual de 723 pages montre pas mal de choses !)

Avec de telles trouvailles le composant est bien servi !!

merci,
c'est vrai que j'ai tendance à ignorer ce datasheet
les choses que je "trouves" sont tirées d'une rétro-ingénierie faite dans les bibliothèques (c'est + pratique avec platformio)
par exemple l'inversion des signaux existe dans la bibliothèque de l'uart, je suis allé voir comment ils ont fait ...
malheureusement, les forums ne dépannent pas quand on arrive dans des questions, je ne dirais pas pointues, mais inhabituelles : il y a forcément d'autres gens qui connaissent la réponse, mais ils sont trop rares pour passer par là au bon moment

[Edité] la fonction "setHwCs(true);" a un comportement spécial, elle semble marcher en sonnette ...
! attention, ce n'est peut-être pas le seul registre de l'ESP32 à faire pareil !