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.
> 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.
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)
Ich habe die Adresse und Schreibbit so formuliert: TWDR = (address) | (TW_WRITE); TWCR = ((1<<TWINT)|(1<<TWEN)); while(!(TWCR & (1<<TWINT)));
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.
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
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.
Hi Dani, ich habe es eben erst gelesen. Werde es heute Abend in den Beitrag stellen.
Hi Dani, jetzt komm ich endlich dazu... Das ganze war wie gesagt für einen ATMEGA88. Angesprochen wurde ein MMA8453Q 3-Achs G-Sensor.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.