III. 3. 5. 2 Principe de fonctionnement du bus I2C
Pour les composants voulant communiquer en I2C il suffit de lier
ces 3 fils. Le fonctionnement du bus I2C est assez simple malgré que son
protocole puisse sembler complexe. La communication I2C repose sur
l'échange entre un maître et des esclaves par adressage.
C'est-à-dire que chaque composant dit esclave possède une adresse
spécifique sur 7bits. C'est le composant maître qui gère la
communication. Il envoie les signaux de données et le signal d'horloge.
Généralement le maître est un composant dit
microcontrôleur.
Le rôle du signal d'horloge SCL est de rythmer l'envoi des
données. Chaque bit du signal de données SDA sera envoyé
à chaque changement d'état du SCL (Fig. III.6).
Fig. III.6 : le chronogramme des lignes SDA et SCL
Au début d'une communication, il faut s'assurer que le SDA
et SCL sont en état de repos, soit un niveau logique 1 (Fig. III.7).
Ensuite le maître envoie sur le bus I2C, l'adresse de
l'esclave avec qui il veut communiquer. On dit qu'il envoie les bits
d'adressage. Suite à cela le maître indique le mode d'action (R/W)
c'est adire le maître indique s'il veut écrire ou lire les
données de l'esclave (0 pour écriture, 1 pour la lecture).
Commande de l'éclairage public et mesure de la
température à base de PIC18F4550
|
|
Chapitre III Programmation de PIC18F4550
(0 pour écriture, 1 pour la lecture)
Commande de l'éclairage public et mesure de la
température à base de PIC18F4550
28
Fig. III.7 : le chronogramme de communication I2C
L'esclave possédant l'adresse indiqué répond
par un « Acknowledge » (ACK). C'est un bit dit d'acquittement pour
indiquer qu'il a bien reçu les instructions du maître. Ce bit est
symbolisé par un forçage de l'esclave à mettre la ligne
SDA à un niveau logique 0.
L'acquittement reçu par le maître, celui-ci
envoyé alors les données à l'esclave qui acquittera
à nouveau pour confirmer la réception. Le maître peut alors
envoyer autant de donnée qu'il veut sur un même esclave qui
acquittera à chaque opération.
Pour finir, un maître peut communiquer avec plusieurs
esclaves à condition de paramétrer les adresses de tous les
esclaves. Il devra alors indiquer, à chaque changement d'esclave,
l'adresse du nouveau esclave avec qui il veut communiquer [13].
III. 3. 5. 3 Bus I2C et MikroC
MikroC fournit une bibliothèque prête du bus I2C
(Tableaux 3.1), nous utilisons cette bibliothèque pour communiquer entre
le maitre (PIC18F4550) et l'esclave (DS1307). L'exemple suivant montre comment
écrire des fonctions de lire et d'écrire en l'esclave DS1307 avec
les commentaires.
a. Fonction d'écriture
void write_ds1307(unsigned short
address,unsigned short w_data)
{
I2C_Start(); // lancer un signal de départ (le bit de
start)
I2C_Wr(0xD0); // envoyer un octet via I2C (adresse de composant +
un bit de mode action (R/W))
|
// Adresse 0x68 est l'adresse de l'esclave DS1307 suivis par bit
de direction (0 pour écriture, 1 pour la lecture), dans ce cas (mode
écriture) l'adresse 0x68 suivi par 0 -> 0xD0
I2C_Wr(address); // envoyer un octet (adresse du register du
DS1307) I2C_Wr(w_data); // envoyer des données (Les données qui
seront écrites) I2C_Stop(); // envoyer un signal de stop ( bit de
stop)
}
|
Chapitre III Programmation de PIC18F4550
Un exemple de l'utilisation de cette fonction :
write_ds1307(1,Dec2Bcd(59)); // écrire les minutes 59
write_ds1307(2,Dec2Bcd(23)); // écrire l'heur 23 PM
|
b. Fonction de lecture
void read_ds1307(unsigned short address)
{
I2C_Start(); // lancer un signal de départ (le bit de
start)
I2C_Wr(0xD0); // envoyer un octet via I2C (adresse de composant +
un bit de mode action (R/W))
// Adresse 0x68 est l'adresse de l'esclave DS1307 suivis par bit
de direction (0 pour écriture, 1 pour la lecture), dans ce cas (mode
écriture) l'adresse 0x68 suivi par 0 -> 0xD0
I2C_Wr(address); // envoyer un octet (envoyer l'adresse du
registre à lire) I2C_Repeated_Start();//Ré-envoyer le bit de
start
I2C_Wr(0xd1); // envoyer un octet via I2C (adresse de composant +
un bit de mode action (R/W))
// Adresse 0x68 est l'adresse de l'esclave DS1307 suivis par bit
de direction (0 pour écriture, 1 pour la lecture), dans ce cas (mode
lecture) l'adresse 0x68 suivi par 1 -> 0xD1
data=I2C_Rd(0); L'esclave envoie le contenu du registre d'adresse
dans le variable data
I2C_Stop(); // envoyer un signal de stop ( bit de stop)
return(data);// Retourne la valeur de la variable data à
nom de fonction
}
|
Un exemple de l'utilisation de cette fonction :
minute=read_ds1307(1); // lire minute
hour=read_ds1307(2); // lire heur
dminute=Bcd2Dec(minute);dhours=Bcd2Dec(hour);// Conversions de
BCD à décimal
Commande de l'éclairage public et mesure de la
température à base de PIC18F4550
|
|
Chapitre III Programmation de PIC18F4550
Commande de l'éclairage public et mesure de la
température à base de PIC18F4550
23
|