Hi,

ich versuche ein 24C64 mit einem 18F4550 anzusprechen. Es wird erst ein Byte im EEPROM gespeichert und dann wieder ausgelesen und über LEDs angezeigt. Allerdings scheint zumindest der Lesevorgang nicht zu funktionieren, da die LEDs 0x00 anzeigen obwohl eigentlich 0x88 rauskommen sollte. Habe mich beim Programmieren sowohl am Datenblatt des 18F4550 als auch an der Anleitung auf sprut.de orientiert. Hier mal der C18 code dazu:
Code:
//------------------------------I2C-------------------------------------
//Konfiguriere I2C-Interface
void initI2C(void)
{
	//Bustakt ungefähr 400kHz bei 48MHz
	SSPADD = 0x1D;

	//Standard Mode
	SSPCON1 = 0x08;

	//I2C aktivieren
	SSPCON1bits.SSPEN = 1;
}

//Bus übernehmen
void overtakeI2C(void)
{
	SSPCON2bits.SEN = 1;
	
	//Fertig?
	while(!PIR1bits.SSPIF);
	PIR1bits.SSPIF = 0;
}

//Bus freigeben
void freeI2C(void)
{
	SSPCON2bits.PEN = 1;
	
	//Fertig?
	while(!PIR1bits.SSPIF);
	PIR1bits.SSPIF = 0;
 }	

//Byte senden
void sendByteI2C(char cWord)
{
	//Datenversenden
	SSPBUF = cWord;

	//Fertig?
	while(!PIR1bits.SSPIF);
	PIR1bits.SSPIF = 0;
}

//Byte empfangen
char getByteI2C(void)
{
	//Master auf Empfang stellen
	SSPCON2bits.RCEN = 1;

	//Fertig?
	while(!PIR1bits.SSPIF);
	PIR1bits.SSPIF = 0;

	return SSPBUF;
}

//Acknowledgment senden
void sendACKI2C(char cLastByte)
{
	SSPCON2bits.ACKDT = cLastByte & 0b00000001;
	SSPCON2bits.ACKEN = 1;

	//Fertig?
	while(!PIR1bits.SSPIF);
	PIR1bits.SSPIF = 0;
}

//------------------------------I2C-EEPROM-------------------------------
//Speichere Byte
void sendDataToEEPROM(char cAddH, char cAddL, char cData)
{
	//I2C-Bus übernehmen
	overtakeI2C();

	//EEPROM ansprechen
	sendByteI2C(0b10100000);

	//Sende Addresse
	sendByteI2C(cAddH);
	sendByteI2C(cAddL);

	//Sende Datenbyte
	sendByteI2C(cData);

	//Bus freigeben
	freeI2C();
}

//Lese Byte
char getDataFromEEPROM(char cAddH, char cAddL)
{
	//I2C-Bus übernehmen
	overtakeI2C();

	//EEPROM ansprechen (schreiben)
	sendByteI2C(0b10100000);

	//Sende Addresse
	sendByteI2C(cAddH);
	sendByteI2C(cAddL);

	//I2C-Bus übernehmen
	overtakeI2C();

	//EEPROM ansprechen (lesen)
	sendByteI2C(0b10100001);

	//Sende Addresse
	cEEPROMData = getByteI2C();

	//ACK
	sendACKI2C(0x01);

	//Bus freigeben
	freeI2C();

	return cEEPROMData;
}
Eine kleine Unstimmigkeit zwischen dem Datenblatt und sprut ist mir bei der Startcondition aufgefallen. Während bei sprut das SSPIF direkt noch in der Startconditionroutine zurückgesetzt wird, wird bei Microchip zuerst das erste Datenbyte in SSPBUF geschrieben und dann das SSPIF gelöscht. Keine Ahnung ob das was zur Sache tut.

Danke mfg The Scientist