Dernière mise à jour le 16/03/2019

Présentation


Cet article à pour but d’expliquer comment programmer deux PIC 18F4550, l’un en mode esclave et l’autre en mode maitre. Vous pouvez vous rendre sur ce lien Protocole I2C afin de comprendre le protocole I2C en mode écriture ou en mode lecture

Fonctionnement


Lorsque le PIC18F4550 est configuré en mode Esclave, les broches SCL et SDA doivent être configurées comme des entrées. C’est pour cette raison que le registre TRISB = 0b00000011 (0x03 en hexadécimal) est initialisée comme entrée, mais aussi il faudra activer le bit SSPEN du port série synchrone principal qui se fait via le registre SSPCON1 (nous en parlerons un peu plus loin).

Une fois que le registre TRISB est configuré comme entrée, le matériel (interne) I2C générera toujours une interruption lorsqu’une adresse correspondra à celle indiqué dans le registre SSPADD.
Afin que le PIC puisse être muni d’une adresse, j’ai choisi pour « l’essais » l’adresse 0xA8, et donc intégré cette adresse dans la variable du registre SSPADD.

Niveau programmation pour l’adresse cela donne :
SSPADD :=0xA8 (en MikroPascal) et SSPADD = 0xA8 (en MikroC) tout simplement.


Nous avons donc dans un 1er temps initialisé l’entrée des broches RB0(SDA) et RB1(SCL) comme des entrées et adressé note PIC 18F4550 via le registre SSPADD qui maintenant comporte cette fameuse adresse 0xA8.


Ci-dessous programme de l’initialisation du PIC en mode esclave.

// Initialisation du PIC18F4550
procedure init();
Begin
 
 TRISB := 0x03; // On confirgure les broches du PORT B - RB0 et RB1 comme entrée
 LATB := 0x00;
 
 ADCON1 := 0xFF; //  On configure toutes les broches en numérique.
 ADCON1.VCFG0 := 0; // On active le (VDD) pour couper la référence de tension
 ADCON1.VCFG1 := 0; // On active le (VSS) pour couper la référence de tension
 
 INTCON.GIE := 1; // On active les interruptions globales
 INTCON.GIE := 1; // On active les interruptions globales
 INTCON.PEIE := 1; // On active les interruptions périphériques
 
 PIE1.SSPIE := 1; // On active les interuptions du MSSP 
 PPIR1.SSPIF := 0;  // On met le drapeau à zéro pour commencer
 
 SSPCON1.SSPEN := 1; // On active les broches RB0 et RB1 en mode SDA et SCL
 SSPCON1.SSPM0 := 0;
 SSPCON1.SSPM1 := 1;   // On active le mode 7 bits 
 SSPCON1.SSPM2 := 1;
 SSPCON1.SSPM3 := 1;
 
 SSPADD := 0xA8; // Configuration de l'adresse de l'esclave du PIC 18F4550
 SMP_bit := 1;
 SEN_bit := 0;
 CKP_bit := 1; // le bit CKP NE DOIT PAS être mis à "0" mais à "1" si SEN = 0
 
 bAdresse := False;

 bData1 := False;

 bData2 := False;

 bData3 := False;

end;

Mode I2C – Registre SSPCON1
J’ai évoqué un peu plus haut le registre SSPCON1, mais regardons cela d’un peu plus près!
Pour que le PIC fonctionne en mode esclave, et qu’il puisse communiquer avec l’extérieur dans un sens puis dans l’autre il faut configurer son mode de fonctionnement en agissant sur le registre SSPCON1.


C’est dans ce registre que nous pouvons à présent apercevoir ci-dessus, il est tout à fait possible de paramétrer le PIC en tant qu’esclave. Pour permettre cette échange avec l’extérieur nous devons activer le bit 5 qui correspond à SSPEN à l’état logique « 1 » afin que les broches SDA et SCL soient activer comme un port série.
Ensuite, il suffit de paramétrer notre PIC 18F4550 en mode Esclave en agissant sur les bits SSPM3/SSPM2/SSPM1/SSPM0 afin d’obtenir un mode esclave sur 7 bits avec les interruptions Start et Stop activé.
il en résulte que niveau programmation ça donne ceci :


(Prog MikroPascal)
SSPCON1.SSPEN := 1
SSPCON1.SSPM0 := 0 ;
SSPCON1.SSPM1 := 1;
SSPCON1.SSPM2 := 1 ;
SSPCON1.SSPM3 := 1 ;


(Prog MikroC)
SSPCON1.SSPEN = 1
SSPCON1.SSPM0 = 0 ;
SSPCON1.SSPM1 = 1;
SSPCON1.SSPM2 = 1 ;
SSPCON1.SSPM3 = 1 ;


Enfin, nous avons terminé!! Vous êtes bien sûr ??!! ah non !! j’avais oublié quelque chose d’important.
Allons faire un tour du côté du registre SSPCON2.


Le bit SEN doit être à l’état logique « 0 » afin de ne pas utiliser l’étirement de l’horloge ceci est bien explicite au niveau du DataSheet (voir encadré en rouge) – le bit CKP ne doit pas être remis à l’état logique « 0 » quand le bit SEN est à l’état logique « 0 ».


Réception des octets


Chaque fois qu’un coup est donné par l’horloge maitre sur la broche SCL les bits seront décalés les uns après les autres dans le registre SSPSR.

Comparaison octets et envoi du bit d’acquittement (ACK)


Les 8 bits (1 octets) présents dans le registre SSPSR sont comparés avec l’adresse du PIC du registre SSPADD. Si ces 2 octets sont identique, le matériel en mode esclave I2C générera toujours une interruption sur une correspondance d’adresse.


Transfert des données dans le registre SSPBUFF


Lorsque la correspondance est reçue, le matériel générera automatiquement l’acquittement (ACK) (nul besoin de le programmer) et chargera le registre SSPBUFF avec la valeur reçue actuellement dans le registre SSPSR.Nous pouvons dès à présent lire le registre SSPBUF qui comprend la valeur de l’adresse soit SSPBUF = 10101000. Un octet chargé dans le registrer SSPBUF entrainera la mise à l’état logique « 1 » du bit BF situé dans le registre SSPSTAT. Si aucun octet présent dans le registrer SSPBUF le bit BF sera bien évidemment l’état logique « 0 ».

Attention !!
Si le SSPBUF n’a pas été lu et qu’un autre transfert d’octets de SSPSR à SSPBUFF survient, l’acquittement ne sera pas envoyé, et il est de même pour un débordement qui lui est géré par le bit SSPOV du registre SSPCON1.

Schéma


Logiciel du PIC


Ci-dessous les réglages dans le menu”Edit Project” (MikroPascal ou MikroC) à réaliser. je n’ai pas continué les autres captures d’écran mais tout le reste est à desactiver “Disabled”.


Programme MikroPascal du PIC 18F4550 – MikroPascal


Programme MikroC du PIC 18F4550 – MikroC

Prototype



Non réalisé! mais testé sur Platine EasyPic7 et sur plaque d’expérimentation sans soudure.

Circuit(s) imprimé(s)


Aucun.

Historiques


16/03/2019
-1er mise à disposition