Documentation

Le bus I2C

L'I2C (inter-integrated circuit) est un bus qui permet la communication entre les modules, notamment l'accéléromètre. Il établit une relation maître-esclave qui permet soit de lire, soit d'écrire dans le registre de l'esclave. La relation maître-esclave se décrit de la façon suivante :

Tout d'abord il faut distinguer quatre cas :

  • Le maître est émetteur
  • Le maître est récepteur
  • L'esclave est émetteur
  • L'esclave est récepteur


  • Pour les quatre cas on a une (ou plusieurs) instruction(s) START (noté S) et une instruction STOP (noté P) qui respectivement commencent (ou relance) et finissent la transmission. Ces instructions sont envoyées uniquement lorsque le SDA change d'état alors que l'horloge (SCL) est à 1. Le START est envoyé quand le SDA passe de 1 à 0, et le STOP de 0 à 1.

    Tous les modes possible avec ces quatre cas sont décrits dans la documentation du microcontrôleur d'hepialight (chapitre 14.10.1 p.298), néanmoins voici un exemple concret d'une transmission avec l'accéléromètre (voir documentation de l'accéléromètre pour le format d'adressage p.21-22) :

    Pour observer la transmission, il faut utiliser le logiciel USBee RX et récupérer les deux signaux SDA et SCL, et pour cela il faut d'abord trouver à quel endroit on retrouve ces signaux sur la carte. Il faut donc à nouveau se référer au schéma électrique de la carte: on retrouve le SDA en entrée/sortie de l'accéléromètre (U3) et le SCL en entrée/sortie du microcontrôleur (U2) à la pin PIO_4. Pour savoir où se trouve cette pin, il suffi de regarder le schéma du microcontrôleur que l'on trouve au chapitre 8.2 (p.118) de la documentation du microcontrôleur.

    Une fois les signaux identifiés, il ne reste plus qu'à effectuer quelques modifications sur la carte hepialight: rajouter un header mâle à la pin GND (la même utilisée pour le débogueur) ainsi que deux autres headers femelle que l'on va placer à l'endroit où l'on a repéré nos signaux (voir ci-dessous).





    Il ne reste plus qu'à brancher le tout à USBee et regarder le résultat lors d'une transmission avec l'accéléromètre (par exemple l'appel de la fonction penche_droite()), et l'on obtient le résultat suivant sous forme digitale (les deux images se suivent):





    Et on obtient effectivement ce qu'on retrouve dans la documentation pour une lecture de l'accéléromètre, c'est à dire :

      • START pour indiquer que l'on veut commencer la transmission
      • L'adresse de l'esclave (0x98) sur 7 bit
      • Write (0x0), pour indiquer que l'on veut écrire
      • Un acknowledge (ou quittance en français) envoyé par l'esclave pour indiquer que l'instruction a été reçue
      • Le registre de l'esclave, ici 1 car c'est dans le registre $01 de l'accéléromètre que l'on a l'axe Y (voir la documentation de l'accéléromètre p.13)
      • Un acknowledge envoyé par l'esclave
      • Un deuxième START, pour indiquer que l'on veut continuer
      • A nouveau l'adresse de l'esclave (0x98) toujours sur 7 bit (à noter que sur USBee les 7 bit d'adresse et le bit de lecture/écriture ont été combiné, c'est pourquoi on a un 0x99 indiqué, qui correspond à 0x98 + 0x1)
      • Read (0x1), pour indiquer que l'on veut lire
      • Un acknowledge envoyé par l'esclave
      • La lecture du registe §01, qui ici contient 0x2 (le lecteur avisé remarquera que dans le code de l'accéléromètre, la fonction penche_droite() ne renvoi "1" que si cette valeur est supérieur à 5, ce qui n'est donc pas le cas ici)
      • Un not-acknowledge car l'esclave est à ce moment émetteur
      • Et finalement le STOP pour indiquer la fin de la transmission


      • Pour aller plus loin :

        Description détaillée de la fonction accel_read(axe) ( ancien site )