Dernière mise à jour le 10/01/2021

Présentation


Comment utiliser un microcontrôleur en mode maître (master en anglais) sur un bus I2C?
C’est ce que nous allons voir d’une façon très simple.

Soft_I2C Logiciel (Software) ou I2C Matériel (Hardware) ?


Bonne question? mais qu’est ce que cela veux bien dire ?
Pour faire simple:


I2C Logiciel (Software) : Lorsque nous parlons de I2C Logiciel c’est que votre microcontrôleur ne possède pas les broches SDA et SDL alors il faut trouver une parade afin de créer ces 2 broches pour la communication par la méthode logiciel (Software) en programmant quelques lignes de code supplémentaires. (On utilise la routine Soft_I2C de MikroC).


I2C Matériel (Hardware) : Lorsque nous parlons de I2C Matériel, c’est que votre microcontrôleur possède les broches SDA et SDL. (On utilise la routine I2C1 de MikroC)


Voilà la différence entre les deux !! pas compliquer non? avec ou sans broches SDA et SDL il est tout à fait possible de communiquer par la liaison I2C mais je vous conseille si vous devez réaliser un programme un peu plus complexe en utilisant des interruptions, vérifier le Buffer, ou autres de vous garantir que le PIC que vous utilisez soit bien équipé des broches SDA/SDL.
Bon avec tous ces grands discours essayons de regarder ça de plus prêt en commençant par des choses simples on verra ensuite le compliquer.

Exemple 1 – Écriture en boucle


J’indique en exemple qui d’ailleurs sera le seul, sur la façon d’envoyer des données via la liaison I2C lorsque le PIC18F4550 est configuré en maître. Dans cette configuration c’est le pic qui va cadencer le bus I2C (horloge réglée à 100Khz standard). le programme qui va suivre ne fait que d’envoyer des données en boucle “while” et que ces données seront réceptionné via le Debugger I2C de proteus.


Version débutant

// Ecriture en boucle – MikroC – Electronique71.com

void init()
{

  ADCON1 = 0xFF;     //  On configure toutes les broches en numérique (0 ou 1)

  ADCON0.ADON = 0;   // On désactive le module de convertisseur analogique numérique

  CMCON = 0x07;      // On désactive le mode comparateur

  TRISB = 0x03;      // config les broches du PORTB - RB0 et RB1 comme entréed (SDA/SCL)e
  PORTB = 0x00;
  LATB = 0x00;

  SSPCON1.SSPEN = 1; // On active les broches RB0 et RB1 en mode SDA et SCL

  // On active le mode 7 bits (0 à 7 = 8 bits) avec interruptions sur bit Start et Bit Stop
  SSPCON1.SSPM0 = 0;
  SSPCON1.SSPM1 = 1;
  SSPCON1.SSPM2 = 1;
  SSPCON1.SSPM3 = 1;

  I2C1_Init(100000);    // Initialisation à 100Khz

  Delay_ms(100);        // On attend un peu la fin de l'initialisation
}

void main()
{
  init(); // Initialisation du PIC18F4550

  while (1)
  {
    I2C1_Start();   // Start pour commencer à envoyer les données
    I2C1_Wr(0x02);  // Ecriture du 1er octet (adresse de l'esclave)
    I2C1_Stop();    // Fin de l'envoi

    Delay_1sec();   // On attend 1sec avant l'envoi

    I2C1_Start();   // Start pour commencer à envoyer les données
    I2C1_Wr(0xF0);  // Ecriture du 2ème octet (données)
    I2C1_Stop();    // Fin de l'envoi

    Delay_1sec();   // On attend 1sec avant l'envoi

  }
}

Ce code est à utiliser (version adulte)

// Ecriture en boucle – MikroC – Electronique71.com

void init()
{

  ADCON1 = 0xFF;     //  On configure toutes les broches en numérique (0 ou 1)

  ADCON0.ADON = 0;   // On désactive le module de convertisseur analogique numérique

  CMCON = 0x07;      // On désactive le mode comparateur

  TRISB = 0x03;      // config les broches du PORTB - RB0 et RB1 comme entréed (SDA/SCL)e
  PORTB = 0x00;
  LATB = 0x00;

  SSPCON1.SSPEN = 1; // On active les broches RB0 et RB1 en mode SDA et SCL

  // On active le mode 7 bits (0 à 7 = 8 bits) avec interruptions sur bit Start et Bit Stop
  SSPCON1.SSPM0 = 0;
  SSPCON1.SSPM1 = 1;
  SSPCON1.SSPM2 = 1;
  SSPCON1.SSPM3 = 1;

  I2C1_Init(100000);    // Initialisation à 100Khz

  Delay_ms(100);        // On attend un peu la fin de l'initialisation
}

void main()
{
  init(); // Initialisation du PIC18F4550

  while (1)
  {
    I2C1_Start();          // Start pour commencer à envoyer les données
    I2C1_Wr(0x02);         // Ecriture du 1er octet (adresse de l'esclave)
    I2C1_Repeated_Start(); // On répète pour envoyer le 2ème octet
    I2C1_Wr(0xF0);         // Ecriture du 2ème octet (données)
    I2C1_Stop();           // Fin de l'envoi

    Delay_1sec();          // On attend un peu avant de recommencer

  }
}


Debugger I2C – Test Proteus

Chaque données envoyées par le PIC, celle-ci sont reçu sur le Debugger I2C. Vous pouvez d’après la capture ci-dessous remarquer que nous retrouvons bien sur le Debugger 0x02 – 0xF0 – 0x02 -… en boucle.

C’était vraiement simple vous ne trouvez pas?

Test sur platine EasyPicV7


Non.

Historiques


10/01/2021
-1er mise à disposition