I2C - Deux fils pour tout (tant que les résistances de tirage sont bonnes)
I2C connecte de nombreux appareils sur seulement deux fils grâce aux adresses, à l'acquittement ACK/NACK et à l'extension d'horloge. Élégant quand ça marche, frustrant quand ça ne marche pas.
I2C. Deux fils pour tout (tant que les résistances de tirage sont bonnes)
I2C a été conçu en 1982 chez Philips pour permettre à un microprocesseur de parler aux puces de support sur la même carte. EEPROMs, horloges temps réel, DAC. sans gaspiller beaucoup de GPIO. Deux fils, partagés par tous sur le bus, avec l'adressage intégré dans le protocole. C'est encore la façon standard de connecter des capteurs et des périphériques basse vitesse à un microcontrôleur aujourd'hui.
C'est aussi le protocole le plus susceptible de vous gâcher un après-midi quand quelque chose tourne mal. généralement parce que les résistances de tirage sont absentes, ont une valeur incorrecte, ou interagissent mal avec la capacité d'un câble long. Une fois le modèle électrique compris, le débogage devient beaucoup plus rapide.
Le modèle électrique d'abord
Les deux lignes. SDA (données) et SCL (horloge). sont open-drain avec des résistances de tirage externes. Aucun appareil ne pilote jamais activement une ligne HIGH. Chaque appareil sur le bus peut tirer une ligne LOW en activant un transistor. Quand personne ne tire vers le bas, la résistance de tirage amène la ligne HIGH passivement.
C'est ce qui fait d'I2C un bus véritablement multi-maître : deux appareils peuvent partager SDA et SCL sans maître dédié contrôlant la direction.
Rendering diagram...
Valeurs de pull-up : 4,7kΩ pour 100kHz mode standard, 2,2kΩ pour 400kHz mode rapide. À 1MHz, 1kΩ ou moins, et à ce stade les spécifications de courant de pilote commencent à compter. Pour la plupart des travaux sur capteurs. 100 ou 400kHz, sur carte. 4,7kΩ et passez à autre chose.
Comment fonctionne une transaction
Chaque transaction commence par une condition START : SDA descend alors que SCL est HIGH. Rien d'autre sur le bus ne ressemble à ça, donc chaque appareil sait immédiatement qu'il doit faire attention.
Vient ensuite une adresse 7 bits et un bit R/W. Chaque appareil sur le bus reçoit l'adresse et la compare à la sienne. Celui qui correspond tire SDA vers le bas lors du 9e pulse d'horloge. c'est l'ACK. Tout le monde d'autre reste silencieux.
Rendering diagram...
Le NACK à la fin d'une séquence de lecture est intentionnel. Le maître l'utilise pour dire à l'esclave "c'est tout ce dont j'ai besoin."
Extension d'horloge
Un esclave peut maintenir SCL LOW après que le maître l'a relâché. Cela indique au maître "attendez. je traite encore." Le maître doit vérifier SCL avant d'avancer au bit suivant. La plupart des périphériques I2C matériels gèrent cela automatiquement. Les implémentations bit-bangées parfois non. ce qui cause une corruption mystérieuse des données avec des EEPROMs lents.
Le pattern REPEATED START. à ne pas se tromper
Lire depuis la plupart des capteurs est une opération en deux phases : d'abord écrire l'adresse de registre à lire, puis lire les données. Entre ces deux phases, utilisez un REPEATED START, pas un STOP + START.
Incorrect : [START][addr+W][reg][STOP][START][addr+R][data][STOP]
Correct : [START][addr+W][reg][RESTART][addr+R][data][STOP]
Certains capteurs acceptent les deux. Certains (notamment des EEPROMs anciens et quelques expandeurs I/O) réinitialiseront leur état interne au STOP et retourneront le mauvais registre. Si vous lisez un capteur et obtenez de bonnes données mais du mauvais registre, REPEATED START est l'endroit où je regarderais.
Conflits d'adresse
L'adressage 7 bits donne 128 adresses possibles. Une poignée est réservée, laissant 112 utilisables. La plupart des capteurs ont une ou deux pins de sélection d'adresse. Quand deux appareils partagent une adresse et que vous ne pouvez pas changer l'un ou l'autre, la réponse pratique est un second bus I2C.
I2C est un excellent choix pour tout ce qui est lent et sur carte. Capteurs, EEPROMs, RTC, contrôleurs d'affichage. Dès que vous avez besoin d'aller au-delà de quelques dizaines de centimètres ou d'effectuer des transferts haute vitesse fiables, il y a de meilleures options.