Instructions et Priorités ?

Bonjour,

J'ai une petite question de néophyte.

L'environnement : une carte Mega 2560R3 non officielle, un écran EastRising 7" (processeur RA8875) qui fonctionne en SPI et divers matériels que je n'énumére pas car rien a voir avec la question qui arrive.

Dans la ST du RA8875, je lis :

The maximum clock rate of 4-Wire SPI
write SCL is system clock / 3(i.e. SPI clock high duty must large than 1.5 system clock) and the
maximum clock rate of 4-Wire SPI read SCL is system clock / 6. About the detail protocol, please
refer to Figure 6-14, Figure 6-15, Figure 6-16 and Figure 6-17.

Dans le .cpp du RA8875, je trouve :

SPI.begin();
#ifdef __AVR__
  SPI.setClockDivider(SPI_CLOCK_DIV128);
  SPI.setDataMode(SPI_MODE0);
#endif
  
  if (readReg(0) != 0x75) {
    return false;
  }

  initialize();

#ifdef __AVR__
  SPI.setClockDivider(SPI_CLOCK_DIV4);
#endif
  return true;
}

et dans dans le setup du code j'ai :

SPI.beginTransaction(SPISettings(2500000, MSBFIRST, SPI_MODE0));
  SPI.endTransaction();

la, les questions :

qui prend la priorité le .cpp ou le code ?
ou cela fait-il double emploi ?
ou une instruction est inutile

Merci par avance pour votre aide

lien vers le .cpp en question et postez votre code source, sinon on ne peut pas répondre.


de manière générale, le compilateur initialise les variables globales (appelle le constructeur si c'est une instance d'une classe) avant que le setup soit appelé.
➜ donc si vous avez un bout de code de votre cpp dans le constructeur et que votre sketch a une variable globale de cette classe (et que les #ifdef bien sûr sont activés lors de la compilation), alors ce bout de code sera exécuté en premier avant le setup.

Si dans le setup vous effectuez des modifications alors ce sont elles qui vont être prises en compte pour le reste du code - sauf bien sûr en cas de conflit (parois appeler deux fois la fonction de configuration de quelque chose crée un souci - ça dépend du code et de ce que vous pilotez)

Merci beaucoup pour ces renseignements.

J’avais lu la st du RA8875 mais comme je ne sais pas ce que signifie cette instruction dans le .cpp

 SPI.setClockDivider(SPI_CLOCK_DIV128);

J’ai ajouté dans le sketch

SPI.beginTransaction(SPISettings(2500000, MSBFIRST, SPI_MODE0));
  SPI.endTransaction();

Je n’ai pas constaté d.anomalie après cette modification

Encore merci pour les renseignements

OK - moi je ne suis toujours pas plus renseigné sur la bibliothèque que vous utilisez mais du moment que ça répond à votre besoin, ça ira :slight_smile:


SPI.setClockDivider() - Arduino Reference

donc vos appels vont écraser le paramétrage précédent

Voici la bibliothèque utilisée : Adafruit_RA8875.h

Donc si je comprends bien : j'ai une fréquence de fonctionnement de 16Mhz que je dois diviser par 6 pour le fonctionnement de l'écran. Ce qui donne 2.66

Dans le .cpp j'ai : SPI.setClockDivider(SPI_CLOCK_DIV4);
Je devrais donc changer l'instruction par SPI.setClockDivider(SPI_CLOCK_DIV8); qui donne comme résultat 2 ?

Dans le setup, l'instruction que j'ai ajoutée

me fait gagner un peu de rapidité en exécution non ?

Doit on respecter des paliers genre 2000000, 2500000, 30000000 ou est on libre de mettre un nombre quelconque dans les limites du matériel bien sur du genre 2125500 ?

C'est sûrement une question un peu bête mais bon je la pose quand même

faut lire la datasheet pour voir ce qui est supporté. J'ai pas le temps de me pencher dessus mais ils disent notamment

Adafruit généralement code correctement donc s'ils ont choisi ces paramètres c'est qu'ils sont corrects

Oui ça j.avais vu je l.ai mis dans mon premier post

This topic was automatically closed 180 days after the last reply. New replies are no longer allowed.