Interface I2C (I2C signifie Inter Integrated Circuits)

Le bus I2C (BUS I2C est une marque déposée par PHILIPS composants) constitue un moyen simple de relier (ou de mettre en réseau) des composants ou des sous-ensembles électroniques. Ce bus permet un échange bidirectionnel d'informations à une fréquence pouvant atteindre 100 Kbits/s. Il fonctionne selon le mode de transmission série et n'utilise que deux conducteurs actifs : SDA (pour Sérial DAta) et SCL (pour Sérial CLock).

Le lecteur désireux de mieux connaître les spécifications et la mise en œuvre du bus I2C trouvera dans l'ouvrage " Le Bus I2C " de Dominique PARET (Editions DUNOD) tous les renseignements souhaités sur ce sujet.

Précisons simplement quelques principes indispensables à la compréhension de la description de l'interface I2C placée dans les 8xC552.

Un émetteur est celui qui envoie les données alors que le récepteur les reçoit.

Le maître est le composant qui a initialisé la communication et qui produit du même coup le signal d'horloge.

L'esclave est le composant adressé par un maître. Un esclave peut émettre ou recevoir sous contrôle de l'horloge du maître.

Plus d'un maître peut tenter de prendre le contrôle du bus.

La notion d'arbitrage est la procédure qui permet d'accorder le bus à un seul maître à la fois.

Un maître peut devenir esclave et inversement.

Le transfert d'une donnée commence par une condition de départ (START : SDA passe de 1 à 0 et SCL = 1) le bus est alors occupé.

Le transfert d'une donnée se termine par une condition d'arrêt (STOP : SDA passe de 0 à 1 et SCL = 1) le bus est alors libre.

La figure 4.21 illustre une mise en réseau de trois composants sur le bus I2C.

 

Figure 4.21 : Réseau I2C

Dans les PCB 8xC552, l'interface I2C est baptisée SIO1, l'appellation SIO1 étant réservée au port série de type UART commun à tous les 8051. Le schéma-bloc dg la figure 4.22 résume l'organisation fonctionnelle de l'interface I2C.

 

Broches SDA et SCL

Les deux broches correspondantes à SDA et SCL (P1.7 et P1.6) sont à drain ouvert, sans diode de protection. Il sera donc nécessaire de prévoir une résistance de rappel sur chacune de ces lignes (résistances Rp de la figure 4.21). Cette disposition permet de couper éventuellement l'alimentation d'un composant sans pour autant perturber le fonctionnement des autres composants placés sur le bus.

 

 

Figure 4.22 : Interface I2C

Ces deux broches sont aussi équipées d'un filtre numérique d'entrée, afin d'éliminer d'éventuels parasites et d'assurer une bonne interprétation des niveaux logiques présents sur le bus. Ainsi, toute tension inférieure à 1.5 V est interprétée comme un 0 logique, et toute tension supérieure à 3 V est interprétée comme un 1.

Générateur d'horloge SCL

Par division interne de la fréquence de l'horloge principal du microcontrôleur (fosc), ou à partir de la périodicité de dépassement du TIMER l, un signal de rapport cyclique de 50 % permet de cadencer le débit d'émission ou de réception lorsque l'interface SIO1 est en mode MAITRE. La fréquence du débit est programmable par positionnement des 3 bits CR2, CR1 et CR0 du registre S1CON.

Le tableau 4.23 résume la suite des fréquences ainsi réalisables.

CR2

CR1

CR0

Débit en Kbits/s à fosc=l2MHz

Facteur

0

0

0

47

fosc/256

0

0

1

54

fosc/224

0

1

0

63

fosc/192

0

1

1

75

fosc/160 -

1

0

0

12.5

fosc/960

1

0

1

100

fosc/120

1

1

0

200(l)

Fosc/60

1

1

1

> 0.5

(2)

(1) : ce débit dépasse les spécifications I2C.

(2) : débit définit par la formule 96 x (256 - Timer 2).

Tableau 4.23 : Fréquences de l’horloge SCL

Registres à fonction spéciale

Quatre registres à fonction spéciale permettent une gestion complète de l'interface. Il s'agit de :

NOM

Fonction

Adresse

S1CON

