Pour ceux que ça pourrait intéresser, sous Mikrobasic, voici un exemple de programme "slave" pour PIC16F690. ici il s'occupe de renvoyer la donnée qu'on lui a envoyée incrémentée de 1
program slave
'SDA=RB4
'SCL=RB6
symbol LedCtrl = PORTC.6
' Declarations section
const AdressePic16F690=%11110000 'adresse I2C (7 bits + RW)
dim x1,y1,DonneeAEnvoyer,AdresseRecue,DonneeRecue as byte
dim RxBuffer,xI2c as byte
dim FlagTransferer as boolean
'------------------------------------------------------------
sub procedure interrupt
if PIR1.SSPIF = 1 then ' flag I2C
PIR1.SSPIF = 0
if SSPCON.SSPOV=1 then
SSPCON.SSPOV=0
else
xI2c=SSPSTAT and %00101101 'on ne conserve que les bits DA S RW BF
select case xI2c
case %00001001 ' Mode écriture - Adresse recue
AdresseRecue=SSPBUF
case %00101001
DonneeRecue=SSPBUF ' Mode écriture - Donnee recue
case %00001100 ' Mode lecture
SSPCON.CKP =0 ' met Scl bas pour interdire d'autres opérations
SSPBUF = DonneeAEnvoyer ' charger le buffer avec la donnée à transmettre
SSPCON.CKP =1 ' relâche Scl pour autoriser les transferts
end select
end if
xI2c=SSPBUF ' vide le buffer
end if
end sub
'------------------------------------------------------------
main:
' Main program
'désactivation analogique
ADCON0 = 0
ADCON1 = 0
ANSEL = 0
ANSELH = 0
'désactivation interrupt on change
IOCB = 0
'pas de pull up sur le port B
WPUB=0
'configuration des ports
PORTA=0
TRISA=0
PORTB=0
TRISB=%01010000
PORTC=%00000011
TRISC=0
'configuration module SSP (I2C slave)
SSPSTAT=0
SSPBUF.BF=0
SSPCON.SSPOV=0
SSPCON = %00000110 ' mode 7 bits slave sans interruption START / STOP
SSPCON.CKP=1 'bit qui permet d'occuper l'I2C (interdire d'autres transferts)
SSPADD=AdressePic16F690 '<<1 'transfert de l'adresse I2C (bit0=1 si read, 0 si write)
SSPCON.SSPEN = 1 ' activation module SSP
'départ d'autorisation interruption
PIR1.SSPIF=0
PIE1.SSPIE=1 'autorise interruptions
INTCON.PEIE=1 'autorise tout type d'interruptions
INTCON.GIE=1 'autorise interruptions globales
while true
DonneeAEnvoyer=DonneeRecue+1
wend
end.