Retour à la première page
1. Où est le problème ?
2. Communication en série : je vous en mets combien ?
3. L'accusé de réception : Tu m'entends ?
4. Un réseau, des adresses : Qui cause à qui ?

5. Les conditions de départ et de fin

Une astuce supplémentaire permet aux composants de différencier l'adresse des données. L'adresse est toujours en début de message. Il faut donc savoir quand commence le message, et aussi quand il finit.

Remarque : par la suite, j'utiliserai indifféremment message et trame.

Nous allons découvrir la condition de départ et la condition de fin de trame.

Le protocole I2C nomme les conditions de départ et de stop réciproquement par start condition et stop condition.

Tu auras remarqué, judicieux(/se) que tu es, que la ligne SDA ne change d'état que lorsque SCL est actif (à l'état bas). Ça permet à Toto de préparer les données qu'il va envoyer.
Les deux seuls cas où SDA est modifié pendant que SCL est inactif sont ceux des conditions de départ et de stop. Et, comme tous les composants I2C ont été mis au courant dès leur fabrication, ils comprendront qu'il s'agit d'un début ou d'une fin de trame.

 

Chronogramme 10 : conditions de départ et de fin

SCL
SDA
 
départ
start
SCL
SDA
 
fin
stop

Voilà ce que devient le début du chronogramme 9 vu au chapître 4. On imagine que Toto a le désir de n'envoyer plus qu'un octet.

Chronogramme 11

SCL
SDA
start
adresse esclave + écriture : 67
r/w
ack
donnée 1 : 65
ack
stop

Au cours du point 4, je t'ai fait savoir que le maître transmet à la suite de l'adresse un bit signifiant à l'esclave qu'il doit être émetteur ou destinataire de données. Dans nos exemples, Toto envoyait toujours des données et n'en recevait jamais.

Mais maintenant, Toto veut demander à Lili de lui transmettre des données.

Il va commencer par une condition de départ, l'envoi de l'adresse de Lili (0100 000_) en positionnant le bit r/w à 1 pour une lecture.
Si tout va bien, Lili répond avec un signal d'acquittement.
Et là, comme c'était le cas pour le signal d'acquittement (voir le point 3), l'esclave Lili va transmettre ses données sur la ligne SDA selon l'horloge contrôlée par Toto par la ligne SCL. Pour bien comprendre, je te propose de revoir un chronogramme en dissociant SDA écrit par Toto, SDA écrit par Lili et la ligne SDA qui en résulte et qui est lue par les deux composants.

Pour tout saisir, je te rappelle que l'adresse de Lili est 64 ou 0100000_. Que la donnée qu'elle contient est 73 ou 01001001.

Chronogramme 12

SCL
SDA Toto
SDA Lili
SDA réel
start
adresse esclave + écriture : 67
r/w
ack
donnée 1 : 65
ack
stop

La particularité de cette trame, c'est que pendant la transmission de la donnée, c'est Lili l'esclave qui a contrôlé la ligne SDA. Toto pendant ce temps, a produit les créneaux SCL et lu les données de Lili.

Ta perspicacité n'aura pas laissé s'échapper le Înack' ou non-acquittement produit par Toto à la suite de la donnée 1 transmise par Lili. Cela ne veut pas dire que Toto n'a pas bien reçu les 8 bits de la donnée, mais il veut signaler à Lili qu'elle doit s'arrêter de transmettre ses données. Si Toto avait envoyé un acquittement, Lili aurait continué à envoyer des données.

Remarque : Certains composants I2C esclaves n'ont qu'une donnée pertinente à transmettre. D'autres ont plus de conversation, il leur est par conséquent utile de pouvoir transmettre plusieurs octets à la suite.

 

Il est courant, au pays de l'I2C, qu'un maître comme Toto désire écrire une donnée à un esclave comme Fleur puis lui demander des données en retour. Souvent, la première écriture est là pour définir ce que sera la demande de données.

Les trames ressemblent dans ces cas à la trame suivante :

Trame 13

Qu'y voit-on ?

On a reconnu le start de départ et le stop de fin.

La première partie de la trame débute par le passage de l'adresse de l'esclave avec le bit r/w en écriture (c'est-à-dire à l'état bas), suivi d'un signal d'acquittement de l'esclave. Le maître envoie sa donnée en écriture. L'esclave signale l'acquittement.

Et là, du neuf : restart. Et oui, c'est une nouvelle condition de départ, sans stop avant. Toto garde le contrôle de la ligne I2C parce qu'il n'en n'a pas fini. Mais la sous-trame est terminée. Pour en réamorcer une autre, il fait comme s'il commençait une nouvelle trame.

Et on repart : envoi de la même adresse de Lili, avec cette fois le bit r/w à l'état haut pour signaler une demande de lecture. Lili s'est de nouveau reconnue, elle envoi son signal d'acquittement. Ensuite, c'est à elle de transmettre ses données. Le maître Toto dispense ses signaux d'acquittement. Quand il en a assez, il envoi un signal de non-acquittement. Lili s'arrête. Il ne reste plus, pour Toto, qu'à envoyer une condition de stop pour achever la trame composée.

Remarque : Ce modèle de communication est extrêmement fréquent. Bien entendu, on peut la compléter pour permettre au maître d'envoyer plusieurs données à l'esclave avant d'entamer la sous-trame de lecture. On aurait alors un modèle de communication complet.

Dans le cas d'une lecture, un esclave cesse d'envoyer des données lorsque le maître n'a pas envoyé de signal d'acquittement.
Une trame débute par une condition de départ (start) et se termine par une condition de stop. Un maître peut enchaîner plusieurs trames en renvoyant une condition de départ (restart) à la suite d'une première trame.

6. Politesse et multi-maîtres