Introduction


Parfois on souhaite utilisé un système de communication sans avoir forcément le module qui fonctionne bien. Il a 2 solution soit prendre un composant qui possède ce module , ou le réalisé nous même!

Pour ce petit cour, on se limiteras a l'I2C maitre , mais ce procédé est utilisable pour tout (Bus série , CAN , Diseqc ... ). Je ne proposerai pas des fonctions fonctionnelle car le but est d'expliquer comment sa fonctionne , et le code réalisé pour un PIC ne fonctionne pas avec le C167 , le 68HC11 , et bien sur les AVR et les autres micro contrôleurs.

1- Recherche d'une doc exploitable


Pour décomposer le problème il faut chercher une doc technique qui donne les règles ( niveaux des tensions, les temps ...)

J'ai trouvé une doc qu'on pourrais utiliser : Doc sur le bus I2C

Je n'ai pas trouvé les temps , mais on trouve a la dernière page : Standard à 100 Kbit/s donc on peux dire max 2 changement toutes les 10 us ( donc tout les delay seront de 10 us )

2- Décomposer le problème



On peux toujours décomposer un problème d'électronique en 2 partie le Hard et le soft ( le matériel et le logiciel ). Pour le bus I2C , s'est assez simple on a des entrées / sortie a collecteur ouvert.

Donc il ne faut jamais imposer un 1 logique!

Ce n'est pas très compliqué mais se n'est pas toujours le cas, par exemple pour le bus RS232 il faut changer les niveaux , donc se n'est pas aussi facile.

3- Décomposition des temps


On peux décomposer l'I2C en 4 parties , I2C_start , I2C_STOP , I2C_WRITE , I2C_READ

3.1- I2C start


Pour démarrer une trame en I2C , il faut faire un START , s'est très simple , il suffit de passer SDA a 0 , ensuite SCL.

  1. void I2C_START(){
  2. pin_SDA=sortie;
  3. SDA=0;
  4. delayus(10);
  5. pin_SCL=sortie;
  6. SCL=0;
  7. delayus(10);}


Ceci devrai donner :



3.2- I2C_Write


L'i2c est une trame série , donc il faut faire un registre a décalage :

  1. int I2C_WRITE(int mot){
  2. int masque=0b10000000;
  3. int i;
  4. int ack=0;
  5.  
  6. for(i=0;i<8;i++){
  7.         if(mot&(masque>>i))//si on a 1 en i éme position
  8.                 {
  9.                 SDA = Z ;//( haute impédance )
  10.                 horloge_SCL();
  11.                 }
  12.         else
  13.                 {
  14.                 SDA = 0 ;//( haute impédance )
  15.                 horloge_SCL();
  16.                 }
  17.         }
  18. //L'ack
  19. SCL=Z;//haute impédance = 1
  20. delayus(10);
  21. if(SDA==1)
  22.         ack=1;
  23. SCL=0;
  24. delayus(10)
  25.  
  26. return ack;
  27. }


On devrai avoir :



3.3- I2C_READ


Cette partie est la même que I2C write hormis que s'est l'esclave qui gère la communication.

  1. int I2C_READ(){
  2. int mot=0;
  3. int masque=0b10000000;
  4. int i;
  5.  
  6.  
  7. for(i=0;i<8;i++){
  8.         scl=0;
  9.         delayus(10);
  10.         scl=Z;//1
  11.         if(SDA==1))
  12.                 {
  13.                 mot=mot+masque>>i;
  14.                 }
  15.         else
  16.                 {
  17.                 //on ne fait rien
  18.                 }
  19.         delayus(10);
  20.         }
  21. //L'ack
  22. SCL=Z;//haute impédance = 1
  23. delayus(10);
  24. SCL=0;
  25. delayus(10)
  26.  
  27. return mot;
  28. }


On devrai avoir :



3.4- I2C stop


Pour arréter une trame en I2C , il faut faire un STOP, s'est très simple , il suffit de passer SDA et SCL a 0 , ensuite relâcher SCL puis SDA.

  1. void I2C_STOP(){
  2. pin_SDA=sortie;
  3. pin_SCL=sortie;
  4. SCL=0;
  5. SDA=0;
  6. delayus(10);
  7. pin_SCL=entree;
  8. delayus(10);
  9. pin_SDA=entree;}


Ceci devrai donner :



Limites dans le programme


J'ai souhaité faire des programmes simple , donc je n'ai pas utiliser les timers , dans la pratique si vous voulez faire plus qu'une seule chose il faudra utiliser ces timers.

Parfois il peux être intéressant de créé un petit module a coté en logique séquentiel ou combinatoire, il éviteras de contrôler tout le temps vos ports, donc vous faire gagner des cycles machine.

Si vous avez réalisé des programmes n'hésitez pas a nous contacter pour le proposer a tous.

L'équipe Robot-amateur .

© robot-amateur.com - Tous droits réservés. Reproduction interdite sans autorisation.