Entrées-sorties et interfaces de communication  
C.A. ABID  
42/ 56  
Communication sur un bus I2C (Inter Integrated Circuit)  
Plan  
1
2
3
4
5
6
7
Présentation de GPIO  
Communication série UART  
Entrées-sorties GPIO  
Interruptions et GPIO  
Communication avec l’interface SPI (Serial Peripheral Interface)  
Communication sur un bus I2C (Inter Integrated Circuit)  
Bluetooth  
Entrées-sorties et interfaces de communication  
C.A. ABID  
43/ 56  
Communication sur un bus I2C (Inter Integrated Circuit)  
Le bus I2C  
Le bus I2C  
¯
¯
I2C est un bus permettant la communication synchrone en half-duplex  
Le protocole de communication permet de mettre en communication un composant maître  
généralement le microprocesseur) et plusieurs périphériques esclaves  
(
¯
Plusieurs maîtres peuvent partager le même bus, et un même composant peut passer du  
statut d’esclave à celui de maître ou inversement.  
¯
¯
La communication n’a lieu qu’entre un seul maître et un seul esclave.  
Chaque esclave possède un identifiant unique (adresse). Cette adresse est fournie par  
l’esclave.  
Entrées-sorties et interfaces de communication  
C.A. ABID  
44/ 56  
Communication sur un bus I2C (Inter Integrated Circuit)  
Le bus I2C  
Activer le bus I2C  
–
Avec raspi-config  
Interfacing Options ® P5 I2C  
—
Éditer le fichier /boot/config.txt  
sudo nano /boot/config.txt  
De-commenter  
dtparam=i2c_arm=on  
Vérifier que le fichier /etc/modules contient la ligne i2c-dev  
et  
modifier  
la  
ligne  
dtparam=i2c_arm=off  
par  
Redémarrer la RPi3  
Vérifier l’activation de l’I2C avec gpio readall ou lsmod | grep i2c  
Entrées-sorties et interfaces de communication  
C.A. ABID  
45/ 56  
Communication sur un bus I2C (Inter Integrated Circuit)  
Lecture de température avec MCP9808  
Le capteur MCP9808  
¯
¯
¯
Tension d’alimentation : 2,2 - 5,5V  
Température de fonctionnement : Entre -40 et 125°C  
Précision : ±0,5°C(max) et ±0,0625°C(min)  
Montage  
Entrées-sorties et interfaces de communication  
C.A. ABID  
46/ 56  
Communication sur un bus I2C (Inter Integrated Circuit)  
Lecture de température avec MCP9808  
Les registres du capteur MCP9808  
¯
¯
Les registres sont de tailles de 8 et 16 bits  
Registre de configuration (16 bits) : adresse 0x01  
¯
¯
Par défaut, la résolution est à 0,0625°C. Elle peut être modifiée à travers le registre ayant  
l’adresse 0x08 (8 bits)  
La valeur de la température est retournée dans le registre 0x05 (16 bits) ayant la structure  
suivante :  
La valeur de la température est donnée en complément à 2 sur les 13 bits du plus faible  
poids.  
Entrées-sorties et interfaces de communication  
C.A. ABID  
47/ 56  
Communication sur un bus I2C (Inter Integrated Circuit)  
Lecture de température avec MCP9808  
Identification de l’adresse du capteur  
¯
Lister les bus i2c accessibles  
i2cdetect -l  
Lister les adresses des périphériques connectés au bus i2c spécifié  
i2cdetect -y -1  
$
¯
$
Les fonctions de la bibliothèque I2C de WiringPi  
¯
¯
¯
¯
int wiringPiI2CSetup (int devId) : Initialiser la communication sur le bus  
I2C avec l’esclave identifié par devId. La valeur retournée est le descripteur de fichier  
Linux standard, ou -1 s’il y a une erreur.  
int wiringPiI2CWriteReg8(int fd, int reg, int data) (resp. int  
wiringPiI2CWriteReg16(int fd, int reg, int data)) : écrire la donnée  
data de 8 (resp. 16) bits dans le registre reg de l’esclave enregistré par fd.  
int wiringPiI2CReadReg8 (int fd, int reg)  
(resp.  
int  
wiringPiI2CReadReg16 (int fd, int reg)) : lire une donnée de 8 (resp. 16)  
bits du registre reg de l’esclave enregistré par fd.  
int wiringPiI2CRead(int fd) et int wiringPiI2CWrite(int fd,  
int data) sont utilisées avec les composants possédant un seul registre.  
Entrées-sorties et interfaces de communication  
C.A. ABID  
48/ 56  
Communication sur un bus I2C (Inter Integrated Circuit)  
Lecture de température avec MCP9808  
Programme C++ sur la RPi3  
#
#
#
include <unistd.h>  
include <iostream>  
include <wiringPiI2C.h>  
using namespace std;  
int main() {  
int fd=wiringPiI2CSetup(0x18);  
if (fd) {  
cout<<"Erreur d’initialisation!"<<endl;  
exit(1);  
}
/
/ Configurer le registre 0x01 (mode continu)  
wiringPiI2CWriteReg16(fd,0x1,0);sleep(1);  
/ Lire 2 octets du registre (0x05)  
int val=wiringPiI2CReadReg16(fd,0x05);  
/ val < 0?  
/
/
if(val > 4095) val -= 8192;  
float cTemp = val * 0.0625;  
cout<<"Temperature en Celsius est :"<<cTemp<<" C"<<endl;  
return 0;  
}