Forum: Mikrocontroller und Digitale Elektronik Pic32 I2C Slave Kommunikation


von Stephan (Gast)


Lesenswert?

Hallo Leute,
ich versuche hier eine Kommunikation von 2 Pic's per I2C herzustellen, 
aber leider will das nicht so richtig passen. Der Slave blockiert 
irgendwann den Bus!

1) nach Start und Adresse -> das Ack/Nack wird nicht ausgeführt
2) nach Start, Adresse und Nack-> Master will Stop senden aber Slave 
hält den Clk weiter low!

Master sendet im Vordergrung und der Slave empfängt im INT!
Vom Master kommen immer nur WR-Telegramme!!
1
   I2C_MODULE inf= I2C1;
2
3
   INT_SOURCE eMaster;
4
   INT_SOURCE eSlave;
5
   INT_SOURCE eBusColision;
6
   
7
   switch(inf)
8
   {
9
      case I2C1:
10
         eMaster= INT_I2C1M;
11
         eSlave= INT_I2C1S;
12
         eBusColision= INT_I2C1B;
13
         break;
14
   }
15
16
   if(INTGetFlag(eSlave)) //INT_SOURCE_I2C_SLAVE(inf)))
17
   {
18
      INTClearFlag(eSlave);
19
      
20
      I2C_STATUS MyStatus;
21
      MyStatus= I2CGetStatus(inf);
22
      u08 SendByte;      
23
      
24
      if ((MyStatus & I2C_SLAVE_READ) == 0 && I2CReceivedByteIsAnAddress(inf) == 1)
25
      {
26
         // is write to slave
27
         // is an Adress
28
         SendByte= I2CGetByte(inf);
29
         I2CSlaveClockRelease(inf);
30
      }
31
      else if ((MyStatus & I2C_SLAVE_READ) == 0 && I2CReceivedByteIsAnAddress(inf) == 0)
32
      {
33
         // is write to slave
34
         // is DataByte
35
         SendByte= I2CGetByte(inf);
36
         I2CSlaveClockRelease(inf);
37
      }
38
      else if ((MyStatus & I2C_SLAVE_READ) == 1 && I2CReceivedByteIsAnAddress(inf) == 1)
39
      {
40
         // is read from slave
41
         // is an Adress
42
         SendByte= I2CGetByte(inf);
43
         I2CSendByte( inf, 0x07);   // <- Dummy
44
      }
45
      else if ((MyStatus & I2C_SLAVE_READ) == 1 && I2CReceivedByteIsAnAddress(inf) == 0)
46
      {
47
         // is read from slave
48
         // is DataByte
49
         I2CSendByte( inf, 0x70);  // <- Dummy
50
      }   
51
   }

eigendlich ist das das gleiche was MC auch in den Beispielen macht....?
Vielleicht hat einer von euch noch eine Idee was falsch ist.

mfg
Stephan

von Manfred G. (magroma)


Lesenswert?

Hallo, hast du die beiden Widerstände nach + an den beiden Leitungen 
drin.
ca. 2k
Gruß Manni

von Stephan (Gast)


Lesenswert?

Hi
ja die habe ich.
Was seltsam ist das der Slave alleine scheinbar gut funktioniert!
(PC -> Pic, ca 1000 Telegramme nur 2 Fehler (ist ok))
Wenn ich auf den I2C Bus einen zusätzlichen Master (Pic) einbringe 
funktioniert der Code nicht mehr. (mal sendet der PC mal der Maste-Pic)

Ich bin mir bei der Fehlersuche auch schon langsam nicht mehr sicher das 
es der Slave alleine ist der hier quatsch macht. Haben die Pics hier 
irgendwas besonderes was ich übersehen haben könnte?

Stephan

von Joachim... (Gast)


Lesenswert?

Laß es uns wissen wenn es klappt. Ist der komplette Code von dir oder 
hat Microchip Vorarbeit für den Slave geleistet?

Ich hab vor nem Jahr mal das gleiche Prob gehabt, hab dann aber nach 
drei Tagen frustriert aufgegeben. Hab dann das gleiche mit zwei Atmegas 
in ner Stunde hinbekommen.

Hat mich ganz schön geschwächt, das Ganze.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.