PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : ATmega8 und I2C Slaves antworten nicht



Gurax87
12.01.2008, 13:51
Hi

Ich versuche grad über den I2C Bus Daten vom ATmega8 auf den PCF8574 (8-Bit I/O Port) auszugenen und was im ST24c02 (2K EEPROM) zu speichern nur leider funktioniert das nicht ...

Ich benutze die twimaster.c von Peter Fleury also nicht die Software Implementation. Nur leider antwortet nie ein IC obwohl ich die richtige Adresse eingestellt haben und alles meiner meinungnach richtig angeschlossen hab. Alle Adress-Pins auf 0V dann den INT auf +5V, natürlich auch die Spannungsversorgung für das IC.
Zudem habe ich SDA und SCL mit 4,7k Pullup Wiederständen versehen.
Mein ATmega8 ist auf den Atmel Evaluationsboard v2.0 von Pollin.de auf dem ich auch das EEPROM sitzen habe.

Mein Quelltext zum testen des EEPROMs
PD5 und PD6 sind LEDs und beep is mein Speaker damit ich weis wo er stopt


#include <avr/io.h>
#include <util/delay.h>
#include "twimaster.c"

#define DEVICE 0xA0
#define I2C_WRITE 0
#define I2C_READ 1

int main (void) {
DDRD = 0xff;
PORTD = 0x00;
PORTC = 0xFF;

beep(); //1
i2c_init();
beep(); //2
i2c_start_wait(DEVICE+I2C_WRITE);
beep(); //3
i2c_write(5);
beep(); //4
i2c_write(43);
beep(); //5
i2c_stop();
beep(); //6
i2c_start_wait(DEVICE+I2C_WRITE);
beep(); //7
i2c_write(5);
beep(); //8
i2c_rep_start(DEVICE+I2C_READ);
beep(); //9
if (i2c_readNak() == 43) {
PORTD |= (1<<PD6);
}else{
PORTD |= (1<<PD5);
}
beep(); //10
i2c_stop();
beep(); //11
return 0;
}


Ich hab das jetzt schon so weit auseinander gepflückt, dass ich weis das die while schleife in der i2c_start_wait funktion nie beendet wird aber ich weis nicht wie soo...


/************************************************** ***********************
Issues a start condition and sends address and transfer direction.
If device is busy, use ack polling to wait until device is ready

Input: address and transfer direction of I2C device
************************************************** ***********************/
unsigned char i2c_start_wait(unsigned char address)
{
uint8_t twst;


while ( 1 )
{
// send START condition
TWCR = (1<<TWINT) | (1<<TWSTA) | (1<<TWEN);

// wait until transmission completed
while(!(TWCR & (1<<TWINT)));

// check value of TWI Status Register. Mask prescaler bits.
twst = TW_STATUS & 0xF8;
if ( (twst != TW_START) && (twst != TW_REP_START)) continue;

// send device address
TWDR = address;
TWCR = (1<<TWINT) | (1<<TWEN);

// wail until transmission completed
while(!(TWCR & (1<<TWINT)));

// check value of TWI Status Register. Mask prescaler bits.
twst = TW_STATUS & 0xF8;
if ( (twst == TW_MT_SLA_NACK )||(twst ==TW_MR_DATA_NACK) )
{
/* device busy, send stop condition to terminate write operation */
TWCR = (1<<TWINT) | (1<<TWEN) | (1<<TWSTO);

// wait until stop condition is executed and bus released
while(TWCR & (1<<TWSTO));

continue;
}
if( twst != TW_MT_SLA_ACK) return 1;
return 0;
break;
}
}/* i2c_start_wait */

ich hoffe ihr könnt mir da irgend wie weiter helfen... denn an einen aufbau fehler glaub ich nicht soo richtig denn das EEPROM war ist ja mit auf der Platine und ich musste das da nur reinstecken... aber wer weis ....

Ich hoffe ihr wisst rat !!

mfg
Gurax

@edit
weis jemand was mit avrfreaks.net (www.avrfreaks.net) los ist ?? sind die offline ??