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:
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.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; }
Danke mfg The Scientist
Lesezeichen