1. Introduction
1.1. Présentation
I²C (pour Inter Integrated Circuit Bus) est le nom du bus historique, développé par Philips
Semiconductor pour les applications de domotique et d’électronique domestique au début des années
1980, notamment pour permettre de relier facilement à un microprocesseur les différents circuits d’une
télévision « moderne ».
1.2. Caractéristiques
Il présente les propriétés suivantes :
C’est un bus série synchrone bifilaire utilisant une ligne de donnée appelé SDA (Serial Data) et une
ligne d’horloge appelé SCL (Serial clock). Une masse commune doit être connectée (figure 1).
Les données peuvent être échangées dans les deux sens sans restriction ;
Le bus est multi- maitres ;
Chaque abonné dispose d’une adresse unique codée sur 7 ou 10 bits. On peut donc connecter
simultanément 128 ou 1024 abonnés d’adresses différentes sur le même bus (sous réserve de ne pas le
surcharger électroniquement) ;
Un acquittement est généré pour chaque octet de donnée transféré ;
Le bus peut travailler à une vitesse de 100Kbit/s mode standard et 400Kbits/s en mode rapide voire
même 1Mbit/s pour les circuits les plus récents (High speed mode).
Au repos, SDA et SCL sont au niveau haut. Elles peuvent être uniquement être forcées au niveau bas.
On ne peut pad les forcer au niveau haut ;
Le module qui demande le transfert de données et qui génère l’horloge est le maître, le module qui
répond est un esclave. Un même système peut disposer de plusieurs maîtres, on le nomme alors
multi-maître. Dans ce cas, il faut arbitrer la discussion entre les différents modules.
Comme les lignes SDA et SCL sont au repos au niveau haut, les composants (maîtres, esclaves) I²C ne
peuvent donc que les forcer qu’à l’état bas. Pour éviter les conflits électriques, le fonctionnement impose aux
circuits des sorties à collecteur (figure 2) ouvert ou à drain ouvert pour SDA et SCL.
1
MSSP en mode I2C ISET Kairouan
2
MSSP en mode I2C ISET Kairouan
S : bit de Start, est la condition de départ : SDA passe de l’état haut à l’état bas pendant que SCL est au
niveau haut (cf. figure 2).
Adresse : représente celle du module à laquelle on veut s ‘adresser, elle est composée de 7 bits A0 à A6.
A6A5A4A3 sont fixés par l’I²C commitee. A2A1A0 sont libres pour nous permettre de mettre plusieurs
fois le même esclave sur le bus (au maximum 8).
R/W (Read Write) : est le bit de mode de transmission. S’il est à 0, on est en mode écriture, c’est le
maître qui envoie des données à l’esclave. S’il est à 1, on est en mode lecture, c’est l’esclave qui envoie
des données au maître. L’Adresse et R/W sont transmis ensemble ce qui forme un mot de 8 bits.
ACK : bit d’acquittement, il a lieu à la fin de chaque transmission d’un mot pour dire que le récepteur a
bien reçu les données. Après, l’envoi du mot de 8 bits, au coup d’horloge, le récepteur force SDA à
l’état bas.
Donnée : sont les huit bits de données que l’on transmet.
P : bit de stop, est la condition de stop. SDA passe de l’état bas à l’état haut pendant que SCL est au
niveau haut (cf. figure 3).
3
MSSP en mode I2C ISET Kairouan
Exemple :
Les deux maitres imposent les mêmes données, le premier octet sera alors transmis normalement.
Pour le deuxième octet, le maitre N°2 impose ‘1’ mais relit ‘0’ ; il perd le contrôle du bus et devient esclave.
Le maitre N°1 ne voit pas le conflit et continue d’émettre normalement, et l’esclave reçoit les données sans
erreurs.
4
MSSP en mode I2C ISET Kairouan
En mode esclave, le registre SSPADD contient l’adresse de l’esclave. Lorsque le SSP est configuré en mode
maître, les 7 bits du poids faible du SSPADD représentent le compteur du générateur d’horloge.
Vitesse en baud= FOSC/(4 * (SSPADD + 1))
Au mode adresse 10 bits, l’utilisateur doit tout d’abord écrire les bits de poids forts de cette adresse dans le
registre SSPADD (11110A9 A8 0) puis après une comparaison réussie avec les informations reçues, y écrire
les 8 bits de poids faibles
R/W R/W R R R R R R
SSPSTAT SMP CKE D/A P S R/W UA BF
Bit 7 Bit 0
5
MSSP en mode I2C ISET Kairouan
6
MSSP en mode I2C ISET Kairouan
7
MSSP en mode I2C ISET Kairouan
8
MSSP en mode I2C ISET Kairouan
10
MSSP en mode I2C ISET Kairouan
4. Application
On désire en premier partie et à travers le bus I2C, faire communiquer deux microcontrôleurs
PIC18F4520. Puis en deuxième partie, on veut connecter une EEPROM série 24C256 et un port E/S
PCF8574 au microcontrôleur PIC18F4520 via une liaison I2C.
Pour cela, on demande, en premier lieu, de concevoir une carte électronique à base de PIC 18F4520 en
utilisant le logiciel ISIS. En deuxième lieu, d’élaborer le programme moyennant le logiciel PIC C et de
simuler la carte avec (ISIS).
11
MSSP en mode I2C ISET Kairouan
Les sorties sont verrouillés. Elles peuvent délivrer un courant de ± 25mA (max).
Les pins A2A1A0 permettent de fixer l’adresse du circuit.
Les chronogrammes d’écriture et de lecture sont donnés respectivement par les figure 14 et figure 15 suivantes :
12
MSSP en mode I2C ISET Kairouan
Schéma de connexion
Apres le Start bit, le maitre doit positionner l’adresse de l’esclave. Les quatre bits de poids le plus fort sont
réservés pour l’identification du type du circuit esclave. Pour l’EEPROM ils sont fixés à 1010.
Les trois bits suivant, spécifie l’adresse du circuit (1 parmi 8).
Pour une opération d’écriture, deux champ d’adresse de 15 bits sont exigés pour accéder aux différents 32
Koctet. La figure 17 suivante montre les séquences d’adresse, de l’ACK et de transfert des données.
Pour une lecture aléatoire d’un octet le maitre, le maitre doit accomplir en premier lieu une fausse opération
d’écriture. Le maitre doit émettre une condition de départ, l’adresse de la mémoire puis l’adresse de l’octet à
lire. Après avoir reçu l’impulsion d’acquittement ̅̅̅̅̅̅
ACK, le maitre envoie immédiatement la condition de départ
et l’adresse de l’EEPROM avec 𝑅/𝑊 à 1. La 24C256 repend par ̅̅̅̅̅̅
̅ ACK suivi par les huit bit de donnée.
La figure 18 montre les séquences de la phase de lecture.
13
MSSP en mode I2C ISET Kairouan
PARTIE 1 :
On veut faire communiquer deux microcontrôleurs (μC1 et μC2) à travers une liaison I2C.
C1 C2
Bus I2C
Maitre Esclave
Les données sur le port B du C1 (maitre) sont lues puis envoyées par la liaison I2C au C2 (esclave)
pour quelle sera affichées sur le port D de ce dernier.
14
MSSP en mode I2C ISET Kairouan
Figure 20
On va écrire deux programmes indépendants : l’un pour μC1 et l’autre pour μC2.
15
MSSP en mode I2C ISET Kairouan
Delay 10ms
16
MSSP en mode I2C ISET Kairouan
Rien à faire
Tant que (vrai)
Organigramme de l’interruption :
Effacer le drapeau d’interruption
Figure 23
Programme (récepteur):
17
MSSP en mode I2C ISET Kairouan
PARTIE 2 :
On désire connecter une EPROM série 24C256 et un port E/S PCF8574 à un microcontrôleur PIC18F4520
via une liaison I2C.
Réaliser le montage suivant (Figure 24):
Figure 24
Travail demandée :
1. Affecter une adresse à chaque composant.
2. Ecrire une procédure permettant de vérifier si le port pcf8574 est connecté au bus I2C :
int1 ext_port_ready() ;
On peut suivre l’organigramme suivant : Emettre la condition de depart
Vérifier l’état de l’acquittement ACK (si ACK=0 dans ce cas le port est prés )
Fin
3. Ecrie la procédure write_pcf8574 permettant d’envoyer un octet au circuit pcf8574 à travers le bus I2C,
void write_pcf8574(int data) ;
On peut suivre l’organigramme suivant : Emettre la condition de depart
Fin
18
MSSP en mode I2C ISET Kairouan
4. Ecrire une procédure permettant de vérifier si l’EEPROM 24c256 est connecté au bus I2C
int1 ext_eeprom_ready() ;
Oui
Non Tester si l’EEPROM est prête
6. Ecrire la procédure read_24c256 permettant de renvoyer le contenu d’une case mémoire d’adresse Ad.
unsigned int read_24c256(unsigned int Ad) ;
Oui
Non Tester si l’EEPROM est prête
19
MSSP en mode I2C ISET Kairouan
- i2c_start() Emettre la condition de depart (Issues a start command when in the I2C master mode).
- i2c_write(data) Envoyer un octet (Sends a single byte over the I2C interface).
- i2c_read() Lire un octet (Reads a byte over the I2C interface).
- i2c_stop() Emettre la condition de stop (Issues a stop command when in the I2C master mode).
J ← J+1
Delay 10ms
J=0
Tq J≤21
val ← read_24c256(J)
J ← J+1
Delay 0.5s
20
MSSP en mode I2C ISET Kairouan
#include <18f4520.h>
#use delay (clock = 8M)
#include <REG18F4520.h>
#fuses HS, NOWDT, NOLVP
int1 ext_port_ready()
{ int1 ack;
i2c_start(); // If the write command is acknowledged,
ack = i2c_write(0x40); // then the device is ready.
i2c_stop();
return !ack;
}
int1 ext_eeprom_ready()
{ int1 ack;
i2c_start(); // If the write command is acknowledged,
ack = i2c_write(0xa0); // then the device is ready.
i2c_stop();
return !ack;
}
while(!ext_eeprom_ready());
i2c_start();
i2c_write(0xa0);
i2c_write((Ad>>8)&0x7F);
i2c_write(Ad);
i2c_start();
i2c_write((0xa0|1));
data=i2c_read(0);
i2c_stop();
return(data);
}
21
MSSP en mode I2C ISET Kairouan
void main()
{ unsigned int val;
unsigned int TAB[21]={0x00,0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80,
0xC0,0xE0,0xF0,0xF8,0xFC,0xFE,0xFF,0x00,0x81,
0x42,0x24,0x18};
unsigned int16 J;
/*********************************************************/
for(J=0;J<21;J++)
{ write_24c256(J, TAB[J]);
delay_ms(10);
}
for(J=0;J<21;J++)
{ val=read_24c256(J);
write_pcf8574(val);
delay_ms(500);
}
while(true)
{
}
}
22