Forum: Mikrocontroller und Digitale Elektronik I²C Verständnisfrage


von Dani (Gast)


Lesenswert?

Hallo

Ich hätte da mal eine Verständnisfrage zu I²C. Nach dem die 
Startbedingung gesendet wurde, sende ich den TW_WRITE, damit ich den 
Slave überhaupt adressieren bzw beschreiben kann und überprüfe den 
TW_MT_SLA_ACK. Danach schicke ich die Slaveadresse über TWDR und 
überprüfe anhand DATA_ACK wieder ob die Adresse/ der Slave vorhanden 
ist.
Anschließend schicke ich über (laut DB) --> TWDR = DATA;
TWCR = (1<<TWINT)|(1<<TWEN); mein Datenpacket und danach die 
Stopbedingung.

Nun die Frage ist, laut Beschreibung von Microkontroller.net muss TWCR 
bei Datenpacketübermittlung --> TWDR=DATA; TWCR = 
(1<<TWINT)|(1<<TWSTA)|(1<<TWEN); ist das richtig?

2. Woher weißt der Slave, dass TWDR am Anfang die Startadresse schickt 
und anschließend die Datenpackete?

Ich habe einiges durchgelesen und hoffentlich auch richtig verstanden
(dank Mikrocontroller.net).

Danke.

von Karl H. (kbuchegg)


Lesenswert?

> Nach dem die Startbedingung gesendet wurde, sende ich den TW_WRITE,
> damit ich den Slave überhaupt adressieren bzw beschreiben kann und
> überprüfe den TW_MT_SLA_ACK. Danach schicke ich die Slaveadresse
> über TWDR und überprüfe anhand DATA_ACK wieder ob die Adresse/ der
> Slave vorhanden ist.

Vielleicht meinst du auch das richtige, aber ich lese da etwas falsches 
raus.

Die Übertragung der Adresse und dem Modus-Bit (Read oder Write) ist 1 
Übertragung! Adresse und Bit werden gemeinsam in 1 Byte übertragen.

Bei dir klingt das so, als ob das 2 Übertragungen wären.

von Karl H. (kbuchegg)


Lesenswert?

Dani schrieb:

> Nun die Frage ist, laut Beschreibung von Microkontroller.net muss TWCR
> bei Datenpacketübermittlung --> TWDR=DATA; TWCR =
> (1<<TWINT)|(1<<TWSTA)|(1<<TWEN); ist das richtig?

Was sagt denn das Datenblatt des µC? Im Zweifel ist das immer die letzte 
unangreifbare Autorität in Entscheidungsfragen.

> 2. Woher weißt der Slave, dass TWDR am Anfang die Startadresse schickt
> und anschließend die Datenpackete?

Weil das im I2C Datenverkehr so festgelegt wurde.
Nach der Startbedingung ist das erste darauf folgende Byte die Slave 
Adresse (und der Wunsch des Masters zu schreiben oder zu lesen)

von Dani (Gast)


Lesenswert?

Alles klar. Verstanden.

Im DB steht ohne Startbit.

Danke nochmals.

von Dani (Gast)


Lesenswert?

Ich habe die Adresse und Schreibbit so formuliert:

  TWDR = (address) | (TW_WRITE);
  TWCR = ((1<<TWINT)|(1<<TWEN));
  while(!(TWCR & (1<<TWINT)));

von Florian (Gast)


Lesenswert?

Hi Dani,

ich hatte mich vor ein paar Monaten auf dem Mega88 damit rumgeschlagen, 
könnte dir wenn du willst die Funktionen zur Verfügung stellen. War für 
einen 3-Achs G-Sensor.

von Dani (Gast)


Lesenswert?

Hi Florian,

Das wäre super nett.

Danke

von Karl H. (kbuchegg)


Angehängte Dateien:

Lesenswert?

Ich weiss ja nicht, welchen konkreten µC du benutzt.
Aber im Datenblatt vom Mega16 ist zum Beispiel im Abschnitt über den TWI 
ein komplettes kommentiertes Codebeispiel enthalten.
(siehe Bild)
Was daran ist jetzt unklar?

Das man dieses Beispiel noch sinnvoll in Einzelfunktionen aufgliedern 
muss, ist schon klar. Aber zumindest zeigt es den kompletten Ablauf, vom 
Beginn mit dem Erzeugen der Start-Condition bis zum Ende mit dem 
Erzeugen der Stop-Condition. Alles da, was man braucht.

: Bearbeitet durch User
von Dani (Gast)


Lesenswert?

Hallo Karl Heinz,

das ist richtig, ich habe es mir auch angeschaut (Atmega168) und mit 
Progbeispiel bzw Programmanleitung von Mikrocontroller.net verglichen. 
Daher kam dann die Frage, was nun richtig ist.

Ich wollte eigentlich nur die oben genannte offene Fragen klären.

Danke für deine Antwort.

von Florian (Gast)


Lesenswert?

Hi Dani,

ich habe es eben erst gelesen. Werde es heute Abend in den Beitrag 
stellen.

von Dani (Gast)


Lesenswert?

Danke

von Florian (Gast)


Angehängte Dateien:

Lesenswert?

Hi Dani,

jetzt komm ich endlich dazu...
Das ganze war wie gesagt für einen ATMEGA88. Angesprochen wurde ein 
MMA8453Q 3-Achs G-Sensor.

von Dani (Gast)


Lesenswert?

Vielen Dank Florian.

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.