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
satinas
Passioné
Passioné
Messages : 301
Enregistré en : novembre 2015

#21 Message par satinas » jeu. 27 sept. 2018 13:57

Ce n'est pas bien expliqué dans le datasheet du 18F2620.

Dans cette doc, c'est plus clair :
Using the PIC Devices' SSP and MSSP Modules for Slave I2C Communication - an734b.pdf
http://www.t-es-t.hu/download/microchip/an734b.pdf
http://ww1.microchip.com/downloads/en/A ... 00734C.pdf

Page 4
SETTING THE SLAVE ADDRESS
The address of the slave node must be written to the SSPADD register (see Figure 3). For 7-Bit Addressing mode, bits<7:1> determine the slave address value. The LSb of the address byte is not used for address matching; this bit determines whether the transaction on the bus will be a read or write. Therefore, the value written to SSPADD will always have an even value (LSb = 0).

Pour le master, voir celle-ci
Using the PICmicro MSSP Module for Master I2C Communications - 00735a.pdf
http://ww1.microchip.com/downloads/en/a ... 00735a.pdf

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

#22 Message par Serge » jeu. 27 sept. 2018 16:49

Merci Satinas.

Je vais faire des test avec l'OScillo et je te redis...

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

#23 Message par Serge » jeu. 27 sept. 2018 19:46

Alors le Maitre (PIC18F2520 RC3-RC4) envoie $40 comme Octet d'adresse par le MSSP, incluant l'adresse $20 et le bit W/R
L'Oscillo nous donne bien un Monologue du Maitre.(voir photo)
Mais l'Esclave (PIC 18F2520 RC3-RC4) SSPADD=$20 ne donne pas l'Acknowledge.
Donc, à priori ne reconnait pas l'adresse.

20180927_191000.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

#24 Message par satinas » jeu. 27 sept. 2018 20:17

Il faudrait vérifier sur le slave que l'interruption de réception I2C se déclenche bien et afficher la valeur des flags de SSPSTAT.
Ne me dis pas que tu as mis $20 dans SSPADD !!!! :)
Pour le pic, l'adresse du slave c'est $40, il s'en fiche des 7 bits, il va au plus rapide

Si l'adresse 7 bits d'un périphérique est -> B6 B5 B4 B3 B2 B1 B0
on met dans SSPADD -> B6 B5 B4 B3 B2 B1 B0 0

Communication entre deux PICs en I²C
Gérard
Avatar de l’utilisateur
Confirmé
Confirmé
Messages : 825
Âge : 60
Enregistré en : septembre 2015
Localisation : Alsace

#25 Message par Gérard » jeu. 27 sept. 2018 22:26

Si pas d'ACK, c'est que l'esclave ne se sent pas concerné. Ce n'est pas la bonne adresse que tu envoies.
Le 11 / 07 / 2017, j'ai commandé une Ford Mustang.
Le 31 / 08 / 2017, j'ai eu la Mustang, un régal.

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

#26 Message par Serge » ven. 28 sept. 2018 01:12

C'est bien ce que je ne comprends pas.

Si je dois mettre $40 dans le SSPADD, c'est que son adresse est $40 ?!
Alors décaller l'adresse à gauche depuis le Maitre pour ajouter le bit W/R, ça sert à quoi ???
ça revient à laisser l'adresse de départ $20 à droite et y ajouter "1" ou pas selon le W/R ?
Je comprend pas ce truc...

Je vais faire d'autres essais....

Merci

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

#27 Message par Serge » ven. 28 sept. 2018 01:21

a, au fait, Oui, le Flag de réception se déclenche bien, je le vérifie par une sortie led dans l'interruption
PIR1.3=1
Mais avec le module MSSP, ce n'est pas à moi de gérer dans le soft l'état de l'Acknowledge ? C'est bien le module qui le gère non ?....
Le datasheet ne dis pas d'ajouter un pseudo W/R inutile dans le SSPADD de l'esclave pour compléter à 8 bits...
C'est ça qui ne va pas ?
Je vais essayer. Merci

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

#28 Message par satinas » ven. 28 sept. 2018 08:50

Bonjour,
Lorsque tu envoies un premier octet $40 après le start, tu n'envoies pas une adresse, tu envoies un code de contrôle contenant une adresse et une commande W.
Le pic te demande de mettre l'adresse 7 bits décalée dans SSPADD, parce que c'est comme ça qu'il la reçoit, et que ça lui simplifie la vie. La doc dit bien que le slave vérifie avec les bits 7 à 1 de SSPADD que c'est son adresse 7 bits, et il dépose le bit 0 dans le flag W/R du registre SSPSTAT.
La comparaison entre les 7 bits HAUTS de SSPADD et du code de contrôle reçu doit être ultra-rapide, afin d'acquitter ou pas dans la foulée.

Effectivement le module slave en fait plus que le module master, puisque il gènère automatiquement le ACK si l'adresse est la sienne. Pour les datas qui suivent, je suppose qu'on a la main pour envoyer ACK ou NACK.
D'après la doc, l'interruption de réception ne se produit pas si l'adresse ne correspond pas.
Si ton interruption s'est produite, c'est que l'adresse était bonne, et il aurait du acquitter avec un ACK.
Il faut résoudre cette énigme, et afficher le contenu de SSPSTAT en debut de routine d'interruption

;----------------------------------------------------------------
; State 1: I2C write operation, last byte was an address byte
; SSPSTAT bits: S = 1, D_A = 0, R_W = 0, BF = 1
;
; State 2: I2C write operation, last byte was a data byte
; SSPSTAT bits: S = 1, D_A = 1, R_W = 0, BF = 1
;
; State 3: I2C read operation, last byte was an address byte
; SSPSTAT bits: S = 1, D_A = 0, R_W = 1 (see Appendix C for more information)
;
; State 4: I2C read operation, last byte was a data byte
; SSPSTAT bits: S = 1, D_A = 1, R_W = 1, BF = 0
;
; State 5: Slave I2C logic reset by NACK from master
; SSPSTAT bits: S = 1, D_A = 1, BF = 0, CKP = 1 (see Appendix C for more information)
; For convenience, WriteI2C and ReadI2C functions have been used.
;-----------------------------------------------------------------

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

#29 Message par Serge » ven. 28 sept. 2018 09:51

Bonjour.

Alors j'ai essayé les deux versions avec SSPADD du Slave à $20 et ensuite à $40
Dans les deux cas, c'est pareil. pas d'Acknowledge, mais l'interruption est bien là.

Et dans les deux cas j'ai mon registre SSPSTAT à $88 derrière l'interruption PIR1.3
soit "10001000"

SSPSTAT.7 = 1 ' SMP: Controle de la vitesse du bus: 1=vitesse standard 100 Khz 0=vitesse haute 400 Khz
SSPSTAT.6 = 0 ' CKE: SMBus Select 1=enable SMBus 0=desable SMBus
SSPSTAT.5 = 0 ' D/A: Data/Address en mode Maitre: (réservé). en esclave: 1=dernier byte reçu ou transmis=DATA si non 0= Adresse
SSPSTAT.4 = 0 ' P: Stop bit si=1 StB à été détecté si=0 n'as pas été détecté
SSPSTAT.3 = 1 ' S: Start bit(1) si=1 StB à été détecté si=0 n'as pas été détecté
SSPSTAT.2 = 0 ' R/W: Read/Write Information bit (I2C mode only) en mode Esclave 1=Read 0=Write
' en mode Maitre 1= Transmission en cours 0= pas de transmission en cours
SSPSTAT.1 = 0 ' UA: Update Address bit (10-Bit Slave mode only) 1=Indique que l'utilisateur doit mettre à jour l'adresse dans le registre de SSPADD
' 0=L'adresse ne doit pas être mise à jour
SSPSTAT.0 = 0 ' 0=BF: Buffer Full Status bit en mode Transmission 1= SSPBUF est plein 0=Vide
'en mode Réception 1= SSPBUF est plein (sans inclure l'ACK et le StB) 0=vide

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

#30 Message par satinas » ven. 28 sept. 2018 10:12

Tu as eu une interruption sur le Start puisque BF = 0.
Pourtant avec SSPCON1 = $28 il ne devrait pas y avoir d'interruption sur Start et Stop.
En plus $28 c'est un mode master, tu aurais pas 2 masters qui essayent de discuter :)


Retourner vers « Langage BASIC & PASCAL »

Qui est en ligne

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