Bonsoir,
En bricolant sous I2C j'ai eu la surprise de voir qu'une fonction pour changer la fréquence SCL a été ajoutée.
bien évidement elle n'est ni annoncée ni encore moins documentée qu'elle que soit l'arduino (USA ou Italie).
La fonction "fonctionne" mal:
void TwoWire::setClock(uint32_t frequency)
{
TWBR =(F_CPU / frequency) - 16) / 2;
}
Défaut : le membre de droite de l'égalité ne retourne pas un entier. La fonction ne peut générer que quelques fréquences où le résultat est entier :
800k, 500k, 400k, 320k, 250k, 200k, 160k, 125k, 100k, 80k, 64k, 40k, 32k.
C'est déjà pas mal mais avec un registre 8 bits nous avons 28 fréquences possibles.
Nota1 : la norme I2C Philips, maintenant NXP, recommande 100k et 400k mais n'interdit pas les autres fréquences.
J'ai commencé par faire un cast :
void TwoWire::setClock(uint32_t frequency)
{
TWBR = (uint8_t)(((F_CPU / frequency) - 16) / 2);
}
Cela m'a permis d'avoir 28 fréquences intermédiaires dont celle correspondant à TWBR= 7 --> 533,33 kHz qui est la limite maximale de fonctionnement de l'I2C entre les deux cartes nano en ma possession, l'une étant maître et l'autre esclave.
Défaut de cette solution : comme il y a un cast on ne sait pas quelle est la valeur exacte de Fscl sans faire le calcul à la main.
Au final puisqu'il faut faire un calcul j'ai re-modifié en transmettant directement la valeur de TWBR.
void TwoWire::setTwbr(uint8_t twbr)
{
TWBR = twbr ;
}
Nota 2 : Travailler à fréquence basse peut-être intéressant dans le cas de grande longueur de connexion.