Forum: Mikrocontroller und Digitale Elektronik I2C Deadlock beim Senden - LTC6904


von Matthias (Gast)


Angehängte Dateien:

Lesenswert?

Hallo,

ich habe ein Problem mit einem I2C Slave von Linear..
Der als Master verwende ich einen ATMega16 und die lib von Peter Fleury.

via uart habe ich herausgefunden das das programm ab und zu in einer 
Zeile der I2C_write routine hängen bleibt, nachdem ich ein NACK vom 
Slave bekomme.
leider ist kein Muster erkennbar wann es passiert.

als Board dient die MICES2 µC Platine. Pullups hab ich nicht, dafür die 
"aktive Terminierung" aus der Bascom Hilfe(bild anbei)

in folgender Zeile hängts:
1
// wait until transmission completed
2
  while(!(TWCR & (1<<TWINT)));
Sieht für mich so aus als könnte er garnicht / nicht fertig senden.

Momentan reagiere ich nicht, wenn ich ein NACK erhalte. Hab schon 
versucht, nachdem ich ein NACK erhalten habe das senden abzubrechen und 
mit I2C_stop und dann wieder I2C_Start_wait neu anzufangen aber das 
klappt auch nicht 100% -> Probleme noch vorhanden!!

momentaner Stand ist, das ich den Bus nicht freigebe, da der Mega16 der 
einzige Master am Bus ist und bleibt. aber auch keine Besserung!

wäre toll wenn mir mal einer das Brett vorm Kopf entfernen könnte!

vielen Dank und Gruß

Matthias

von Detlef K. (adenin)


Lesenswert?

Wie hoch ist die Taktfrequenz auf deinem I2C-Bus?
Deine Terminierung sieht in der Simulation gut aus.

von Matthias (Gast)


Angehängte Dateien:

Lesenswert?

Hallo,

die Taktfrequenz ist beim Slave (LTC6904) 50kHz.(min 10Khz max 100khz)

Viele Grüße

Matthias

von Detlef K. (adenin)


Lesenswert?

Ja, ich hab das Datenblatt mir schon angeschaut.
Hast Du die Frequenz auch geprüft?
Ich seh nirgens, wo sie initalisiert wird. (oder ich habs übersehen)

von Matthias (Gast)


Angehängte Dateien:

Lesenswert?

Also die Initialisierung ist in der Library dabei die ich angehängt 
habe.
die Frequenz ist ein #define in der c datei..

Aufruf in der main:
1
int main (void)
2
{  
3
  init_uart(9600);
4
  PORTD|=(1<<PD2)|(1<<PD3);
5
  sei();
6
  i2c_init();<------
7
  DDRA=0xFF;
8
  TCCR2=(1<<CS21)|(1<<CS20);
9
  TIMSK=(1<<TOIE2);
10
  i2c_start_wait(LTC6904_ADDR1);

Die I2C_write1 habe ich nur zu testzwecken rauskopiert und mit den UART 
Sendebefehlen modifiziert!

Gruß

von Matthias (Gast)


Lesenswert?

@Mod: Vielen Dank fürs Verschieben!!

Hat es sinn bei dem empfangenen NACK die TWI schnittstelle komplett zu 
resetten (Alle Register auf 0 und dann wieder neu initialisieren?

Hab auch mit verschiedenen Taktraten gespielt, das Problem ist immer 
noch da.

von Detlef K. (adenin)


Lesenswert?

Im Code von dir hab ich nichts gefunden, Clock war da ca. 15kHz 
vorgegeben.
Hast Du mal mit 'nem Oszi verfolgt, was da passiert?
Wenn Du keinen hast, dann geht bei diesen geringen Taktraten auch die 
Soundkarte vom PC.
Wenn da nichts zu finden ist, solltest Du das I2C-Protokoll mal über 
Software machen.
Ein NACK mus ja einen Grund haben.

Nach NACK müsstest Du zumindest ein STOP machen.

Hmm, noch ein Tipp, ersetz mal die aktive Terminierung durch einfache 
PulUp-Widerstände, ich glaub nicht, dass die Terminierung als solche 
fehlerhaft ist, sondern eher der AVR ein Siliconbug hat. Ich vertraue 
Atmel (und auch ST) nicht, wenn es um TWI geht.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.