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
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
ja, ich verwende den internen I2C Port ! ich schreib einmal wie ich es mir gedacht habe: ich habe einmal die beiden I2C Ports als Eingänge definiert, SSPADD = 0b00001001; // 100kHz Takt SSPCON = 0b00001000; // I2C MasterMode SSPCON.5 = 1; // I2C an CKE = 0; // I2C parameter das ist bei mir die ganze initialisierung
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 (); }
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
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 (); }
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.