I2C
Si l’UART permet de communiquer sur de longues distances, l’I2C à été conçu pour les courtes distances. Il permet par exemple à un ordinateur de mesurer des températures à plusieurs endroits à l’intérieur du boîtier.
Le bus I2C (Inter-Integrated Circuit) a été inventé par Philips en 1982 et reste très utilisé de nos jours par les microcontrôleurs. L’I2C est un bus qui n’a besoin que de deux fils (en plus d’une masse commune) pour relier un grand nombre de périphériques:
Les deux fils (ou les deux signaux) sont SDA
et SCL
. le signal SDA
(Serial Data Line) est le signal de données
et le signal SCL
(Serial Clock Line) est le signal d’horloge. Une horloge indique que nous avons à faire à une
communication synchrone et comme il n’y a qu’un seul fil pour les données entrantes et sortantes, la communication est en simplex.
Le bus I2C n’est pas particulièrement rapide. Dans la pratique, l’horloge a une fréquence de 100 ou 400 kHz ce qui donne une vitesse de 100 ou 400 kbit/s.1
Sur un bus, il y a un seul contrôleur (à la fois) qui gère toutes les transactions vers les périphériques. Chaque périphérique est représenté par une adresse (ou un identifiant) unique sur le bus. Il existe un mode où les adresses sont sur 10 bits, mais la plupart de périphériques utilisent des adresses sur 7 bits.
Dans la pratique, les constructeurs de périphériques fixent plusieurs bits de l’adresse et en laissent quelques-uns configurables. On peut illustrer cette pratique avec un l’exemple du “24LC256”. Il s’agit d’une mémoire EEPROM (Electrically Erasable Programmable Read-Only Memory) de 256 Kibit souvent utilisés pour stocker des données dans des systèmes embarqués.
La figure ci-dessous illustre le boîtier et les broches du périphérique. On y retrouve les deux signaux (SDA et SCL) et on voit aussi 3 broches (A0, A1 et A2) qui permettent de définir les derniers bits de l’adresse I2C de la mémoire.
Plus loin dans la documentation du périphérique, on trouve un schéma qui explique la structure de l’adresse :
Les quatre premiers bits sont donc fixes (1010
) et on peut configurer les 3 derniers bits en connectant les
broches à Vcc (3.3V) ou à Vss (0V). On peut donc avoir 8 de ces mémoires sur un bus avec des adresses I2C
entre 0x50
(80 en décimal) et 0x57
(87 en décimal).
Note
Dans l’API de Mbed OS, l’adresse inclut le bit de lecture/écriture et est donc sur 8 bits et non 7. Lisez bien la documentation pour les détails
Les signaux SDA
et SCL
permettent de signaler un début de transmission (\(S\)), d’envoyer ou de reçevoir des bits (\(B_i\)) et de signaler
la fin de la trame (\(P\)) :
Pour plus d’information, consultez la page Wikipedia.
Pour utiliser l’I2C avec Mbed OS consultez la documentation de l’API correspondante.
Exercice
Exercice I2C/1
Cherchez sur Internet d’autres périphériques qui utilisent l’I2C
Solution
En plus des thermomètres et des mémoires EEPROM, on trouve encore
- Des I/O supplémentaires (https://www.ti.com/product/PCF8575)
- Des “Real time clocks” (https://datasheets.maximintegrated.com/en/ds/DS1307.pdf)
- Des accéléromètres (https://www.nxp.com/docs/en/data-sheet/MMA8452Q.pdf)
- Des écrans OLED (https://www.adafruit.com/product/326#technical-details)
-
Le STM32F412 permet des vitesses de 1Mbps, mais cette vitesse est rarement utilisée en pratique. ↩