I2C Lesen mit takt woher?

OP #6869708
Lesenswert?

Hallo
habe mich gerade mit SPI rumgeschlagen, und hab jetzt ein Bauteil (RTC) 
mit I2C-Anschluss. Die Frage, die mich gerade beschäftigt, ist, wie lese 
ich als Master von einem Client? ich schicke die Adresse und danach den 
Lesebefehl, aber muss ich dann wie bei SPI auch ein Dummy-Byte schicken, 
damit der takt erzeugt wird, oder wie funktioniert das? Ist mir nicht 
klar. Hab schon mit I2C gearbeitet (DAC), aber da nur Daten gesendet und 
nicht gelesen...

Danke und Gruß
#6869718
Lesenswert?

Franko P. schrieb:
> aber muss ich dann wie bei SPI auch ein Dummy-Byte schicken,
> damit der takt erzeugt wird,

Nein. Da Du nicht gleichzeitig lesen und schreiben kannst, darfst Du 
genau das nicht.

Franko P. schrieb:
> oder wie funktioniert das?

Tu Dir einen Gefallen: Das "I2C Manual" von Philipps (AN10216-01) ist 
der Goldstandard und auch noch gut geschrieben. Gönn Dir den Inhalt!
#6869776
Lesenswert?

Stefan ⛄ F. schrieb:
> Franko P. schrieb:
>> gerade das wollte ich mir sparen, ihr Spielverderber!
>
> Schlechte Idee. I²C ist so "speziell" dass man um das lesen der Spec
> nicht umhin kommt. Also lies UM10204.

Zumal unnötig. Das User Manual ist so gut geschrieben, dass man es als 
Vorzeige-Muster für gute Whitepapers nutzen könnte.

Vorn ein wenig Werbung, um die Marketing-Abteilung zufriedenzustellen, 
aber dann kommt eine mustergültige Doku.
#6869792
Lesenswert?

Franko P. schrieb:
> ich schicke die Adresse und danach den
> Lesebefehl, aber muss ich dann wie bei SPI auch ein Dummy-Byte schicken,
> damit der takt erzeugt wird, oder wie funktioniert das?

Nix mit Dummy-Byte. Den Takt muss der Master vorgeben auf SCL. Die 
Taktrate ist egal, solange sie nicht zu hoch ist. Mit der steigenden 
Flanke (loslassen auf Pullup) werden die Daten gelesen, beim Schreiben 
vom Slave, beim Lesen vom Master.
Gast #6869802
Lesenswert?

Christoph db1uq K. schrieb:
> von 2014 - gab es da noch keinen Mischbetrieb 3,3V/5V?

Das Dokument noch viel älter. 2014 war nur das letzte Update.

Gemischter Betrieb wird an mehreren Stellen beschrieben, z.B. in Kapitel 
3.1.1 Fig. 3.

https://www.pololu.com/file/0J435/UM10204.pdf

> irgendwo hatte Philips auch noch die MOSFET-Schaltung
> für die Pegelumsetzung

Ja, in eben diesem UM10204 Dokument, Fig. 36 !

Schläfst du noch?
#6869839
Lesenswert?

Hallo zusammen.

Alle wichtigen Dokumente sind erwähnt, angeführt, aufgelistet. Das 
grundlegende Protokoll sollte man schon verstanden haben.
Ansonsten ist das nicht sonderlich aufregend. Schon vor mehr als 20 
Jahren mit Bit Banging -> LPT programmieren unter WIN98 (Turbo Pascal 3 
oder was auch immer) und ab auf das Testboard. Problemlos.

73
Wilhelm
Gast #6869853
Lesenswert?

Stefan ⛄ F. schrieb:
>> irgendwo hatte Philips auch noch die MOSFET-Schaltung
>> für die Pegelumsetzung
>
> Ja, in eben diesem UM10204 Dokument, Fig. 36 !
>
> Schläfst du noch?

Das Bild und der zugehörige Text behandelt ein anderes Thema...
Gemeint war sicherlich: AN10441.pdf


Vergleiche die Schaltungen, nachdem du ausgeschlafen hast.
Gast #6870099
Lesenswert?

Franko P. schrieb:
> habe mich gerade mit SPI rumgeschlagen, und hab jetzt ein Bauteil (RTC)
> mit I2C-Anschluss. Die Frage, die mich gerade beschäftigt, ist, wie lese
> ich als Master von einem Client? ich schicke die Adresse und danach den
> Lesebefehl,...

Nö.
Beim I2C adressiert man den Slave und legt zugleich die Transferrichtung 
fest. Es gibt da keinen Lesebefehl, wenn der Slave sowas nicht für seine 
internen Zwecke braucht. Bei sowas wie seriellen EEPROM's usw. ist es 
eigentlich immer nur ein vorheriges Setzen des Schreib- bzw. 
Lesezeigers. Im Grunde besteht jeder Transfer aus 3 Stufen:
1. Slave adressieren und Datenrichtung festlegen
2. Daten transferieren
3. End-Condition, d.h. Verbindung zum Slave wieder lösen

Eigentlich ganz easy. Was da oftmals Probleme macht, sind die zumeist 
kruden Implementationen des I2C-Peripherie-Cores im µC. Manche sind 
strunzdumm und wälzen alle Logik auf einen Sack voll Interrupts ab und 
manche sind super-schlau, wollen alles ganz allein machen und nerven den 
Programmierer damit, daß sie zuvor die genaue Anzahl von zu 
transferierenden Bytes wissen wollen, bevor sie irgend etwas machen.

Nach meiner Einschätzung gibt es unter den I2C-Cores nur ganz wenige, 
die wirklich gut sind. Also bereite dich mal auf Plan B vor, das heißt, 
das ganze Datengefummel per Software selbst zu machen. Das ist oftmals 
sogar einfacher und kürzer als das Benutzen eines widerspenstigen 
I2C-Cores.

W.S.
OP #6870143
Lesenswert?

Da hast vielleicht Recht. Nur die uC sind ja nicht alle gleich. Bei der 
beschreibung von der SPI-Schnittstelle steht da z.B.. dass due zum 
Empfangen ein dummy-byte schicken musst. Nur im Datenblatt von dem 
PIC18F16Q41 steht bei I2C nix dazu, so als wäre eh klar. Auch in dem 
Datenblatt von dem PIC16F18877, mit dem früher mal gearbeitet habe, auch 
mit I2C, steht da nix. Nur habe da nur einen DAC betrieben und der Takt 
kam da eben, hab nicht gross darüber nachgedacht. Wenn ich jetzt aber 
einen Lesebefehl mache, bei dem PIC18F16Q41 lesen ich ja nur das 
EIngangsregister aus, löse aber keinen Lesetakt aus. Das erscheint mir 
da noch unklar. Also ich denke eher, dass das Geheimnis in der 
beschreibung der I2C-register liegt, aber da habe ich noch gefunden... 
Aber wird schon noch werden. hokus-pokus...usw

Gruß

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