Forum: Mikrocontroller und Digitale Elektronik Teensy 4.0 I²C-Kommunikation


von Sebastian M. (ascii1992)



Lesenswert?

Hallo zusammen,

für mein aktuelles Projekt hantiere ich mit einem Teensy 4.0 uC und 
möchte diesen nutzen um via I²C mit einer Gegenstelle zu kommunizieren.

Die Pins des I²C-Ports habe ich mit einem 10R Widerstand versehen um die 
Flankensteilheit hinsichtlich EMV zu verbessern.
SDA und CLK-Leitung setze ich dann mit entsprechender Beschaltung auf 
ein Lichtwellensignal um (siehe Anhang).

Sowohl das direkt am Controller, elektrisch gemessene Signal, als auch 
das optische Signal haben den im Anhang beigefügten Verlauf.

Nun die Fragen:

-Warum wird sowohl das Daten, als auch das Clocksignal vom Controller 
invertiert ?
- Die erste Flanke des Datensignals sollte ja eigentlich zugleich mit 
der Flanke des Clocksignals erfolgen oder ? Wie kommt die Verschiebung 
zustande ? So würde das ja vermutlich nicht funktionieren oder ?

Ich freue mich über eure Ratschläge
Gruß

PS: Laut Beschreibung des Herstellers kann auf einen Pullupwiderstand 
verzichtet werden, da dieser intern verschaltet ist.

von Frank K. (fchk)


Lesenswert?

Sebastian M. schrieb:

> -Warum wird sowohl das Daten, als auch das Clocksignal vom Controller
> invertiert ?

Jeder Busteilnehmer kann SCL und SDA nur aktiv auf GND ziehen, nicht 
aber auf VCC. Auf VCC werden sie durch die Pullups gezogen. Der 
Ruhezustand (alle Teilnehmer nicht aktiv) ist also beidesmal high.

> - Die erste Flanke des Datensignals sollte ja eigentlich zugleich mit
> der Flanke des Clocksignals erfolgen oder ? Wie kommt die Verschiebung
> zustande ? So würde das ja vermutlich nicht funktionieren oder ?

Nein. Du willst im I2C-Standard die Punkte "Start Condition" und "Stop 
Condition" nachlesen:

https://www.nxp.com/docs/en/user-guide/UM10204.pdf

Das ist die Originaldokumentation von Philips/NXP. Die hast Du zu 
kennen, wenn Du mit I2C arbeitest.

fchk

von Stefan+ (Gast)


Lesenswert?

Hallo,

Sebastian M. schrieb:
> SDA und CLK-Leitung setze ich dann mit entsprechender Beschaltung auf
> ein Lichtwellensignal um (siehe Anhang).

Da hast du etwas gänzlich falsch verstanden.
Wie soll da der Slave mit "ACK" antworten können?
Wie soll da der Slave mit "Clock-stretching" reagieren können?

Gruß

von Pulldog (Gast)


Lesenswert?

Sebastian M. schrieb:
> PS: Laut Beschreibung des Herstellers kann auf einen Pullupwiderstand
> verzichtet werden, da dieser intern verschaltet ist.

Ich würde mich mal schlau machen wie hoch diese internen Pullups 
wirklich sind! ich hätte da maine Zweifel ! Ein guter Ausgangswert sind 
5KOhm, den muss man aber drausen dranhängen. Sollte deine 
Timingdarstellung vom Oszi stammen und nicht vom LA, dann würde ich 
vermuten dass du die Pin's vom Teensy falsch konfiguriert hast! 
Push-Pull anstatt Open-Drain

von Pulldog (Gast)


Lesenswert?

Sebastian M. schrieb:
> Die Pins des I²C-Ports habe ich mit einem 10R Widerstand versehen um die
> Flankensteilheit hinsichtlich EMV zu verbessern.

Das kannst du dir komplett ersparen.
Die Flankensteilheit wird einzig durch die Pullup's bestimmt (zuammen 
mit den Eingans-C's)

von Frank K. (fchk)


Lesenswert?

Sebastian M. schrieb:

> SDA und CLK-Leitung setze ich dann mit entsprechender Beschaltung auf
> ein Lichtwellensignal um (siehe Anhang).

Bei I2C sind normalerweise sowohl SCL als auch SDA bidirektional. Um 
daraus jeweils zwei unidirektionale Signale für Deine Glasfaser zu 
machen, brauchst Du das hier:

https://www.nxp.com/docs/en/data-sheet/PCA9600.pdf

Damit hast Du nacher 4 Fasern, jeweils zwei in jede Richtung.

fchk

von Sebastian (Gast)


Lesenswert?

Sebastian M. schrieb:
> -Warum wird sowohl das Daten, als auch das Clocksignal vom Controller
> invertiert ?
> - Die erste Flanke des Datensignals sollte ja eigentlich zugleich mit
> der Flanke des Clocksignals erfolgen oder ? Wie kommt die Verschiebung
> zustande ? So würde das ja vermutlich nicht funktionieren oder ?

Sieht alles so aus wie es soll. Siehe 
https://de.wikipedia.org/wiki/I%C2%B2C#/media/Datei:I2C_data_transfer.svg.

Sebastian M. schrieb:
> PS: Laut Beschreibung des Herstellers kann auf einen Pullupwiderstand
> verzichtet werden, da dieser intern verschaltet ist.

Welcher Hersteller? Der Teensy 4.0 von PJRC hat diese Pullup/Widerstände 
nicht, siehe https://www.pjrc.com/teensy/schematic.html.

Sebastian M. schrieb:
> SDA und CLK-Leitung setze ich dann mit entsprechender Beschaltung auf
> ein Lichtwellensignal um (siehe Anhang).

Wie Stefan+ oben schon geschrieben hat ist I2C eine *BI*-direktionale 
Kommunikation, bei der die vom Master angesprochenen Geräte den 
Nachrichtenerhalt dem Master quittieren (ACK). Das leistet deine 
Beschaltung nicht.

LG, Sebastian

von Sebastian M. (ascii1992)


Lesenswert?

Verwendet habe ich diese Quelle:
https://www.pjrc.com/teensy/td_libs_Wire.html

Laut deren Aussage kann auf den Pullupwiderstand bei kurzer 
Leitungslänge verzichtete werden. Wie Sebastian ja auch bestätigt stimmt 
mein aufgenommenes Signal ja mit dem I²C-Standard von NXP (danke Frank) 
überein und scheint sinnhaft zu sein.

Okay, danke für den Tipp. Da ich eh nur Messwerte von dem abgebildeten 
Controller an eine Gegenstelle schicke, ist das erstmal egal. Für 
zukünftige Projekte werde ich das aber auf jeden Fall berücksichtigen.

von Frank K. (fchk)


Lesenswert?

Sebastian M. schrieb:

> Okay, danke für den Tipp. Da ich eh nur Messwerte von dem abgebildeten
> Controller an eine Gegenstelle schicke, ist das erstmal egal. Für
> zukünftige Projekte werde ich das aber auf jeden Fall berücksichtigen.

Du zeigst mit diesem Satz, dass Du den I2C-Standard nicht verstanden 
hast. Eine I2C-Verbindung ist unabhängig von der konkreten Datenrichtung 
IMMER und GRUNDSÄTZLICH bidiraktional. Du sendest 8 Datenbits und 
emfängst ein Bestätigungsbit. Wenn Deine Verbindung nicht bidirektional 
funktioniert, wirst Du das Bestätigungsbit niemals bekommen, und Deine 
Verbindung wird nicht funktionieren.

Also liest verdammt nochmal den Standard. Wenn Du den gelesen und 
verstanden hast und dann noch Fragen sind, dann darfst Du Dich hier 
wieder melden.

fchk

von Wilhelm Busch (Gast)


Lesenswert?

Frank K. schrieb:
> Du zeigst mit diesem Satz, dass Du den I2C-Standard nicht verstanden
> hast.

Beratungsresistenz ist eine Zier, doch weiter kommt man ohne ihr.

von Sebastian (Gast)


Lesenswert?

Sebastian M. schrieb:
> Laut deren Aussage kann auf den Pullupwiderstand bei kurzer
> Leitungslänge verzichtete werden. Wie Sebastian ja auch bestätigt stimmt
> mein aufgenommenes Signal ja mit dem I²C-Standard von NXP (danke Frank)
> überein und scheint sinnhaft zu sein.

Die Arduino Wire-Bibliothek aktiviert die uC-internen 
Pullup-Widerstände, dass kann bei kleinem Kapazitätsbelag funktionieren.

Sebastian M. schrieb:
> Okay, danke für den Tipp. Da ich eh nur Messwerte von dem abgebildeten
> Controller an eine Gegenstelle schicke, ist das erstmal egal.

Dazu musst du allerdings höchstwahrscheinlich die Wire-Bibliothek 
anpassen. So aus dem Regal wird die Bibliothek wohl den Sendevorgang im 
Anschluss an das Senden der 8 Daten- oder Addressbits durch den Master 
bei fehlendem ACK vom Slave abbrechen. Das sollte auch auf dem 
Oszilloskop so zu sehen sein ...

LG, Sebastian

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.