PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : PIC18F4550 und 24C64 über I2C



TheScientist
23.07.2007, 17:29
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:


//------------------------------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