I2C probelem

Gast #26861
Lesenswert?

ich ahb 2 probleme !
1. wie kann ich hier im forum beiträge über I2C finden ?


2. ich hab jetzt versucht I2C zu programmieren, jedoch ist das einzige 
was passiert das CLK von LOW auf High geht und auf high bleibt, data 
geht eine periode auf HIGH und dann wieder auf LOW. und das war es, hat 
wer eine idee was der fehler sein könnte ?



arbeite mit dem PIC 16F877
Gast #26862
Lesenswert?

Hallo Chris,

1. I2C geht nicht, da nur drei Buchstaben. (verstehe ich zwar nicht, da 
es etliche sinnvolle Suchbegriffe mit 2 oder drei Buchstaben gibt).

2. Da bräucht ich noch ein paar Informationen. Am besten den Quelltext. 
Ich nehme mal an, dass Du den integrierten I2C-Port verwendest. Eine 
falsche Einstellung und das Ding kann nicht gehen.

MfG
Steffen
Gast #26864
Lesenswert?

und so möchte ich daten übertragen:


void I2C_FERTIG ()
{
 while (PIR1.3 == 0);
 PIR1.3 = 0;
}

void I2C_BUS_START ()    // Start - Bit
{
 SEN = 1;
 I2C_FERTIG ();
}

void I2C_BUS_START_rep ()  //
{
 RSEN = 1;
  I2C_FERTIG ();
}

void I2C_BUS_STOPP ()    // Stopp - Bit
{
 PEN = 1;
 I2C_FERTIG ();
}

void I2C_R (char x)    // Daten schreiben
{
 SSPBUF = x;
 I2C_FERTIG ();
}

void I2C_W ()      // Daten lesen
{
 RCEN = 1;      // PIC soll den Takt erzeugen
 I2C_FERTIG ();


 I2Cempfang = SSPBUF;
}

void RTC_INI ()
{
 I2C_BUS_START ();
 I2C_R (0xA0);    // zum lesen adressieren
 I2C_BUS_START_rep ();
 I2C_R (0x00);    // Adresse im pcf 8583
 I2C_BUS_START_rep ();
 I2C_R (0x00);    // 0 in das register schreiben
 I2C_BUS_STOPP ();
}

void RTC_auslesen ()
{
 I2C_BUS_START ();
 I2C_R (0xA0);    // Adresspointer auf die auszu-
 I2C_BUS_START_rep ();
 I2C_R (0x02);    // lesende adresse stellen
 I2C_BUS_START ();
 I2C_R (0xA1);    // zum lesen adressieren
 I2C_BUS_START_rep ();
 I2C_W ();    // Daten vom bus einlesen
 sek = I2Cempfang;
 I2C_BUS_START_rep ();
}
#26866
Lesenswert?

Ich kenn mich mit den PICs nicht aus, aber I2C geht so:

Ein Start sendet man nur einmal bevor man die Slaveadresse sendet. Und 
dann wartet man das ACK des Slaves ab, sonst geht gar nichts.

Ein Repeat-start sendet man nur, wenn man die Richtung wechseln will, 
d.h. von Schreiben auf Lesen oder umgekehrt. Und dann kommt als erstes 
auch wieder die Slaveadresse mit dem Lese/Schreibbit, das ACK des Slaves 
usw...

Die Daten-ACKs erzeugt immer der Lesende und der Schreibende prüft sie.

Und nach dem Lesen des letzten Bytes muß der Master ein NACK senden, 
damit der Slave weiß, daß Schluß ist.


Peter
Gast #26867
Lesenswert?

was stimmt an der iniziasierung und am beginn der datenübertragung nicht 
?


bei mir beginnt er gar nicht daten zu übertragen !


void I2C_INI ()
{
 SSPEN = 1;
 SSPM3 = 1;
 SSPM2 = 0;
 SSPM1 = 0;
 SSPM0 = 0;
 SSPCON2 = 0;
 SMP = 1;
 CKE = 0;
 SSPADD = 10;
}

void I2C_BUS_START ()    // Start - Bit
{
 SEN = 1;
 while (SEN);
}

void I2C_W (char x)
{
 SSPIF = 0;
 SSPBUF = x;
 while (SSPIF == 0);
}



void RTC_INI ()
{
 I2C_BUS_START ();
 I2C_W (0xA0);
 I2C_W (0x00);
 I2C_W (0x00);
 I2C_BUS_STOPP ();
}

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren