
Försöker läsa/skriva till ett I2C eeprom (Mircochip 24LC16B/P) med MSSP-enheten på en PIC18F458. Har kopplat in den och försökt få till en kod enligt Microchips appnotes.
http://ww1.microchip.com/downloads/en/A ... 00991A.pdf
Jag får det dock inte att funka. Om jag provar att skriva nåt och sedan läsa det så får jag alltid '255' tillbaka.
Allt är kopplat som på bilden på sida 1 i appnoten oven.
Jag gör en liten delay på 10ms innan jag läsar så att eepromet skall hinna skriva klart.
Det lär ju vara någon här på forumet som hållt på med I2C eeprom som har skrivit kod för detta. Skulle nån vilja slänga ett öga på koden å se om jag gjort nåt fel!
Tack!
Kör PIC:en på 4MHz
Kod: Markera allt
void i2c_put_eeprom(char page , char addr, char data)
// skriva en byte till EEPROM
{
//sätter control_byten som är första byta att skickas
//bit 1 till 3 är vilken PAGE
char control_byte;
control_byte = 0b1010.000.0;
control_byte.3 = page.2;
control_byte.2 = page.1;
control_byte.1 = page.0;
//initierar I2C, master.
SSPSTAT = 0x80;
SSPADD = 0x09; // Fosc = 4 Mhz
SSPCON1 = 0x28;
SSPCON2 = 0x00;
TRISC.3 = 1;
TRISC.4 = 1;
SSPIF = 0;
SEN = 1; // START.
while(!SSPIF); // Vänta tills SSPIF är SET, dvs. klart.
SSPIF = 0; // nollställ SSPIF.
SSPBUF = control_byte; // sänd controlbyten.
while(!SSPIF); // -"-,
SSPIF = 0;
SSPBUF = addr; // sänd adressbyten.
while(!SSPIF);
SSPIF = 0;
SSPBUF = data; // sänd databyten.
while(!SSPIF);
SSPIF = 0;
PEN = 1; // STOP
while(!SSPIF);
SSPIF = 0;
}
char i2c_get_eeprom(char page , char addr)
// läsa en byte från eeprom
{
char control_byte, data;
//sätter control_byten som är första byta att skickas
//bit 1 till 3 är vilken PAGE, bit 0 är R/!W
control_byte = 0b1010.000.0;
control_byte .3 = page.2;
control_byte .2 = page.1;
control_byte .1 = page.0;
//initierar I2C, master.
SSPSTAT = 0x80;
SSPADD = 0x09; // Fosc = 4 Mhz
SSPCON1 = 0x28;
SSPCON2 = 0x00;
TRISC.3 = 1;
TRISC.4 = 1;
SSPIF = 0;
SEN = 1; // START
while(!SSPIF); // Vänta tills SSPIF är SET, dvs. klart.
SSPIF = 0; // nollställ SSPIF.
SSPBUF = control_byte; //sänd controlbyte
while(!SSPIF); // -"-
SSPIF = 0;
SSPBUF = addr; // sänd adressbyte;
while(!SSPIF);
SSPIF = 0;
control_byte.0 = 1; //ändra controlbyten till READ.
RSEN = 1; // RESTART
SSPBUF = control_byte; //sänd controlbyte
while(!SSPIF);
SSPIF = 0;
ACKDT = 1; // not acknowledge
RCEN = 1; // recive enabled
while(!SSPIF);
SSPIF = 0;
data = SSPBUF; //hämta data
ACKEN = 1; // acknowlede enabled
PEN = 1; // STOP
while(!SSPIF);
SSPIF = 0;
return data;
}