S1STA

S1DAT

S1ADR

contrôle de l'interface

état de l'interface

donnée pour émission ou réception

adresse I2C du composant

(D8h)

(D9h)

(DAh)

(DBh)

 

Registre de contrôle SlCON

Ce registre est adressable au niveau du bit et assure le contrôle de l'interface SIO1.

Le bit ENS1 permet de valider le fonctionnement de l'interface I2C. Si ENS1 est laissé à 0, les broches SDA et SCL (ou plus exactement, dans ce cas, P1.6 et P1.7) sont mises à un état de haute impédance et peuvent être utilisées comme des lignes d'entrée/sortie. Dans ce cas, il faudra prévoir de doter ces lignes de résistances de rappel au +5 V comme pour le port P0.

Lorsque ENS1 est mis à 1, l'interface I2C est activée.

Le bit STA permet de valider le début d'un échange de données. Si STA est mis à 1, l'interface entre dans le mode MAITRE et vérifie que le bus est libre et dans l'affirmative génère une condition de START. Dans le cas contraire, la logique d'arbitrage provoque l'attente d'une condition de STOP sur le bus. Après une demi-période d'horloge la condition de START est mise en place. Si STA est positionné à 1, alors que l'interface est déjà maître du bus, on génère alors une condition de RE-START. Si STA = 0 la condition de START ne peut pas être générée et le composant est considéré comme étant en mode esclave.

En positionnant le bit STO à l, l'interface I2C en mode maître fixe électriquement sur le bus une condition de STOP. Dès que cette condition est présente sur SDA et SCL, le bit STO est remis automatiquement à 0.

Dans le cas où les bits STA et STO sont simultanément à 1, c'est une condition de STOP qui est d'abord générée suivie d'une condition START.

Si le bit AA est positionné à l, un acquittement (niveau bas sur la ligne SDA) est retourné pendant la neuvième période d'horloge de SCL quand :

- l'adresse donnée au composant en tant qu'esclave est reçue ;

- un appel général est reçu (et bit GC de S1ADR = 1) ;

- un octet de donnée est reçu en mode récepteur maître ;

- un octet est reçu en mode esclave récepteur.

Si le bit AA est laissé à 0, un non-acquittement (niveau haut sur la ligne SDA) est retourné pendant la neuvième période d'horloge SCL quand:

- un octet de donnée est reçu alors que l'interface est en mode maître récepteur ;

- un octet de donnée est reçu alors que l'interface est en mode esclave récepteur.

Le bit SI est l'indicateur d'interruption qui peut provoquer une requête si l'état des bits EA et ES1 l'autorise. SI est positionné par l'un des 26 comptes-rendus pouvant survenir lors d'un échange de données. En réalité, seulement 25 de ces 26 comptes-rendus provoquent la mise à 1 de SI car le vingt sixième (registre S1STA = F8h) indique que rien de significatif ne s'est produit. La demande d'interruption s'accompagne de la mise en place dans le registre S1STA d'un code caractérisant le compte-rendu.

S1CON : Adresse directe D8h adressable au niveau du bit.

DFh

DEh

DDh

DCh

DBh

DAh

D9h

D8h

CR2

ENS1

STA

STO

SI

AA

CR1

CR0

ENS1 : Autorisation de fonctionnement du port I2C si ENS1=1.

STA : (STArt) Validation de départ de l'échange I2C.

STO : (STOp) Indicateur d'arrêt.

SI : Indicateur d'interruption.

AA : (Assert Acknowledge). Si AA=1 un acquittement est renvoyé durant la neuvième période d'horloge de SCL.

Si AA=O un non-acquittement est renvoyé durant la neuvième période d'horloge de SCL.

Les conditions d'acquittement ou de non-acquittement sont précisées dans le texte.

CR0 : Définition du débit d'échange sur le bus I2C. Ces trois

CR1 bits permettent de fixer la fréquence de l'horloge SCL

CR2 à condition que le microcontrôleur soit en mode maître.

 

Tableau 4.24 : Registre de contrôle de l'interface I2C

Registre d'adresse S1ADR

