PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : I²C EEPROM, Pullups und P. Fleuries Library



PCMan
29.12.2007, 16:10
Hallo AVR-Freunde.
Ich möchte float-Messwerte in ein externes I²C EEPROM abspeichern. Die EEPROMS habe ich von Microchip zugesendet bekommen (als Samples).
Es handelt sich um die 24LC32 EEPROMS.
Dem Datenblatt der EEPROMS nach, muss ich SDA, wenn ich den Bus mit 400kHz betreiben will mit 2kOhm auf Vcc ziehen. Das habe ich getan. (Anhang1).
Danach wollte ich versuche, die EEPROMS am IIC Bus mit meinem ATMEGA32 und den I2CMASTER-Libraries von P. Fleury zu betreiben.
Im Source steht dagegen, dass ich SCL und SDA mit 4,7kOhm auf Vcc ziehen soll.
Weiterhin läuft mein ATMEGA32 mit 12MHz. Wenn ich den Bus mit 400kHz betreiben will komme ich auf einen TWBR-Wert von 7. Das ist aber kleiner als 10! Wenn ich jetzt auf 100KHz umsteige (dann erreiche ich einen Wert >10), dann müsste ich laut Datenblatt der EEPROMS am SDA 10kOhm anhängen.
Ich bin etwas verwirrt, was ich jetzt anschließen soll: soll ich an beide Leitungen 4,7k hängen oder es bei den 2k belassen? Und wieso steht im Datenblatt nix davon, dass ich auf SCL auch was hängen soll?
Dann habe ich die Einträge in der I2CMaster.S entsprechend editiert und in der Makefile mit eingebunden:


#define SDA 1 // SDA Port c, Pin 1
#define SCL 0 // SCL Port C, Pin 0
#define SDA_PORT PORTC // SDA Port C
#define SCL_PORT PORTC // SCL Port C
Für die Beschaltung am Atmel siehe Anhang 2.

Wenn ich versuche auf die EEPROMS zuzugreifen bekomme ich einen "Error" auf meinem LCD. Hier Sourcecode:

#define Dev24C02 0xA0 // device address of EEPROM 24C02, see datasheet
unsigned char ret;
lcd_clrscr();
char buffer[33];


// write 0x75 to EEPROM address 5 (Byte Write)

i2c_init(); // init I2C interface

/* write 0x75 to eeprom address 0x05 (Byte Write) */
ret = i2c_start(Dev24C02+I2C_WRITE); // set device address and write mode
if ( ret ) {
/* failed to issue start condition, possibly no device found */
i2c_stop();
lcd_puts("error"); // activate all 8 LED to show error */
}else {
/* issuing start condition ok, device accessible */
i2c_write(0x05); // write address = 5
ret = i2c_write(12); // irgendeine Zahl. ret=0 -> Ok, ret=1 -> no ACK
if ( ret ) lcd_puts("err1");
i2c_stop(); // set stop conditon = release bus

/* write ok, read value back from eeprom address 0x05, wait until
the device is no longer busy from the previous write operation */
i2c_start_wait(Dev24C02+I2C_WRITE); // set device address and write mode
ret = i2c_write(0x05);
if ( ret ) lcd_puts("err2"); // write address = 5
i2c_rep_start(Dev24C02+I2C_READ); // set device address and read mode
ret = i2c_readNak(); // read one byte
i2c_stop();
lcd_puts("ok");
itoa (ret,buffer,10);
lcd_puts(buffer); // output byte on the LED's
}
for(;;);

Hier die Konifiguration in der twimaster.c:


/* define CPU frequency in Mhz here if not defined in Makefile */
#ifndef F_CPU
#define F_CPU 12000000UL
#endif

/* I2C clock in Hz */
#define SCL_CLOCK 400000L


/************************************************** ***********************
Initialization of the I2C bus interface. Need to be called only once
************************************************** ***********************/
void i2c_init(void)
{
/* initialize TWI clock: 100 kHz clock, TWPS = 0 => prescaler = 1 */

TWSR = 0; /* no prescaler */
TWBR = ((F_CPU/SCL_CLOCK)-16)/2; /* must be > 10 for stable operation. Hier Wert leider 7 ! */

}/* i2c_init */


Könnt ihr mir bitte helfen, was ich jetzt für Widerstände auf +5V setzen soll? Mir ist übrigens aufgefallen, dass ich mindestens 2 Sekunden warten muss, biss ich die Error-Anzeige erhalte. Wieso dauert das so lange?
Habt vielen Dank,
vG Simon

PCMan
29.12.2007, 17:21
Kleines Update:
ich habe den 2kOhm Widerstand ausgelötet und durch 10k ersetzt. Weiterhin habe ich gemerkt, dass die i2cmaster.S nur für Software-TWI benötigt wird und daher wieder ausgebunden.
Ich bekomme jetzt keinen Fehler auf das Display, sondern garnichts. Das Programm bleibt beim Write-Befehl einfach stehen.
Woran könnte das jetzt liegen?
vG Simon

PCMan
29.12.2007, 17:46
Noch ein kleines Update: wenn ich die Buchse unbesetzt lasse dann bleibt mein Programm auch stehen. Wenn ich aber das Kabel reinsetze und dann ein wenig berühre, dann bekomme ich den error. Kabelbruch? Kann es eigentlich nicht sein, weil der error nur dann kommt, wenn ich das Kabel mit der Hand berühre. Bewege ich es mit einem Plastikteil passiert nach wie vor nix.
Damn!
Hilfe!

PCMan
29.12.2007, 18:27
Okay, letztes Update. Es soll alle betreffen, die sich gutgläubig an DIESES Datenblatt halten und trotzdem nicht vorwärts kommen. Nachdem ich einen 4,7kOhm Widerstand zwischen +5V und SCL gelegt habe, scheint alles so zu laufen, wie ich es gerne hätte. Wäre nur super, wenn das auch im Datenblatt der Chips stehen würde, dass zwischen beide - nämlich SCL UND SDA ein Resistor gehört.
vG Simon

linux_80
29.12.2007, 21:21
Hallo,

zum TWBR, man muss ja nicht genau die 400 erreichen,
deswegen entweder einfach eine 10 da reinschreiben, wenn ein kleinerer Wert rauskommt, dann läuft der Bus evtl. mit 350 oder so,
oder einfach mit der 7 probieren, denn ich hab schon öfter gelesen, dass es doch meistens läuft, und der AVR nix von der 10er Grenze weiss ;-)