[Info] Wire --> setClock()

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.

bonsoir 68tjs
merci
je mets ton post dans ma besace 8)

Philips, maintenant NXP

Bonjour,
qui vient par ailleurs de racheter Freescale, anciennement Motorola