Ce registre n'est utile qu'en mode esclave. II est destiné à définir l'adresse du composant. Un composant en mode maître doit désigner par son adresse le composant esclave avec lequel il désire établir l'échange. Pour placer un composant en mode esclave il faut initialiser les registres S1ADR et S1CON de la façon suivante :

S1ADR :

X

X

X

X

X

X

X

GC

adresse de l'esclave

Si GC est mis à 1, le composant peut aussi répondre à un appel général (adresse 00).

Lorsque GC est à 0, le composant ignore un appel général et ne répond que pour son

adresse personnelle.

S1CON :

CR2

ENS1

STA

STO

SI

AA

CR1

CR0

X

1

0

0

0

1

X

X

ENS1 doit être placé à 1 pour valider l'ensemble SIO1. Le bit AA est mis à l pour que le composant accuse réception de la donnée et les bits STA, STO doivent être mis à 0 car un esclave ne doit pas envoyer de condition de départ, ni de condition d'arrêt.

Registre d'état S1STA

Ce registre rend compte du déroulement de l'échange. Lorsqu'un échange s'est produit, un code est placé dans ce registre. Une étude détaillée fait apparaître 26 cas différents pouvant être signalés pour les quatre situations suivantes :

maître récepteur ;

maître émetteur ;

esclave récepteur ;

esclave émetteur.

Le code est placé dans les 5 bits de poids fort du registre S1STA alors que les trois bits de poids faible sont toujours maintenus à 0. Les valeurs placées dans ce registre sont donc espacées de 8 unités. Cette particularité a été prévue pour utiliser les valeurs de ce registre comme une suite d'adresses correspondant à une suite de programmes de huit octets assurant chacun le traitement d'un des 26 comptes rendus.

S1STA :

X

X

X

X

X

0

0

0

code compte-rendu

Le constructeur préconise l'exploitation suivante :

