Bienvenue aux nouveaux arrivants sur FantasPic !

- Pensez à lire les règles durant votre visite, il n'y en a pas beaucoup, mais encore faut-il les respecter .
- N’hésitez pas à faire des remarques et/ou suggestions sur le Forum, dans le but de l'améliorer et de rendre vos prochaines visites plus agréables.
- Vous pouvez regarder votre "panneau de l'utilisateur" afin de configurer vos préférences.
- Un passage par "l'utilisation du forum" est recommandé pour connaître les fonctionnalités du forum.

--- L’équipe FantasPic ---
Forum général en BASIC et PASCAL !

Modérateur : Gérard

Communication entre deux PICs en I²C
Serge
Débutant
Débutant
Messages : 26
Enregistré en : septembre 2018

#41 Message par Serge » mer. 3 oct. 2018 17:28

La ligne blocante est:
WHILE SSPCON2.3 = 1 : WEND ' Attente réception complète

Communication entre deux PICs en I²C
Serge
Débutant
Débutant
Messages : 26
Enregistré en : septembre 2018

#42 Message par Serge » mer. 3 oct. 2018 17:38

20181003_173345.jpg
Vous n’avez pas les permissions nécessaires pour voir les fichiers joints à ce message.

Communication entre deux PICs en I²C
satinas
Passioné
Passioné
Messages : 301
Enregistré en : novembre 2015

#43 Message par satinas » mer. 3 oct. 2018 19:22

Bonjour,
Sur l'i2c il y a la notion de clock stretching , qui permet au slave de bloquer le bus et de faire patienter le master. Mets le bit CKP à 1 sur le slave pour mettre SCL à l'état haut. On devrait sans doute pas avoir à le faire si on désactive le clock stretching dans la config du slave, mais cela coûte rien..

Il faudrait voir la totalité de ton programme slave, et simplifier à l'extrème. Commence par envoyer des données vers le slave, c'est le plus simple.
Attention, le flag RCEN (SSPCON2.3) ne concerne que le master, voir le datasheet. Pour le slave, on récupère la data reçue directement dans l'interruption (ou par polling sur le bit SSPIF ou BF).

http://ww1.microchip.com/downloads/en/d ... 39631e.pdf
page 176, réception i2c slave sans clock stretching (SEN = 0)
page 182, réception i2c slave avec clock stretching (SEN = 1)

Communication entre deux PICs en I²C
satinas
Passioné
Passioné
Messages : 301
Enregistré en : novembre 2015

#44 Message par satinas » ven. 5 oct. 2018 22:00

Bonsoir
Ben voila c'est reparti :)
Pendant que Jeremy se battait avec son serveur récalcitrant, j'ai regardé l'échange i2c entre 2 pics.
Testé sur 2 pics 18F4685, la lecture par le master a été un peu plus difficile que l'écriture.
Voila les 2 programmes complets.
Il serait bon d'ajouter un time-out dans la fonction I2cWait pour gérer les erreurs.
Il ne manque rien, au reset les pins sont en input, et les registres à 0 par défaut.
Le master envoie 3 octets data, puis reçoit 3 octets data.
Le master envoie bien un nack après le dernier octet reçu.
j'ai essayé de mettre à 1 le bit SSPCON1.SSPOV pour que le slave envoie aussi un nack après le dernier octet reçu, mais cela n'a pas l'air de marcher.

Pour le Master

Code : Tout sélectionner

main master
  SSPADD   = FOSC/4/100000-1  // F=100kHz
  SSPCON1  = 0x28             // i2c master on, F = FOSC/4/(SSPADD+1)
  I2cStart
  I2cWrite(0xE6)
  I2cWrite(data_snd[0])
  I2cWrite(data_snd[1])
  I2cWrite(data_snd[2])
  I2cStop
  I2cStart
  I2cWrite(0xE6+1)
  data_rcv[0] = I2cRead(0)
  data_rcv[1] = I2cRead(0)
  data_rcv[2] = I2cRead(1)
  I2cStop()
  boucler

I2cWait
  tant que SSPSTAT.R_NOT_W = 1 ou (SSPCON2 & 0x1F) != 0 attendre

I2cStart 
  I2cWait
  SSPCON2.SEN = 1

I2cStop
  I2cWait
  SSPCON2.PEN = 1

I2cWrite(byte)
  I2cWait
  SSPBUF = byte
  I2cWait
  byte ack = SSPCON2.ACKSTAT    // valeur ack reçue en fin de write

byte I2cRead(ack_nack)
  I2cWait
  SSPCON2.RCEN = 1
  I2cWait
  byte = SSPBUF
  I2cWait
  SSPCON2.ACKDT = ack_nack
  SSPCON2.ACKEN = 1


Pour le Slave

Code : Tout sélectionner

main slave
  byte i = 0
  byte read = 0
  SSPADD   = 0xE6         // adresse slave (0x73 << 1)
  SSPCON1  = 0x26         // i2c slave on, 7bit address, no int sur start/stop
  autoriser int i2c
  boucler
 
interrupt i2c (si PIR1.SSPIF = 1)
  PIR1.SSPIF = 0
  if SSPSTAT.D_NOT_A = 0                        // réception adresse slave + W/R
    i = 0
    read = SSPSTAT.R_NOT_W
  endif
  if SSPSTAT.BF = 1
    byte z = SSPBUF
    if read = 0 and SSPSTAT.D_NOT_A = 1         // réception 3 datas envoyées par master
      byte_rcv[i] = z
      i = i+1
    else if read = 1 and SSPSTAT.D_NOT_A = 0    // envoi première data au master
      SSPBUF = byte_snd[i]
      i = i+1
    endif
  else if read = 1 and SSPSTAT.D_NOT_A = 1      // envoi 2 datas suivantes au master
    SSPBUF = byte_snd[i]
    i = i+1
  endif
  SSPCON1.CKP = 1                               // nécessaire même si clock checking désactivé


Retourner vers « Langage BASIC & PASCAL »

Qui est en ligne

Utilisateurs parcourant ce forum : Aucun utilisateur enregistré et 0 invité