Cours/TD d informatique embarquée Utilisation d un microcontrôleur MBED Partie 8 Communication série I²C Serial communication with I²C Plan du cours 8.1. Introduction 8.2. Etude de la communication I²C 8.3. Utilisation de I²C avec mbed 8.4. Etude du circuit PCF8574 8.5. Etude du télémètre ultrason SFR08 CV C/TD INFO2 - Partie 8 page 1
8.1. Introduction I²C est l abréviation de Inter-Integrated Circuit bus I²C est un protocole de Ce protocole utilise une relation I²C utilise pour la communication (+ la masse) Les signaux de communication I² ²C sont - - Cela signifie qu à chaque instant esclave>>maître) Le protocole I²C utilise un bus série 2 fils : la donnée ne circule que dans un seul sens (maître>>esclave e ou L utilisation de seulement 2 fils (+ masse) fait de ce protocole un système Il existe de nombreux périphériques I²C (LCD, capteurs, mémoires, E/S ) Cela permet de délocaliser facilement plusieurs composants en utilisant seulement 3 fils Exercice 1 : Quelle est la vitesse de transmission du bus I²C? Rechercher 2 composants fonctionnant sur le bus I²C (capteur de température, LCD...) - - Quelle est la fonctionn du conposant PCF8583? CV C/TD INFO2 - Partie 8 page 2
8.2 Etude de la communication I²C I²C utilise un adressage des périphériques Intérêt : Chaque composant a (comme les numéros de maison dans une rue) codée sur 7 bits + un 0 Adresse = Pour parler à un composant il suffit de donner son dans le message qu on envoie Lorsqu il se reconnait le composant Le composant qui initie la communication est appelé. Le composant qui est adressé par le maître est appelé. Les esclaves et répondent uniquement aux données et aux commandes associées à. Cette méthode d'adressage limite le nombre de périphériques esclaves qui peuvent co-exister sur un seul bus I²C car chaque appareil doit avoir une adresse unique. (max = 2 7 = 128 périphériques) Exemple : adresse du composant PCF8574 Pour ce composant (PCF8574) sur les 7 bits d adresse : 4 sont (0100) 3 sont (A2A1A0): l utilisateur les fixe à ADR = 0100 A2A1A0 ADR = 01000000 = 0x40 ADR = 01000010 = 0x42 Exercice 3 : Combien de composant PCF8574 peut-on connecter sur un bus I²C? En étudiant la datasheet : a)dire quelle est la différence entre le PCF8574 et le PCF8574A. b)donner la fonction du circuit et dire sur quelles broches sont les sorties? CV C/TD INFO2 - Partie 8 page 3
Connecter la masse et l'alimentation sur les composants ci-dessous. Fixer les adresses à 0x46 et 0x4C Un transfert de données commence lorsque le maître signale un Start, suivi par 1,2 ou 3 octets contenant l adresse et les données. 1. Le START est défini par une transition 1 >> 0 de SDA lorsque SCL est à l état 1 2. Un front montant de SCL valide la donnée sur SDA. La donnée ne doit changer que lorsque l horloge est à l état 0 3. Une transition 0 >> 1 de SDA lorsque SCL est à l état 1 signifie le STOP 8.3 Utilisation de I²C avec mbed Les méthodes associées au type I2C sont dans le tableau ci-dessous : I2C Utilisation du mbed comme un maître I2C I2C Crée un maître I2C connecté à des broches spécifiques frequency Fixe la fréquence de l interface I²C read Permet la lecture de données issues d un esclave write Permet l écriture d une donnée vers un esclave start Crée un START sur le bus I²C stop Crée un STOP sur le bus I²C CV C/TD INFO2 - Partie 8 page 4
Le LPC1768 possède 2 interfaces I²C sur les broches p9/p10 et p28/p27 Les signaux SDA et SCL doivent être reliés à l alimentation avec des résistances (PullUp) dont la valeur peut être optimisée suivant la configuration du circuit. Ordre de grandeur : 1,8kΩ -> 10kΩ Exemple : Programme permettant de scanner toutes les adresses d un bus I²C Permet de savoir si des composants sont connectés sur le bus I²C et quelles sont leurs adresses #include "mbed.h" I2C composant(p9, p10); //sda, sc1 Serial pc(usbtx, USBRX); //tx, rx int main() { int i; printf("debut du Scan...\n\r"); for(i=0x00;i<=0xff;i=i+2){ composant.start(); //Start rep = composant.write(i); //Envoi d une adresse, y a-t-il une if(rep==1) //réponse? { printf("test de l adresse %x Composant I2C present!!\n\r",i); else{ printf("test adr = %x... rien... " %x\n\r",i); composant.stop(); //Stop wait(0.1); printf("fin du Scan...\n\r"); CV C/TD INFO2 - Partie 8 page 5
8.4 Etude du composant I²C PCF8574 Diagramme fonctionnel : Exercice 4 : Entourer le composant qui permet au PCF8574 de produire l'acquittement et d'écrire des données sur le bus. Quelle est la traduction en français des deux blocs de droite? Dans quelle direction vont les données? Exemple : Ce programme permet de fixer la valeur des sorties du PCF8574 #include "mbed.h" I2C composant(p9, p10); //sda, sc1 int main() { char A=0xAA; // 1010 1010 char B=0x55; // 0101 0101 while(1){ composant.write(0x40,&a,1); //Transfert de l octet dont //l adresse est &A wait(0.5); composant.write(0x40,&b,1); //Transfert de l octet dont //l adresse est &B wait(0.5); CV C/TD INFO2 - Partie 8 page 6
Exercice 4 : a) Réaliser le montage et scanner toutes les adresses du bus avec le premier programme. Quelle adresse a été trouvée? b) Fixer A 2 A 1 A 0 à "111"" et refaites les scan. Quelle adresse a été trouvée? c) Avec votre voisin, câbler deux composants sur un même bus et scanner les adresses. Quelles adresses ont été trouvées? a) b) c) Exercice 5 : Réaliser et tester le sorties. programme permettant de fixer les valeurs des a) Relever à l'oscilloscope les chronogrammes de SDA et SCL. b) Relever à l'oscilloscope les chronogrammes des sorties p4 et p5 (broches 9 et 10 du PCF8574). CV C/TD INFO2 - Partie 8 page 7
Préciser clairement les échelles, les axes et les unités. a) chronogramme de SDA et SCL b)chronogramme de p4 et p5 Quelle est la fréquence du signal SCL? (Comparer avec la liaison série asynchrone 9600 bauds) Quelle est la durée de la transmission d'un octet? Exercice 6 : Travail à réaliser à deux : Réaliser un programme permetttant de saisir un nombre sur teraterm et de l'envoyer sur le PCF8574. L'écriture se fera à chaque fois que l'utilisateur rentre un nombre. Réaliser un deuxième programme permettant de lire une valeur présente sur le PCF8574 et de l'afficher sur le teraterm. La lecture devra se faire dans un Ticker appelé toutes les 500ms. Connecter entre eux les deux composants et envoyer un nombre depuis un PC vers le PC voisin. 8.4 Etude du composant I²C SRF08 Le capteur SRF08 est un capteur Il communique ses mesures en I²C et son adresse d usine est Procédure pour une lecture en cm : 1. Envoi (= l octet suivant sera ta configuration) et (= configuration en cm) 2. Envoi de (= envoie moi la donnée sur 2 octets) 3. Lecture de la donnée sur 2 octets CV C/TD INFO2 - Partie 8 page 8
Le SRF08 peut être connecté comme sur la figure ci-dessous : SRF08 est alimenté en 5V et les résistances de PullUp tirent les potentiels au 5V (SDA, SCL). Exemple : Utilisation du SFR08 #include "mbed.h" I2C UltraSon(p9, p10); //sda, sc1 Serial pc(usbtx, USBRX); //tx, rx int addr = 0xE0; char config[2]; char lecture[2]; int main() { int valeur; while (1) { config[0] = 0x00; // config[1] = 0x51; // UltraSon.write(addr, config, 2); wait(0.07); config[0] = 0x02; UltraSon.write(addr, config, 1); UltraSon.read(addr, lecture, 2); valeur = ((lecture[0] << 8) + lecture[1]); pc.printf(«distance = %d cm\n\r", valeur); wait(0.1); Exercice 6 : a) Câbler le SRF08 sur votre mbed et scanner les adresses. b) Tester le programme ci-dessus (modifier éventuellement le 0xE0). c) Etudier la documentation du SRF08 et modifier la configuration pour que la mesure soit réalisée en inches. d) Etudier la documentation et réaliser un programme qui permette de modifier l'adresse du SRF08. CV C/TD INFO2 - Partie 8 page 9
Questions de cours : Q1) Que signifie I2C? Q2) Combien de fils possède le bus de I2C? Q3) Quel est l'état de repos du bus? Q4) Sur combien de bits sont adressés les composants? Les adresses sont elles paires, impaires ou les deux? Q5) Est-il possible de connecter plus de 2 composants I²C sur un même bus? Q6) Dessiner la condition de Start et de Stop sur le bus I²C? Q7) Au cours de la transmission d'un octet quel doit être l'état de SCL lorsque SDA varie? Q8) Lorsque la méthode write est appelée avec un seul argument il faut utiliser les méthodes start et stop, vrai ou faux? Q9) Lorsque la méthode write est appelée avec 3 arguments il est inutile d'utiliser les méthodes start et stop, vrai ou faux? Q10) Lorsque la méthode write est appelée avec 3 arguments, quels sont ces arguments? CV C/TD INFO2 - Partie 8 page 10