Bonjour à tous,
Voila, je debute dans la communication I2C et j'ai quelques soucis.
(Je programme en C avec PIC C de CCS)
Je voudrais faire communiquer 3 pic 16F877 entre eux. 1 en Master et 2 autres en esclaves. Les 2 esclaves on chacuns une adresse differente.
Ce que j'arrive a faire:
- Communication entre Master et esclave N°1
La je fais un reset (debranche tout et rebranche)
- Communication entre Master et esclave N°2
J'arrete tout et remet en route.
c'est la que ca se corse:
Communication entre Master et esclave 1 (ok) puis Master et Esclave 2, la ca ne marche plus, a partir de la plus rien ne marche. meme la communication entre Master et esclave 1 qui eut marcher.
Et idem en commencant la communication avec l'esclave 2.
En fait tant que je communicque avec le meme esclave, ca vas. Mais dés que je change d'esclave, ca marche plus.
En fichier attachés Le code du Master et celui de l'esclave 1 (celui de l'esclave 2 est identiques mais avec un adresse I2C differente)

Code Master.c : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
 
#include "C:\Master.h"
 
#include <16F877A.h>
#device adc=8
 
#FUSES NOWDT                    //No Watch Dog Timer
#FUSES HS                       //High speed Osc (> 4mhz for PCM/PCH) (>10mhz for PCD)
#FUSES NOPUT                    //No Power Up Timer
#FUSES NOPROTECT                //Code not protected from reading
#FUSES NODEBUG                  //No Debug mode for ICD
#FUSES NOBROWNOUT               //No brownout reset
#FUSES NOLVP                    //No low voltage prgming, B3(PIC16) or B5(PIC18) used for I/O
#FUSES NOCPD                    //No EE protection
#FUSES NOWRT                    //Program memory not write protected
 
#use delay(clock=20000000)
#define I2C_SCL   PIN_C3
#define I2C_SDA   PIN_C4
#use i2c(Master,Fast,sda=PIN_C4,scl=PIN_C3,restart_wdt,force_hw)
 
int data =0;
int data1 =0;
 
void main()
{
 
   setup_adc_ports(NO_ANALOGS);
   setup_adc(ADC_OFF);
   setup_psp(PSP_DISABLED);
   setup_timer_0(RTCC_INTERNAL|RTCC_DIV_1);
   setup_timer_1(T1_DISABLED);
   setup_timer_2(T2_DISABLED,0,1);
   setup_comparator(NC_NC_NC_NC);
   setup_vref(FALSE);
 
   // TODO: USER CODE!!
      do{ 
         if(input(PIN_A0)){
               data++;
               output_high(PIN_B0);
               delay_ms(250);
               output_low(PIN_B0);
               delay_ms(250);
               if(data == 0xFF){
                     data = 0x00;
                       }
               }
 
        if(input(PIN_A1)){
               output_high(PIN_B0);
                i2c_start();
                //i2c_write(5);     //adresse ecriture buffer dans esclave
                i2c_write(0x24);  // adresse esclave
                i2c_write(data);    //Données a ecrire  
                i2c_stop();                
                output_low(PIN_B0);
                  }                
 
         if(input(PIN_A2)){
               data1++;
               output_high(PIN_B1);
               delay_ms(250);
               output_low(PIN_B1);
               delay_ms(250);
               if(data1 == 0xFF){
                     data1 = 0x00;
                        }
               }
         if(input(PIN_A3)){
               output_high(PIN_B1);
                i2c_start();
                //i2c_write(5);     //adresse ecriture buffer dans esclave
                i2c_write(0x26);  // adresse esclave
                i2c_write(data1);    //Données a ecrire  
                i2c_stop();
                output_low(PIN_B1);                   
               }    
 
            }while(data != 0xFE);
 
}
Code main.c : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
 
#include "C:\main.h"
 
#include <16F877.h>
#device adc=8
 
#FUSES NOWDT                    //No Watch Dog Timer
#FUSES HS                       //High speed Osc (> 4mhz for PCM/PCH) (>10mhz for PCD)
#FUSES NOPUT                    //No Power Up Timer
#FUSES NOPROTECT                //Code not protected from reading
#FUSES NOBROWNOUT               //No brownout reset
#FUSES NOLVP                    //No low voltage prgming, B3(PIC16) or B5(PIC18) used for I/O
#FUSES NOCPD                    //No EE protection
#FUSES NOWRT                    //Program memory not write protected
#FUSES NODEBUG                  //No Debug mode for ICD
 
#use delay(clock=20000000)
#use i2c(Slave,Fast,sda=PIN_C4,scl=PIN_C3,restart_wdt,force_hw,address=0x24
 
/*unsigned int8 data1;*/
//BYTE address; 
byte buffer[0x10];
 
#int_SSP
void  SSP_isr(void) {
         BYTE incoming, state;
         state = i2c_isr_state();
         if((state >= 0) && (state < 0x80)){
               incoming = i2c_read(0);
               buffer[5] = incoming;
                     }
         /*if(state < 0x80){
                     incoming = i2c_read(1);
                     buffer[5] = incoming;
                        }
         if(state == 0x80){
               i2c_write(buffer[5]);
                  } 
         if(state > 0x80){
               i2c_write(1);
                  }*/
}
 
 
 
void main()
{
 
   output_low(PIN_C1);
   output_low(PIN_C2);
   setup_adc_ports(NO_ANALOGS);
   setup_adc(ADC_OFF);
   setup_psp(PSP_DISABLED);
   setup_timer_0(RTCC_INTERNAL|RTCC_DIV_1);
   setup_timer_1(T1_DISABLED);
   setup_timer_2(T2_DISABLED,0,1);
   enable_interrupts(INT_SSP);
   enable_interrupts(GLOBAL);
   i2c_SlaveAddr(0x24);
 
   // TODO: USER CODE!!
   while(true){
         output_d(buffer[5]);
         /*if(buffer[5] == 0xBB){
            output_low(PIN_C2);
            output_high(PIN_C1);
                        }
         else{
            output_low(PIN_C1);
            output_high(PIN_C2);
                        }*/
   }
 
}

Merci d'avance pour votre aide