Lorsque l'indicateur SI est mis à 1 et que l'interruption de l'interface SIO1 est autorisée, le compteur programme se branchera à l'adresse 002Bh (adresse du vecteur d'interruption pour SIO1). A cette adresse on place le programme suivant :

S1: PUSH PSW ; sauvegarde des indicateurs programme

PUSH S1STA ; EMPILER LE CODE DE L'INCIDENT

PUSH H_ADR ; empiler le poids fort de l'adresse

RET

 

L'instruction RET provoque un saut, non pas vers l'adresse de retour normal, mais à l'adresse calculée à partir des valeurs de H_ADR et de S1STA. H_ADR représente la valeur des huit bits de poids fort de la zone de mémoire programme où sont implantés les programmes assurant le traitement des 26 cas à traiter. Chacun de ces programmes commence à une adresse dont les huit bits de poids faible sont déterminés par le contenu de S1STA.

 

 

La figure 4.25 illustre un des modes de fonctionnement de l'interface I2C. II s'agit d'une transmission en mode maître. Quant aux tableaux 4.26 à 4.30, ils résument les codes des comptes-rendus et leurs significations.

 

Emission réussie vers un récepteur esclave

Transfert suivant demandé avec une condition de départ répétée

Pas d'acquittement reçu après l'adresse esclave

Pas d'acquittement reçu après un octet de donnée

Arbitrage perdu dans l'adresse esclave ou dans l'octet de donnée

Arbitrage perdu et adressé en tant qu'esclave

 

 

S : Condition de START

SLA : Adresse de l'esclave (7 bits)

R : bit de lecture (1 logique)

W : bit pour écriture (0 logique)

A : bit d'acquittement (0 logique dans SDA)

A : bit de non acquittement (1 logique) (A + une flèche au dessus)

DATA : donnée de 8 bits

P : condition de STOP

 

Figure 4.25 : Format et états en transmission, mode maître

 

 

CODE

Comple-rendu de l'état du bus

Réponse logicielle

Action suivante sur le bus

vers/depuis St DAT

vers S1CON

STA

STO

SI

AA

08h

Une condition de START a été envoyée.

Charger SLA+W

X

0

0

X

SLA+W va être transmis et un ACK sera reçu.

10h

Une condition répétée de START a été envoyée.

Charger SLA+W ou

X

0

0

X

Idem

SLA+R

X

0

0

X

SLA+R va être envoyé et l'ensemble SI01 est commuté en réception mode MAITRE.

18h

SLA+W ont été envoyés et ACK a été reçu.

Charger DATA ou

0

0

0

X

La donnée sera envoyée et un ACK sera reçu.

Pas d'opération ou

1

0

0

X

La condition de START répétée sera envoyée.

Pas d'opération ou

0

1

0

X

Une condition de STOP sera envoyée et l'indicateur STO sera remis à 0.

Pas d'opération

1

1

0

X

Une condition STOP suivie d'une condition START seront envoyées et STO, remis à 0.

20h

SLA+W ont été envoyés et un "NOT ACK" (non- acquittement) a été reçu.

Charger DATA ou

0

0

0

X

La donnée est envoyée et un ACK sera reçu.

Pas d'opération ou

1

0

0

X

Un START répété sera envoyé.

Pas d'opération ou

0

1

0

X

Une condition STOP sera envoyée et STO remis à 0.

Pas d'opération

1

1

0

X

Un condition STOP suivie d'une condition START seront envoyées et STO, remis à 0.

28h

La donnée placée dans Si DAT a été envoyée et un ACK a été reçu.

Charger DATA ou

0

0

0

X

La donnée est envoyée et un ACK sera reçu.

Pas d'opération ou

1

0

0

X

Un START répété sera envoyé.

Pas d'opération ou

0

1

0

X

Une condition STOP sera envoyée et STO, remis à 0.

Pas d'opération

1

1

0

X

Une condition STOP suivie d'une condition START seront envoyées et STO, remis à 0.

30h

La donnée placée dans S1 DAT a été envoyée et un "NOT ACK" a été reçu.

Charger DATA ou

0

0

0

X

La donnée est envoyée et un ACK sera reçu.

Pas d'opération ou

1

0

0

X

Un START répété sera envoyé.

Pas d'opération ou

0

1

0

X

Une condition STOP sera envoyée et STO remis à 0.

Pas d'opération

1

1

0

X

Une condition STOP suivie d'une condition START seront envoyées et STO, remis à 0.

38h

Arbitrage perdu lors d'un envoi SLA+W ou SLA+R ou DATA

Pas d'opération

0

0

0

X

Le bus I2C est libéré.

Pas d'opération

1

0

0

X

Une condition START sera envoyée lorsque le bus sera libre.

 

Tableau 4.26 : Comptes-rendus en transmission, mode maître

 

CODE

Compte-rendu

de l'état du bus

Réponse logicielle

Action suivante sur le bus

vers/depuis S1DAT

vers S1 CON

STA

STO

SI

AA

08H

Une condition de

START a été

envoyée.

Charger SLA+R

X

0

0j

X

SLA+R va être envoyé et un ACK sera reçu.

10H

Une condition

répétée de START

a été envoyée.

Charger SLA+R ou

SLA+W

X

0

0

X

Idem

X

0

0

X

SLA+W va être envoyé et l'ensemble S101 sera commuté en émetteur mode MAITRE.

38H

Arbitrage perdu sur

un SLA+R ou sur

un non -

acquittement

Pas d'action ou -

0

0

0

X

Le bus va être libéré et le S101 entre en mode esclave non adressé.

Pas d'action

1

0

0

X

Une condition de START sera envoyée lorsque le bus sera libre.

40H

SLA+R ont été

envoyé et ACK reçu

Pas d'action ou

0

0

0

0

Une DATA va être reçue et un NOT ACK sera retourné

Pas d'action

0

0

0

1

Une DATA va être reçue e1 un ACK sera retourné.

48H

SLA+R a été

envoyé et un NOT

ACK reçu

Pas d'action ou

1

0

0

X

Une condition de START répétée sera envoyée.

Pas d'action ou

0

1

0

X

Une condition de STOP sera envoyée et STO remis à 0.

Pas d'action

1

1

0

X

Une condition de STOP suivie d'une condition de START seront envoyées et STO

remis à 0.

50H

Une DATA a été

reçue et un ACK

reçu

Lecture de DATA ou

0

0

0

0

Une DATA va être reçue et un NOT ACK sera retourné.

Lecture de DATA ou

0

0

0

1

Une DATA va être reçue et un ACK sera retourné.

58H

Une DATA a été

reçue et un NOT

ACK retourné

Lecture de DATA ou

1

0

0

X

Une condition de START répétée sera envoyée.

Lecture de DATA ou

0

1

0

X

Une condition de STOP sera envoyée et STO remis à 0.

Lecture de DATA

1

1

0

X

Une condition de STOP suivie d'une condition de START seront envoyées et STO

remis à 0.

 

Tableau 4.27 : Comptes-rendus en réception, mode maître

 

CODE

Compte-rendu

de l'état du bus

Réponse logicielle

Action suivante sur le bus

vers/depuis S1DAT

vers S1CON

.

STA

STO

SI

AA

60H

Le SLA+W attribué au composant a été reçu et un ACK renvoyé

Pas d'opération

X

0

0

0

DATA sera reçu et NOT ACK retourné.

Pas d'opération

X

0

0

1

DATA sera reçu et ACK sera retourné

68H

En mode maître arbitrage perdu sur réception d'un SLA+R ou SLA+W.

En mode esclave, le SLA+W attribué a été reçu et un ACK renvoyé.

Pas d'opération

X

0

0

0

DATA sera reçu et NOT ACK retourné.

Pas d'opération

X

0

0

1

DATA sera reçu et ACK sera retourné.

70H

Un appel général (SLA=O) a été reçu et un ACK renvoyé.

Pas d'opération

X

0

0

0

DATA sera reçu et NOT ACK retourné.

Pas d'opération

X

0

0

1

DATA sera reçu et ACK sera retourné.

78H

En mode maire, arbitrage perdu sur réception d'un SLA+R ou SLA+W. En mode esclave, un appel général a été reçu et un ACK renvoyé.

Pas d'opération

X

0

0

0

DATA sera reçu et NOT ACK retourné.

Pas d'opération

X

0

0

1

DATA sera reçu et ACK sera retourné.

80H

Préalablement adressé par te SLA attribué, une DATA a été reçue et un ACK retourné.

Lecture de DATA

X

0

0

0

DATA sera reçu et NOT ACK retourné.

Lecture de DATA

X

0

0

1

DATA sera reçu et ACK

88H

Préalablement adressé par le SLA attribué, une DATA a été reçue et un NOT ACK retourné.

Lecture de DATA

0

0

0

0

Commuté en mode non adressé, ne reconnaît pas son SLA ou un appel général.

Lecture de DATA

0

0

0

1

Commuté en mode non adressé, peut reconnaître son SLA ou un appel général si SADR.0=1.

Lecture de DATA

1

0

0

0

Commuté en mode non adressé, ne reconnaît pas son SLA ou un appel général. Une condition de START sera envoyée lorsque le bus sera libre.

Lecture de DATA

1

0

0

1

Commuté en mode non adressé, peut reconnaître son SLA ou un appel général si SADR.0=1. Une condition de START sera envoyée lorsque le bus sera libre.

90H

Préalablement adressé par un appel général, une DATA a été reçue et un ACK retourné.

Lecture de DATA

X

0

0

0

DATA sera reçu et NOT ACK retourné.

Lecture de DATA

X

0

0

1

DATA sera reçu et ACK sera retourné.

98H

Préalablement adressé par un appel général, une DATA a été reçue et un NOT ACK retourné.

Lecture de DATA

0

0

0

0

Commuté en mode non adressé, ne reconnaît pas son SLA ou un appel général.

Lecture de DATA

0

0

0

1

Commuté en mode non adressé, peut reconnaître son SLA ou un appel général si SADR.O=1.

Lecture de DATA

1

0

0

0

Commuté en mode non adressé, ne reconnaît pas son SLA ou un appel général. Une condition de START sera envoyée lorsque le bus sera libre.

Lecture de DATA

1

0

0

1

Commuté en mode non adressé, peut reconnaître son SLA ou un appel général si SADR.0=1. Une condition de START sera envoyée lorsque le bus sera libre.

A0H

Une condition de STOP ou de START répétée a été reçue alors que l'on est encore adressé en mode émetteur ou récepteur esclave (SLV mode).

Lecture de DATA

0

0

0

0

Commuté en mode non adressé, ne reconnaît pas son SLA ou un appel général.

Lecture de DATA

0

0

0

1

Commuté en mode non adressé, peut reconnaître son SLA ou un appel général si SADR.0=1.

Lecture de DATA

1

0

0

0

Commuté en mode non adressé, ne reconnaît pas son SLA ou un appel général. Une condition de START sera envoyée lorsque le bus sera libre.

Lecture de DATA

1

0

0

1

Commuté en mode non adressé, peut reconnaître son SLA ou un appel général si SADR.0=1. Une condition de START sera envoyée lorsque le bus sera libre.

 

Tableau 4.28 : Comptes-rendus en réception, mode esclave

 

CODE

Compte-rendu

de l'état du bus

Réponse logicielle

Action suivante sur le bus

vers/depuis S1 DAT

vers S1 CON

STA

STO

SI

AA

A8H

Le SLA+R attribué

au composant a été

reçu et un ACK

renvoyé.

Charger une DATA

X

0

0

0

La dernière DATA sera envoyée et ACK sera reçu,

Charger une DATA

X

0

0

1

DATA sera envoyée et ACK sera reçue.

B0H

En mode maître, arbitrage perdu sur réception d'un SLA+R ou SLA+W. En mode esclave, le SLA+R attribué a été reçu et un ACK renvoyé.

Charger une DATA

X

0

0

0

La dernière DATA sera envoyée et ACK sera reçu.

Charger une DATA

X

0

0

1

DATA sera envoyée et ACK sera reçue.

B8H

La DATA placée dans S1 DAT a été envoyée et un ACK reçu.

Charger une DATA

X

0

0

0

La dernière DATA sera envoyée et ACK sera reçu.

Charger une DATA

X

0

0

1

DATA sera envoyée et ACK sera reçue.

C0H

La DATA placée dans S7 DAT a été envoyée et un NOT ACK a été reçu en retour.

Pas d'opération

0

0

0

0

Commuté en mode esclave non adressé, ne reconnaît pas son SLA ou un appel général.

Pas d'opération

0

0

0

1

Commuté en mode esclave non adressé, peut reconnaître son SLA ou un appel général si SADR.0=1.

Pas d'opération

1

0

0

0

Commuté en mode non adressé, ne reconnaît pas son SLA ou un appel général. Une condition de START sera envoyée lorsque le bus sera libre.

Pas d'opération

1

0

0

1

Commuté en mode non adressé, peul reconnaître son SLA ou un appel général si SADR.0=1. Une condition de START sera envoyée lorsque le bus sera libre.

C8H

La dernière donnée DATA (AA=O) a été envoyée et un ACK a été reçu en retour.

Pas d'opération

0

0

0

0

Commuté en mode esclave non adressé, ne reconnaît pas son SLA ou un appel général

Pas d'opération

0

0

0

1

Commuté en mode esclave non adressé, peut reconnaître son SLA ou un appel général si SADR.0=1,

Pas d'opération

1

0

0

0

Commuté en mode non adressé, ne reconnaît pas son SLA ou un appel général. Une condition de START sera envoyée lorsque le bus sera libre.

Pas d'opération

1

0

0

1

Commuté en mode non adressé, peut reconnaître son SLA ou un appel général si SADR.0=1 . Une condition de START sera envoyée lorsque le bus sera libre.

Tableau 4.29 : Comptes-rendus en transmission, mode esclave

 

CODE

Compte-rendu de l'état du bus

Réponse logicielle

Action suivante sur le bus

vers/depuis S1 DAT

vers S1CON

 

STA

STO

SI

AA

F8H

Aucune signification particulière.

Pas d'action

Pas d'action

En attente, ou transfert en cours.

00H

Erreur sur le bus provoquée par une sélection de mode ou causée par une condition de START (ou de STOP) illégale. Le compte-rendu 00H peut aussi être provoqué. par une interférence au niveau de SIO1.

Pas d'action

0

1

0

X

Seule la partie matérielle de l'interface SIO1 est affectée. Dans tous les cas, le bus est libéré et la SIO1 est placée en mode esclave non adressé et l'indicateur STO et remis à 0.

Tableau 4.30 : Autres comptes-rendus