
Bus I²C : câblage, adressage et résistances pull-up
Câblez un bus I²C fiable : rôles de SDA et SCL, adresses 7 bits, vitesses, capacité de bus, temps de montée et dimensionnement des pull-up.
Rédaction et revue techniqueElectroDesignForge Engineering Team
Voir le processus éditorialÀ retenir : I²C relie plusieurs circuits sur deux lignes partagées,
SDA(données) etSCL(horloge). Les sorties sont normalement à drain ouvert : un appareil tire une ligne à 0, mais les résistances pull-up la ramènent à 1. Le dimensionnement doit respecter à la fois le courant absorbable au niveau bas et le temps de montée imposé par la vitesse et la capacité totale du bus.
Référence rapide
| Mode | Fréquence SCL maximale | Temps de montée t_r maximal (30–70 %) | Capacité de référence par ligne |
|---|---|---|---|
| Standard-mode (Sm) | 100 kHz | 1000 ns | 400 pF |
| Fast-mode (Fm) | 400 kHz | 300 ns | 400 pF |
| Fast-mode Plus (Fm+) | 1 MHz | 120 ns | 550 pF |
Ces limites viennent de la spécification I²C; l’élément le plus lent du bus peut imposer une vitesse inférieure. Ne sélectionnez pas Fm+ uniquement parce que le contrôleur le propose : chaque cible, traducteur de niveau et isolateur doit le supporter.
SDA et SCL : les deux lignes partagées
SDA transporte l’adresse, le bit lecture/écriture, les octets de données et les acquittements. SCL cadence le transfert. Au repos, les deux lignes sont hautes. Une condition START est une descente de SDA pendant que SCL est haut; un STOP est une montée de SDA pendant que SCL est haut.
Pendant les données, SDA reste stable lorsque SCL est haut. Le contrôleur transmet huit bits puis relâche SDA au neuvième cycle; le récepteur force SDA à 0 pour un ACK, ou la laisse haute pour un NACK.
+3,3 V +3,3 V
| |
[Rp] [Rp]
| |
SDA ──────────────+──── contrôleur ── cible A ── cible B
SCL ──────────────+──── contrôleur ── cible A ── cible B
GND ──────────────────── commune à tous les appareils
Placez une résistance pull-up effective sur SDA et une sur SCL. Plusieurs modules peuvent déjà en contenir : elles sont alors en parallèle. Deux résistances de 4,7 kΩ donnent 2,35 kΩ; quatre donnent 1,18 kΩ. Vérifiez les schémas des cartes avant d’en ajouter.
Pourquoi le drain ouvert ?
Un appareil ne pousse pas activement la ligne vers le haut : il la relâche ou l’abaisse. Si deux appareils agissent simultanément, le niveau bas domine sans court-circuit entre pilotes opposés. Cette logique câblée permet l’acquittement, l’arbitrage multi-contrôleur et l’étirement d’horloge.
Dans un système à contrôleur unique, SCL peut parfois être push-pull si aucune cible ne peut étirer l’horloge; c’est une exception à documenter explicitement. Pour un bus réutilisable et compatible, gardez SCL à drain ouvert avec son pull-up.
Câblage, masse et niveaux de tension
Reliez tous les appareils en parallèle : SDA avec SDA, SCL avec SCL et une masse commune. Évitez une étoile avec de longues branches; les dérivations ajoutent capacité, réflexions et sensibilité au bruit. Sur PCB, gardez les lignes courtes, au-dessus d’un plan de masse continu et loin des nœuds de commutation rapides.
La tension des pull-up fixe le niveau haut. Elle doit être compatible avec tous les I/O, y compris un microcontrôleur non alimenté. Un périphérique 1,8 V ne doit pas être directement relié à des pull-up 3,3 V sauf autorisation explicite de sa fiche technique. Employez un traducteur de niveau adapté à I²C, avec pull-up de chaque côté lorsque son schéma le demande.
Les pull-up internes de microcontrôleur sont souvent de 20 à 100 kΩ : parfois suffisants à très basse vitesse sur une ligne courte, mais généralement trop faibles pour 100/400 kHz avec plusieurs charges. Vérifiez leur valeur réelle.
Adressage : 7 bits, pas 8
La plupart des circuits utilisent une adresse cible sur 7 bits. Le premier octet envoyé vaut :
[ A6 A5 A4 A3 A2 A1 A0 | R/W ]
Le bit R/W est ajouté sur le bus; il ne fait pas partie de l’adresse 7 bits d’une bibliothèque. Une cible à 0x68 devient 0xD0 en écriture et 0xD1 en lecture. Une API qui demande 0xD0 suit peut-être une convention 8 bits : vérifiez-la avant de décaler l’adresse deux fois.
Les broches ADDR, SA0 ou SDO de nombreux capteurs permettent de choisir une adresse. Fixez-les à un niveau défini et consignez les adresses sur le schéma. Si deux cibles à adresse fixe entrent en collision, utilisez un multiplexeur I²C, un second contrôleur ou une autre variante. L’adressage 10 bits existe mais est rare; le registre interne d’un capteur n’est pas son adresse I²C.
Vitesse, SCL et clock stretching
La fréquence SCL est une cadence maximale, pas le débit utile garanti : adresse, registre, bits ACK/NACK, START/STOP et délais internes diminuent le débit. À 400 kHz, un transfert multi-registres prend donc plus que son nombre d’octets divisé par 400 kbit/s.
Une cible peut maintenir SCL bas après que le contrôleur l’a relâché : c’est le clock stretching. Le contrôleur doit lire réellement SCL et attendre son retour haut dans les limites de temporisation du produit. Vérifiez cette compatibilité, car certains pilotes le gèrent mal. En multi-contrôleur, l’appareil qui relâche SDA mais lit un 0 perd l’arbitrage et s’arrête.
Capacité de bus et temps de montée
Chaque ligne est une charge RC : entrées des circuits, pistes, nappes, sondes, connecteurs et capacités parasites s’additionnent. Lorsqu’aucun appareil ne tire la ligne bas, le pull-up charge cette capacité progressivement.
Pour une montée mesurée entre 30 % et 70 % de VDD :
t_r ≈ 0,8473 × R_p × C_bus
R_p,max ≈ t_r,max / (0,8473 × C_bus)
Utilisez les ohms, farads et secondes. Cette formule fixe la valeur maximale : au-delà, la montée est trop lente. À 400 kHz avec C_bus = 100 pF :
R_p,max ≈ 300 ns / (0,8473 × 100 pF) ≈ 3,54 kΩ
4,7 kΩ tire peu de courant, mais est trop grand pour respecter 300 ns avec 100 pF. 3,3 kΩ est un meilleur point de départ, à confirmer par mesure et par la limite de courant bas. Mesurez de préférence la capacité sur le montage final; sinon additionnez capacités d’entrée, câble (pF/m), connecteurs et marge PCB. Une sonde d’oscilloscope ajoute aussi de la capacité.
Dimensionner les pull-up : une fenêtre, pas une valeur magique
Une résistance plus petite accélère la montée, mais augmente le courant lorsqu’un appareil force le niveau bas. La limite inférieure est :
R_p,min ≈ (VDD − V_OL,max) / I_OL,max
Avec VDD = 3,3 V, V_OL,max = 0,4 V et I_OL,max = 3 mA :
R_p,min ≈ (3,3 − 0,4) / 3 mA ≈ 967 Ω
R_p,min ≤ R_p ≤ R_p,max
Le choix n’est valide que dans cette fenêtre. Si elle n’existe pas, réduisez la capacité, baissez la vitesse, employez un buffer I²C adapté ou un appareil Fm+ capable d’absorber davantage de courant. Ne choisissez pas sous R_p,min en supposant que cela fonctionnera : V_OL peut alors devenir un niveau ambigu et la dissipation augmente.
| Situation | Point de départ | Vérification |
|---|---|---|
| PCB court, 3,3 V, 100 kHz | 4,7 à 10 kΩ | capacité et pull-up déjà présents |
| PCB court, 3,3 V, 400 kHz | 2,2 à 4,7 kΩ | t_r et I_OL de chaque cible |
| Nappe ou plusieurs modules | valeur calculée, souvent plus faible | courant bas, CEM, forme d’onde au bout du câble |
Ces plages ne remplacent pas le calcul de votre assemblage.
Mesurer et dépanner
Observez SDA et SCL à l’extrémité la plus éloignée du contrôleur. Mesurez t_r entre 30 % et 70 % de VDD, vérifiez V_OL, les rebonds et la stabilité de SDA lorsque SCL est haut.
| Symptôme | Causes probables | Actions |
|---|---|---|
| Aucune cible détectée | masse absente, adresse erronée, SDA/SCL inversées | vérifier continuité, alimentation et scan 7 bits |
| Lignes toujours hautes | pull-up absent ou sur le mauvais rail | vérifier les deux résistances et leur tension |
| Ligne bloquée basse | cible en reset, câblage fautif, transaction interrompue | isoler les modules, redémarrer le segment |
| NACK aléatoires | montée lente, bruit, trop de capacité ou vitesse | mesurer t_r, diminuer R_p, ralentir le bus |
| Échec avec tous les modules | pull-up parallèles trop forts ou capacité cumulée | calculer résistance équivalente et capacité totale |
Une récupération classique libère SDA, génère jusqu’à neuf impulsions SCL puis un STOP. Ne l’utilisez que si toutes les fiches techniques l’autorisent; un reset de segment est parfois plus robuste.
Checklist avant fabrication
- Tous les appareils partagent-ils masse et tension de bus compatibles ?
- SDA et SCL ont-elles chacune un pull-up effectif, sans ajout parallèle involontaire ?
- Les adresses sont-elles uniques et listées en 7 bits ?
- La vitesse est-elle supportée par cibles, traducteurs et isolateurs ?
R_p,minetR_p,maxencadrent-ils la valeur retenue ?- La montée est-elle vérifiée sur la carte avec la capacité réelle ?
Calculateur associé
- Ouvrir le Calculateur Pull-up / Pull-down pour calculer la fenêtre de résistance à partir de
VDD, du courant GPIO, des seuils, de la capacité de ligne et de la limite de temps de montée I²C.
Sources
- NXP Semiconductors, UM10204 — I²C-bus specification and user manual : protocole, niveaux électriques et temporisations Sm/Fm/Fm+.
- Fiches techniques des contrôleurs, cibles, traducteurs, buffers et isolateurs employés : elles priment pour
I_OL,V_OL, les capacités d’entrée et l’étirement d’horloge.