I2C Bus mit ATMEL USI

OP #3171000
Lesenswert?

Hallo Zusammen

Ich eröffne mal einen neuen Beitrag, da es im alten langsam ein 
Durcheinander gegeben hat, man weis gar nicht mehr genau, was überhaupt 
das Problem ist.

Also hier:

Ich bin dabei eine Verbindung mit einem I2C bus zwischen einem Attin45 
(Master) und einem Attiny85 (Slave) aufzubauen. Der Master macht die I2C 
Schnittstelle per Software. Beim Slave verwende ich das USI mit START 
und OVF Interrupt. Der Master_write_mode funktioniert, ich kann mehrere 
bytes zum Slave übertragen. Nun habe ich Probleme beim Master_read_mode. 
Slaveadresse kommt beim Slave an, und jetzt sollte der Slave ein byte 
zurück an den Master senden, geht aber irgendwie nicht. Ich weiss nicht 
genau, ob ich das DDRB Register richtig setzte, habe da schon mehrere 
Varianten versucht.

Ich probiere nun seit Tagen, aber ich sehe vor lauter Bäume den Wald 
nicht mehr
Wahrscheinlich ist es nur eine kleine Sache...
Angehängte Dateien:
OP #3179002
Lesenswert?

Mit dem bisherigen Code des Slaves, wurde das ACK nach dem empfangen der 
Adresse, nicht an Master gesendet.

Theoretisch sollte der Ablauf des Slaves doch so sein:
-START ISR, Counter auf 0 setzten
-wenn Counteroverflow, dann wurde die Adresse empfangen, nun ACK senden 
-> SDA auf Output, Counter = 14

wenn ich SDA auf Output setzte, geht SDA auf low, verlasse ich nun die 
OVF-ISR, geht SDA sofort wieder auf high. Ich kann also nicht einmal ein 
ACK vom Slave zum Master senden.

Im Datenblatt steht:
When the output driver is enabled for the SDA pin it will force the line 
SDA low if the output of the USI Data Register or the corresponding bit 
in the PORTB register is zero. Otherwise, the SDA line will not be 
driven (i.e., it is released).


Warum geht den SDA beim verlassen der ISR sofort wieder auf high ?
Angehängte Dateien:

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren