Bonjour,
J'ai galérais pour connecter des appareils I2C avec les ESP32 et ESP8266. Rien n'y faisait, scanner I2C, résistance "pullup" de 10k. Quand j'ai trouvé la solution sur internet. Il faut intégrer dans votre code les résistances interne par programme avec : pinMode(22, INPUT_PULLUP); pinMode(21, INPUT_PULLUP);. Ca marche du tonner.
Post mis dans la mauvaise section, on parle anglais dans les forums généraux. déplacé vers le forum francophone.
Merci de prendre en compte les recommandations listées dans Les bonnes pratiques du Forum Francophone
Tu peux donner le lien avec lequel tu as trouvé la solution ?
Si tu as correctement ajouté les résistances de charge des collecteurs ouverts SCL et SDA, ce que tu appelles pull-up, il n'y a aucune raison que les "même" résistances, mais internes au micro soit obligatoires.
Les "pull-up" internes au micro sont de valeurs très élevées et s'il y a plusieurs esclaves I2C, donc une forte valeur de capacité sur les lignes SDA et SCL, sans résistances externes de 10 k, 5 k ou parfois 1 k, cela risque fort de ne pas fonctionner.
Ton lien m'intéresse car j'arrive à la conclusion inverse.
Bonjour,
Voici le lien :
https://www.esp32.com/viewtopic.php?t=4742#p20511
Sur ESP32 ça marche alors que les résistances de 10k non.
SurvEPS8266 ça marche pas. Je vais essayer les résistances.
Merci
10K c'est beaucoup c'est plus 4K7 en standard mode et 2k2 en fast mode
Very Important = You MUST use Pullup Resistors of 3K3 ohms.
Dans le texte et le code de ton lien, @ricou1 , l'auteur indique 3,3 kOhm comme valeur à implanter
Il me semble qu'on est nombreux sur ce forum à utiliser cette valeur ou une valeur voisine avec nos ESP32
miser sur les seuls pull-up internes des ESP me semble hasardeux même si parfois ça peut 'tomber en marche'
Ok j’ai lu 10k c’est pour cela que j’ai utilisé cette valeur.
Merci
Le lun. 23 sept. 2024 à 14:47, Le Viking via Arduino Forum <notifications@arduino.discoursemail.com> a écrit :
pour information
dans cette doc , Espressif situe à 45 kOhm la valeur approximative des pull-up et pull-down des ESP32 :
https://docs.espressif.com/projects/arduino-esp32/en/latest/api/gpio.html
Ok, merci
Ok, je n’avais pas lu la doc des esp. trop pressé !!!
Merci
Bonsoir
Voilà l’adresse du site qui mentionne 10k ou plus comme résistance pull-up.
Cordialement
Bonjour
Voir aussi le chapitre 7 dans ce document pdf : NXP - I²C-bus specification and user manual
et aussi : Texas Instruments - I2C Bus Pullup Resistor Calculation
Bonsoir
Voilà comment l'I2C fonctionne :
-
Tous les transistors de sortie en I2C sont à collecteur ouvert, c'est à dire que le transistor n'est pas chargé, le montage n'est pas terminé.
Il ne peut pas fonctionner sans résistance externe. -
Cette résistance qui termine le montage est commune à tous les composants I2C, maître et esclave. Si chaque module est équipé de résistances de pull-up, toutes les résistances sur SCL se retrouvent en parallèle, idem pour SDA.
Cette solution forme une fonction "OU" câblée, gratuite et extensible à l'infini.
Si tu le désires, je pourrai t'expliquer plus en détail la fonction OU câblée. -
L'I2C est un protocole génial, seulement 2 fils plus la masse, mais qui ne fonctionne bien que sur des faibles distances et à conditions qu'il n'y ait pas trop de capacités dues au câblage et qu'il n'y ait pas trop d'esclaves. On compte 20 pF par composant raccordés plus ce que le câble apporte.
A l'origine, l'I2C a été conçue pour ne pas sortir d'une carte de circuit imprimé. -
C'est quoi le problème ?
Le problème est que la somme des capacités se charge au travers de la résistance qui referme le circuit des collecteurs, la fameuse pull-up qui s'appelle R1 sur mon schéma.
Le temps de charge des capacités est égal à 3 fois la constante de temps, la constante de temps est T= RC.
S'il y a trop de capacité les tensions sur SDA et SCL n'arrivent pas atteindre 5V (ou 3,3 V) et le message I2C devient incompréhensible. -
Solutions
Solution 1:
On diminue T en diminuant R. Il faut faire attention à ne pas trop diminuer R sinon le courant risque d'être trop élevé dans les transistors SDA et SCL, c'est une vérification à faire. Jusqu'à 1 k ça va, 100 ohms il ne faut pas exagérer.
C'est pour cela que nous sommes nombreux à avoir tiqué sur l'affirmation que cela fonctionnait mieux avec des pull-up de 30 k.
Solution 2 :
On laisse plus de temps aux capacités pour se charger en baissant la fréquence SCL. -
L'I2C n'est pas comme la liaison série qui ne transmet pas l'horloge.
En I2C c'est le maitre qui impose l'horloge aux esclaves.
Les fréquences de 100 kHz et 400 kHz sont des fréquences recommandées, mais non obligatoires.
La bibliothèque Wire permet de changer cette fréquence aussi bien sur avr (Uno, nano, etc) que sur ESP32 → Wire.setClock(clock_fréquency)
Le point délicat est la valeur de la fréquence I2C qui doit être obtenue avec des divisions de la fréquence horloge principale : il faut que le diviseur permette d'obtenir un nombre entier → lecture de la datasheet du micro indispensable pour connaitre la formule à appliquer.
This topic was automatically closed 180 days after the last reply. New replies are no longer allowed.