Forum: Mikrocontroller und Digitale Elektronik I2C Probem(Master)


von Joel (Gast)


Lesenswert?

Hallo Zusammen,
ich habe ein Problem mit I2C (PIC18F). ich bin momentan bei Master. ich 
versuche Daten zu schicken aber es komme immer nichts aus. ich weiss 
nicht wo mein Fehler liegt. das sind mein Code:
void I2C_WRITE(void)
{   u08 Data[8]={0xA5,0xD5, 0x50, 0xA5, 0xF5, 0x05,0x64, 0xAF};
  int counter;
 I2C_Start();
 PIR1bits.SPPIF=1; // set Flag
 I2C_ReStart();
 SSPBUF=0x45;
 PIR1bits.SPPIF=0; // set Flag
 I2C_ACK();
 for(counter=0;counter<8;counter++)
 {
 SSPBUF=Data[counter];
}
I2C_ACK();
while(PIR1bits.SPPIF);
 PIR1bits.SPPIF=1; // Flag to Zero
 I2C_Stop();
}
Danke für ihr Hilfe.

von Jörg S. (joerg-s)


Lesenswert?

Hab das mal etwas ordentlicher gemacht: :)
1
void I2C_WRITE(void)
2
{   
3
  u08 Data[8]={0xA5,0xD5, 0x50, 0xA5, 0xF5, 0x05,0x64, 0xAF};
4
  int counter;
5
6
  I2C_Start();
7
  PIR1bits.SPPIF=1; // set Flag
8
  I2C_ReStart();
9
  SSPBUF=0x45;
10
  PIR1bits.SPPIF=0; // set Flag
11
  I2C_ACK();
12
  
13
  for(counter=0;counter<8;counter++)
14
  {
15
    SSPBUF=Data[counter];
16
  } 
17
  
18
  I2C_ACK();
19
  while(PIR1bits.SPPIF);
20
  PIR1bits.SPPIF=1; // Flag to Zero
21
  I2C_Stop();
22
}

Ich kenn mich mit PIC nicht aus, aber das mit dem ReStart und ACK kommt 
mir spanisch vor. Du willst doch nur senden und nicht empfangen, oder?
Sendet der PIC nach dem ersten I2C_Start() schon die Slave Adresse? 
Sieht irgendwie danach aus als ob die die Adresse erst nach dem 
I2C_ReStart sendest. Und was macht denn die Funktion I2C_ACK() ? Sendet 
die ein ACK oder empfängt die einen? Wenn du nur sachen sendest, schickt 
nur der Slave ein ACK.

von Joel (Gast)


Lesenswert?

Ja ich will nur zuerst senden. und empfang keine Daten mit mit meine 
Analysator

von Jörg S. (joerg-s)


Lesenswert?

Und der Slave ist ein EEPROM?

von Joel (Gast)


Lesenswert?

Hallo zusammen
ich habe weiter bearbeitet.Und  mit Logicort analysator kriege ich immer 
andere werte aus. das ist mein Funktion:
1
 
2
void I2C_WRITE(void)
3
{ 
4
  u16 i=0
5
 I2C_Start();
6
   PIR1bits.SPPIF=1; // set Flag 
7
   SSPADD=0x48; 
8
  SSPBUF=SSPADD;
9
  i=i+6;
10
 SSPCON2bits.ACKSTAT=0;
11
 PIR1bits.SPPIF=1; // set Flag 
12
      SSPADD=0x68;
13
       SSPBUF=SSPADD;
14
       i=i+6;
15
SSPCON2bits.ACKSTAT=1;
16
PIR1bits.SPPIF=1; // set Flag
17
I2C_Stop();
18
}
und ich kriege solche wetre aus : R:3Fh, R:1Fh, S=start, p=stop, 
GC=generall Call, FFh.
konnte jemand mir helfen

von Jörg S. (joerg-s)


Lesenswert?

Schreib doch erst mal GENAU was du machen willst.

Ich vermute mal du willst an Adresse 0x48 den Wert 0x68 senden?
Angeblich soll das Register SSPADD für die Bus Geschwindigkeit zuständig 
sein, warum stellt du dann 2x daran rum?

von Joel (Gast)


Lesenswert?

ok ich will zwei werte senden und das war nur ein beispiel. und 
eigenlich ist dieses Programm für master und durch mein logicport quand 
ich sehen was für ein daten von SDA raus kommen. und wenn ich nicht 
durch  SSPADD die Daten eingeben  funktionniert mein logic port 
analysator nicht deshalb bin ich verzweifelt. was schlagen sie vor?
Grüss

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.