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