Hallo,
bitte nicht gleich shitstormen, aber mir ist das noch nicht zu 100%
klar:
Wenn ich einen I2C-Bus mit einem Master und mehreren Slaves dran habe,
wo auch ein Pullup sitzt beim Master (auf Vcc) - wie muss das Kabel
zwischen den Slaves aussehen bzw. vom Master zum ersten Slave?
SDA - SCL - GND - VCC??? Muss Vcc mitgeführt werden über das Kabel?
Zur Info - die Slaves sind alle auf unterschiedlichen Platinen,
generieren alle ihre eigene 5V-Spannung über einen LDO. Diese LDOs
hängen jedoch am selben Netzteil.
Danke schonmal!
Marten
Dennis schrieb:> Vcc musst du nicht übergeben, da alle I2C-Teilnehmer nur Richtung GND> schalten (wired-and).
dem pullup sollte man VCC übergeben weil echtes I2C OC ist, wenn weder
auf der einen Seite der pullup vorhanden ist und kein VCC dann siehts
halt schlecht aus mit pullup!
Joachim B. schrieb:> ich tippe auf wired or>> egal wer den runter zieht, einer oder beide, das Ergebnis ist immer> unten also OR
Also müssen beide high sein, damit der Bus high ist -> Wired AND
Joachim B. schrieb:> ich tippe auf wired or
Wenn du dich da mal nicht täuscht - ist aber natürlich eine Frage der
Betrachtungsweise.
Nur wenn alle Teilnehmer ihren Ausgang auf High Z setzen, ist der Bus
auf High.
Sobald ein Teilnehmer seinen Ausgang auf Low legt, liegt der Bus auf
Low.
Je nach Zuordnung der Pegel zu TRUE oder FALSE, läuft es dann auf wired
OR oder wired AND hinaus.
Verstehe ich das richtig? Ihr beschäftigt euch mit den R vom Bus zu Vcc.
So wie ich das verstehe, hat jeder Slave sein eigenes Netzteil. Muss
nicht auf jeden Fall GND gleich sein? egal wo die Spannung herkommt?
Mario M. schrieb:> https://de.wikipedia.org/wiki/I%C2%B2C#Elektrische_Definition
auch Wiki soll nicht immer fehlerfrei sein.
Definieren wir doch mal,
2 Signale und stellen eine Wahrheitstabelle auf
0 & 0 = 0
0 & 1 = 1
1 & 0 = 1
1 & 1 = 1
das wäre für mich ein OR
0 & 0 = 0
0 & 1 = 0
1 & 0 = 0
1 & 1 = 1
das wäre für mich ein AND
Es werden immer die aktiven Zustände betrachtet, nur aktiv ist ja bei
I2C invertiert
my2ct schrieb:> Wenn du dich da mal nicht täuscht - ist aber natürlich eine Frage der> Betrachtungsweise.my2ct schrieb:> Sobald ein Teilnehmer seinen Ausgang auf Low legt, liegt der Bus auf> Low.
also OR, egal ob einer oder beide
also Ruhepegel = high
aktiver Pegel = low
und AND mit invertierten Eingängen wird OR
da war doch mal was:
https://de.wikipedia.org/wiki/Kommutativgesetz
man muss bei Wiki auch mal quer und mehr lesen!
Fremder schrieb:> Muss> nicht auf jeden Fall GND gleich sein? egal wo die Spannung herkommt?
ach und wenn auf beiden Seiten OC ist, wo kommt dann VCC her?
Die Signale heißen SDA und SCL, wo ist da was negiert.
Joachim B. schrieb:> auch Wiki soll nicht immer fehlerfrei sein.
Dann lies es beim Erfinder von I²C:
https://www.nxp.com/docs/en/user-guide/UM10204.pdf
"The output stages of devices connected to the bus must have an
open-drain or open-collector to perform the wired-AND function."
Joachim B. schrieb:> Dennis schrieb:>> Vcc musst du nicht übergeben, da alle I2C-Teilnehmer nur Richtung GND>> schalten (wired-and).>> dem pullup sollte man VCC übergeben weil echtes I2C OC ist, wenn weder> auf der einen Seite der pullup vorhanden ist und kein VCC dann siehts> halt schlecht aus mit pullup!
Ja der Pullup ist nur beim Master dran, auf sein Vcc. Damit willst du
sagen, dass der Vcc auf die anderen Slaves mitgegeben werden muss?
Vcc_master, Vcc_slave1. Vcc_slave2 = 5V, aber alle hängen an
Vcc_overall=9V. Der LDO isoliert ja nicht die 5V zu 9V, muss dann evtl.
vielleicht doch nicht die 5V mitgegeben werden?
Fremder schrieb:> hat jeder Slave sein eigenes Netzteil. Muss> nicht auf jeden Fall GND gleich sein? egal wo die Spannung herkommt?Marten schrieb:> Es liebt überall "der selbe" GND an, egal ob Master oder die Slaves.
denkt doch was ihr wollt, bei 2 Netzteilen muss es eben nicht überall
den selben GND geben!
Gestritten wird wo anders, macht euch die Welt wie sie EUCH gefällt!
Mario M. schrieb:> Dann lies es beim Erfinder von I²C:> https://www.nxp.com/docs/en/user-guide/UM10204.pdf
blabla, es gilt immer noch wie beim alten Funkverkehr "PTT push to talk"
Es kann nur einer Quatschen, der EINE ODER der Andere
wenn beide PTT quatschen kommt keine Kommunikation zustande, also
entweder oder, also wired OR, wenn beide quatschen AND klappts nicht.
Okay, einigen wir uns auf das folgende: Im offiziellen Standard wird
nichts invertiert, und bei Joachim zuhause ist alles andersherum und
dort gibt es wired OR. Vermutlich gibt es für Joachim auch spezielle
Datenblätter für jeden I2C-tauglichen IC, bei dem die Datentelegramme
invertiert sind.
ich weiss ja wer es schreibt!
von Walter T. (nicolas)
ein echter Fachmann, der darf es wired AND nennen und alles an der I2C
Kommunikation funktioniert bei dem nur wenn BEIDE quatschen also AND.
Ich nenne es weiterhin wired OR weil die Kommunikation nur funktioniert
wenn der Eine ODER der Andere quatscht, bzw. nichts klappt wenn beide
AND still sind.
Das Verständnis von positiver und negativer Logik sowie Kommutativgesetz
https://de.wikipedia.org/wiki/Kommutativgesetz
ist halt nicht jedem einsichtig.
Walter T. schrieb:> Ich habe gelernt
fein dann erkläre mir dein Gelerntes
Du meinst wired AND, also klappt I2C deiner meinung nach wenn beide
zugleich die Leitungen aktiv auf low ziehen, also AND, wenn nur einer
das macht gehts ja nicht wegen AND.
Dennis schrieb:> Lol, da schreibt man kurz die Antwort und dann kommt das hier raus :-)Dennis schrieb:> (wired-and)
wenn so ein Unfug kommt
egal wer low schaltet, EINER genügt kommt low raus also ODER und nicht
AND das alle low schalten müssen AND das low rauskommt!
Marten schrieb:> muss dann evtl.> vielleicht doch nicht die 5V mitgegeben werden?
Nein, wo willst du denn die 5V verbinden? Damit würdest du alle
beteiligten Spannungsquellen parallel schalten. Ich denke nicht, daß das
in deinem Sinne wäre.
Es ist (eigentlich) egal, wo die PullUp-Widerstände sitzen, solange der
Bus bei deaktivierten Ausgangsstufen der beteiligten I2C-Teilnehmer auf
high (also +5V) gezogen wird.
Du musst nur die Masse untereinander verbinden.
Zu dem ganzen OT-Gequatsche:
Beim I2C-Bus gilt: High = +5V
Also erst wenn alle Teilnehmer den Bus auf High (+5V) lassen, also high
ausgeben, ist auch der Bus high. Wenn nur einer der Teilnehmer ein low
(GND) ausgibt, ist der Bus low.
Dabei ist es vollkommen egal, ob ein High aktiv ausgegeben wird oder
sich durch einen offenen (nicht angesteuerten Transitor) selbst
einstellt.
Demzufolge ist der Bus ein wired and. Das heißt, erst wenn ALLE
Teilnehmer high ausgeben, ist auch der Ausgang (Bus) high.
Also hat NXP wohl doch Recht.
Frank B. schrieb:> Beim I2C-Bus gilt: High = +5V
nicht beim ESP32 oder anderen mit 3,3V VCC
Ich wüsste nun nicht wo bei I2C eine bestimmete Spannung vorgegeben
wird, es muss allen schmecken und bei gemischter Versorgung geht nur OC.
Frank B. schrieb:> Demzufolge ist der Bus ein wired and. Das heißt, erst wenn ALLE> Teilnehmer high ausgeben, ist auch der Ausgang (Bus) high.
sehe ich immer noch anders
high ist inaktiv und inaktiv ist keine Verknüpfung
am I2C ist aktiv low und nur damit gelten Verknüpfungen überhaupt!
Ist als wenn man in die Runde fragt hat einer Hunger und keiner meldet
sich und dann zufrieden feststellt, keiner hat Durst!
Das war aber nicht gefragt!
Die Antworten müssen schon zur Frage passen!
Bei PTT schrieb ich ja schon darf auch nur einer antworten also ODER,
bei Licht an muss die ganze Kette aktiv werden also AND
Dennis schrieb:> Lol, da schreibt man kurz die Antwort und dann kommt das hier raus :-)>> Hier haben aber einige auch zuviel Freizeit, oder?
Ja, das habe ich mir auch gedacht. Du hättest deine Klammer weglassen
sollen :-).
Da ist die erste Antwort ausreichend und es wird endlos off-topic weiter
diskutiert.
Wenn ich eine logische Verknüpfung brauche, kaufe ich kein 'low-aktives'
oder 'high-aktives' Gatter, sondern dasjenige, das meine gewünschte
Verknüpfung realisiert! Ich bin also verantwortlich, ob das AND oder OR
werden muss!
HildeK schrieb:> Ich bin also verantwortlich, ob das AND oder OR> werden muss!
und was ist sinnvoll bei I2C?
das beide aktiv zur selben Zeit die Leitungen belegen müssen?
Joachim B. schrieb:> und was ist sinnvoll bei I2C?>> das beide aktiv zur selben Zeit die Leitungen belegen müssen?
Mich interessiert dabei doch gar nicht, ob die Logik low- oder
high-aktiv ist. Deshalb AND! Wenn das keine wired-Verbindung sein
müsste, dann würde ich ein AND-Gatter einsetzen.
War früher schon so, z.B. bei der Dekodierung der Adress- und
Steuersignale von RAMs. Da kamen NORs zum Einsatz - soweit ich mich
erinnere ...
Invertierte Logik, weil:
Ruhezustand der beiden Leitungen = 1
Aktiv = 0
Und mit dem Namen hat das nichts zu tun, SDA muss nicht #SDA, /SDA oder
nSDA benannt werden...
mws schrieb:> Invertierte Logik, weil:>> Ruhezustand der beiden Leitungen = 1> Aktiv = 0
versuchte ich lange zu erklären, aber egal........
Durch die Invertierung ist es wired OR, es wird low wenn 1 oder mehr
aktiv low werden.
Joachim B. schrieb:> nicht beim ESP32 oder anderen mit 3,3V VCC> Ich wüsste nun nicht wo bei I2C eine bestimmete Spannung vorgegeben> wird
Nein, eine bestimmte Spannung ist nicht vorgegeben, man kann einen
I2C-Bus auch mit Devices aufbauen, die alle 1,8V Vcc haben.
Aber der TO arbeitet in diesem Fall mit 5V, weshalb ich mich auf diese
bezogen habe.
Joachim B. schrieb:> high ist inaktiv und inaktiv ist keine Verknüpfung> am I2C ist aktiv low und nur damit gelten Verknüpfungen überhaupt!
Ob aktiv oder inaktiv ist vollkommen egal. Solange eine 1 / ein high
durch (in diesem Fall!) 5V und eine 0 / ein low 0V oder GND ist, ist es
positive logik. Also ist es ein and, ganz egal welcher Zustand dominant
ist
Joachim B. schrieb:> Durch die Invertierung ist es wired OR, es wird low wenn 1 oder mehr> aktiv low werden.
Beim I2C ist aber nichts invertiert.
high = 1 = 5V
low = 0 = 0V
invertiert wäre es anders herum
Frank B. schrieb:> Also ist es ein and
nö
bei /Reset oder /IRQ wird es auch wired OR genannt, ich wüsste nun nicht
warum ausgerechnet hier andere Regeln gelten sollen!
aber jeder wie er will!
mws schrieb:> Invertierte Logik, weil:>> Ruhezustand der beiden Leitungen = 1> Aktiv = 0
dafür
Marten schrieb:> SDA - SCL - GND - VCC??? Muss Vcc mitgeführt werden über das Kabel?>> Zur Info - die Slaves sind alle auf unterschiedlichen Platinen,> generieren alle ihre eigene 5V-Spannung über einen LDO.
OK.
> Diese LDOs hängen jedoch am selben Netzteil.
Aha! Die Platinen werden also noch einmal extra vom zentralen Netzteil
versorgt. Dafür gibt es sicher Gründe die wir nicht kennen.
Ich nutze für die externen I2C - Busse: SDA # SCL # GND # +8V.
Auf jeder Slave - Platine sitzt ein 7805 und gut ist es.
mfg klaus
Marten schrieb:> Wenn ich einen I2C-Bus mit einem Master und mehreren Slaves dran habe,> wo auch ein Pullup sitzt beim Master (auf Vcc) - wie muss das Kabel> zwischen den Slaves aussehen bzw. vom Master zum ersten Slave?>> SDA - SCL - GND - VCC??? Muss Vcc mitgeführt werden über das Kabel?
Nein, muss es nicht. Wozu sollte es?
Nehmen wir mal an, auf Teilnehmer A und B sitzen Pull-Ups, auf C nicht.
Dann fließt (sobald C den Bus auf Low zieht) Strom von VCC-A durch den
Pull-Up, die SDA-Leitung, den OC-Transistor von Teilnehmer C und die
GND-Leitung zurück zu GND-A. Dazu brauchst du keine VCC-Verbindung.
MfG, Arno
Marten schrieb:>> Ja der Pullup ist nur beim Master dran, auf sein Vcc. Damit willst du> sagen, dass der Vcc auf die anderen Slaves mitgegeben werden muss?
Nein. Warum auch? Elektrisch reicht jeweils ein Pullup-Widerstand an
SCL und SDA. Und es ist in erster Näherung auch egal, wo am Bus der
sitzt. Wenn man nur einen Master hat, dann ist es sinnvoll, die beiden
Pullups auch am Master anzuschließen. Denn ohne den Master geht ja
sowieso nichts. Falls der Master vom Bus getrennt wird, dann ist es auch
egal ob die Pullups mit weg sind.
> Vcc_master, Vcc_slave1. Vcc_slave2 = 5V, aber alle hängen an> Vcc_overall=9V. Der LDO isoliert ja nicht die 5V zu 9V, muss dann evtl.> vielleicht doch nicht die 5V mitgegeben werden?
Aha. Du hast also eine gemeinsame Rohspannung für alle Baugruppen. Die
wirst du dann ja wohl auf dem Bus mitführen wollen, oder? Es gibt genau
gar keinen Grund, außerdem noch Vcc irgendeiner der Baugruppen (sei es
der Master oder ein Slave) auf dem Bus mit herumreichen zu wollen.
Selbst dann nicht, wenn man dem Bus mehrere Pullups spendieren wollen
würde.
Denn auch das ist erlaubt. I²C erlaubt eine recht große Spannweite für
den Pullup-Widerstand. Bei 5V dürfen es minimal 1.5kΩ sein, der
Maximalwert hängt von der Buskapazität (Leitungslänge) und
Geschwindigkeit ab. Bei 100kHz und den üblichen Leitungslängen von
einigen Dutzend Zentimetern ist man auch mit 10kΩ noch auf der sicheren
Seite. Man könnte sich z.B. auf 2kΩ festlegen.
Aber ob man nun 5x 10KΩ Pullups oder 1x 2KΩ Pullup verwendet, ist für
die Funktion egal. Bei Hispeed-Bussen kann es sinnvoll sein, an jedem
Ende der Leitung jeweils einen Pullup vorzusehen. Der wirkt dann wie
eine HF-Terminierung. Und wenn die 5V für die Pullups dann aus
verschiedenen 5V Netzteilen kommen, ist auch egal. Beim statischen
H-Pegel wird dann das Netzteil mit der höheren Spannung "gewinnen", aber
das ist erlaubt.
Joachim B. schrieb:> sehe ich anders, nicht die inaktiven Signale gelten sondern die aktiven> Signale, aktiv ist LOW und wenn es egal ist welcher LOW ist dann ist es> ODER
Hier kommt wieder die Dualität der invertierten Logik und der physischen
Inversion durch activ low zum Tragen, womit manche ihre Probleme zu
haben scheinen.
Hier ist es so, dass die invertierten Signale physikalisch verodert
sind, was indirekt aber zu einer Verundung in der Logik führt. Das
schlägt sich mithin auch in den Gleichungen nieder, denn:
(NOT A) AND (NOT B) ist equivalent zu NOT ( A OR B)
Um sich das zu vergegenwärtigen, lohnt ein Blick auf die
CMOS-Architektur. Dort hat man nämlich stets beides parallel aufgebaut:
1) einen "high side"-Pfad mit negierender Physik (p-Kanal) in
normalisierter Logik und
2) einen "low side"-Pfad mit nicht-negierende Physik (n-Kanal) in dazu
passend invertierter Logik
D.h. einmal sind die Transistoren in UND-Methodik verschaltet, also in
Serie, auf der anderen Seite sind sie in ODER-Methodik verdrahtet, also
parallel. Durch einmal die Inversion in Logik (Verschaltung) und einmal
in Physik (Ausgangspegel des Gates zum Eingangspegel) hebt sich das weg
und ist praktisch zweimal exakt die gleiche logische Schaltfunktion. Nur
physikalisch ist etwas anderen und sie ergänzen sich.
Bei pullups ist es im Grunde exakt das Gleiche, nur dass man sich bei
der Realisierung auf jeweils einen aktiven Pfad beschränkt.
Joachim B. schrieb:> Ich nenne es weiterhin wired OR weil die Kommunikation nur funktioniert> wenn der Eine ODER der Andere quatscht
Na dann müßtest es aber konsequenter Weise wired-XOR nennen. ;)
mIstA schrieb:> Na dann müßtest es aber konsequenter Weise wired-XOR nennen
ich muss ja nun mal gar nichts, aber egal, alle die es AND nennen haben
eh Logikprobleme, denn wenn beide AND schweigen also SCL SDA high würde
ich das nicht Kommunikation nennen!
Axel S. schrieb:> Aber ob man nun 5x 10KΩ Pullups oder 1x 2KΩ Pullup verwendet, ist für> die Funktion egal. Bei Hispeed-Bussen kann es sinnvoll sein, an jedem> Ende der Leitung jeweils einen Pullup vorzusehen. Der wirkt dann wie> eine HF-Terminierung. Und wenn die 5V für die Pullups dann aus> verschiedenen 5V Netzteilen kommen, ist auch egal.
Vorsicht. Wenn du auf mehreren Prints Pullups zu verschiedenen
Spannungen einbaust, dann überlege dir was passiert, wenn eine dieser
Spannungsversorgungen ausfällt. Wenn du da die Pullups nicht mit z.B.
Dioden entkoppelst, wird sich dieser Print über die Pullups versorgen
und deinen restlichen Bus stören.
In diesem Zusammenhang auch der Hinweis, I²C Bausteine dürfen auch ohne
Versorgung den Bus nicht stören. Früher Allgemeinwissen, aber als dann
andere Hersteller als Philips angefangen haben I²C Interfaces einzubauen
und "vergessen" haben die interne Schutzbeschaltung entsprechend
anzupassen, hat man das dann auch explizit in die Spec reingeschrieben.
Ich meine es war so bei FAST.