Probleme beim auslesen vom AT24C512B

Gast #2582245
Lesenswert?

Hallo Leute bin seit Tagen am probieren vom AT24C512B zu lesen bzw zu 
schreiben. Im anhang hab ich ein Testprogram was mir einen Wert in den 
EEPROM schreiben soll, wieder auslesen und per UART an den PC schicken 
soll. bekomm aber immer nur 255 gesendet. WP ist auf GND Adresse ist 1 
eingstellt. Hab schon wie oft im Datenblatt gesucht aber nichts 
gesonderes gefunden. Vll überseh ich auch was. Kann jemand mir 
weiterhelfen
Angehängte Dateien:
#2583998
Lesenswert?

Peter schrieb:
> Peter Dannegger schrieb:
>> Dein Read schreibt ja auch wieder 255 rein.
>
> Beim aktuellen Code?

Ja natürlich.

Die Richtung kann man nur mit dem I2C-Adreßbyte umschalten. Dein
1
input = i2c_readAck();
macht daher ein I2C-Write mit 0xFF.

Du solltest endlich mal ins 24C512 Datenblatt schauen. Da ist alles 
ausführlich dargestellt.


Peter
#2584045
Lesenswert?

Versuchs mal so:
1
unsigned char eeprom_readbyte (unsigned char addressout, uint16_t eepromaddress){    
2
    addressout = addressout<<1;
3
    i2c_init();
4
    i2c_start_wait(0b10100000|addressout);
5
    i2c_write((eepromaddress>>8)&0xFF);
6
    i2c_write(eepromaddress&0xFF);
7
    i2c_start_rep(0b10100001|addressout);
8
    unsigned char input = i2c_readAck();
9
    i2c_stop();
10
    return input;
11
}

PS: RTFM. Da sieht man schön unter "Random Read", was man machen muss.

Gruß Oliver
Gast #2586866
Lesenswert?

So hier mal die getesteten Programme. Hat also am auslesen gelegen. auch 
bei dem hier zuletzt geposteten Programm ist noch der Fehler das auf ein 
ACK gewartet wird. Beim lesen muss aber ohne ACK gelesen werden.
1
void eeprom_writebyte (unsigned char addressout, uint16_t eepromaddress ,unsigned char data)
2
{
3
    addressout = addressout<<1;
4
    i2c_init();
5
    i2c_start_wait(0b10100000|addressout);
6
    i2c_write ((eepromaddress>>8)&0xFF);
7
    i2c_write (eepromaddress&0xFF);
8
    i2c_write (data);
9
    i2c_stop ();
10
}
11

12
unsigned char eeprom_readbyte (unsigned char addressout, uint16_t eepromaddress)
13
{    
14
    addressout = addressout<<1;
15
    i2c_init();
16
    i2c_start_wait(0b10100000|addressout);
17
    i2c_write((eepromaddress>>8)&0xFF);
18
    i2c_write(eepromaddress&0xFF);
19
    i2c_start_wait(0b10100001|addressout);
20
    unsigned char input = i2c_readNak();
21
    i2c_stop();
22
    return input;
23
}
Gast #5232361
Lesenswert?

Hallo zusammen,

macht das hier sind oder gibt es eine besser/schnellere alternative ein 
Pagewrite/read durchzuführen. Habe keine richtige AT24C512 lib in C 
gefunden.
1
void at24c512_pagewrite(unsigned char addressout, uint16_t eepromaddress , uint8_t &ee_data, uint8_t len)  //Maximal len=128
2
{
3
    addressout = addressout<<1;
4
    i2c_init();
5
    i2c_start_wait(0b10100000|addressout);
6
    i2c_write ((eepromaddress>>8)&0xFF);
7
    i2c_write (eepromaddress&0xFF);
8
  for(uint8_t i=0; i<len; i++)
9
  {
10
    i2c_write (ee_data);
11
    &ee_data++;
12
  }
13
    i2c_stop ();
14
}
15

16
void at24c512_pageread(unsigned char addressout, uint16_t eepromaddress, uint8_t &ee_data, uint8_t len)  //Maximal len=128
17
{    
18
    addressout = addressout<<1;
19
    i2c_init();
20
    i2c_start_wait(0b10100000|addressout);
21
    i2c_write((eepromaddress>>8)&0xFF);
22
    i2c_write(eepromaddress&0xFF);
23
    i2c_start_wait(0b10100001|addressout);
24
  for(uint8_t i=0; i<(len-1); i++)
25
  {
26
    *ee_data=i2c_readAck(ee_data);
27
    &ee_data++;
28
  }
29
    *ee_data=i2c_readNak();
30
    i2c_stop();
31
}
Dieser Beitrag ist gesperrt und kann nicht beantwortet werden.