Forum: Mikrocontroller und Digitale Elektronik I2C Takt merkwürdig, keine Kommunikation möglich


von Marco D. (Gast)


Angehängte Dateien:

Lesenswert?

Servus Leute,

ich versuche mich gerade das erste mal in der Kommunikation mittels 
I2C-Schnittstelle zwischen meinem uC Board und einer Platine die mir im 
Rahmen einer HiWi-Arbeit zur Verfügung gestellt wurde. Die Platine ist 
nichts spektakuläres, da sind hauptsächlich ein paar LED-Treiber drauf 
sowie ein Temperatursensor mit I2C-Schnittstelle den ich auslesen 
möchte. Ich verwende ein STM32F302R8 Board.

Ich habe mittels CubeMX eine SPI-Schnittstelle konfiguriert und dann 
mittels  HAL_I2C_Master_Transmit(...) ein Signal an den Sensor gesendet. 
Da sich nichts getan hat, habe ich die Transmit-Funktion in die 
while(1)-Schleife gepackt und SCL und SCA auf einem Oszi ausgeben 
lassen. Ich bekomme ein sehr merkwürdiges SCL Signal welches ich auch 
nicht triggern kann. Im Anhang ein Single Bild. Die Tastköpfe sind 
abgeglichen.

Hat jemand eine Idee warum das Signal so verzerrt ist ?

von A-Freak (Gast)


Lesenswert?

Da ist wohl entweder der Pullup-Widerstand oder die parasitäre Kapazität 
(lange Leitungen) zu groß, oder der Takt zu schnell.

von stm32 (Gast)


Lesenswert?

Zeig doch mal deinen Schaltplan. Deine Pullup Widerstände scheinen 
falsch gewählt zu sein. Welchen Wert hast du gewählt und warum?

von Christian S. (roehrenvorheizer)


Lesenswert?

Hallo,

vielleicht müßte eine kleinerer Pullup-Widerstand angeschlossen sein 
oder die Frequenz vermindert werden. Dann sieht man auch das ACK.
Wobei hier SCL abgebildet sein dürfte.

MfG

von Marco D. (Gast)


Lesenswert?

Ich hab keine Pullups dazugeschaltet, ich hänge die Leitungen direkt ans 
Oszi. Ich dachte der uC schaltet die intern dazu.

von HildeK (Gast)


Lesenswert?

Marco D. schrieb:
> Hat jemand eine Idee warum das Signal so verzerrt ist ?

Es ist nicht verzerrt.
Bei I2C wird die steigende Flanke über den Pullup gemacht, die fallende 
wird aktiv nach unten gezogen. Dann sieht das im Prinzip immer so aus, 
warum so deutlich, wurde genannt.
Höher als 5k-10k (bei 5V-Systemen) bzw. 3k3-5k bei 3.3V-Systemen würde 
ich mit dem Widerstand nicht gehen.

von Chris K. (Gast)


Lesenswert?

Marco D. schrieb:
> Ich dachte der uC schaltet die intern dazu.

Glauben ist nicht Wissen

von Wolfgang (Gast)


Lesenswert?

Marco D. schrieb:
> Ich habe mittels CubeMX eine SPI-Schnittstelle konfiguriert und dann
> mittels  HAL_I2C_Master_Transmit(...) ein Signal an den Sensor gesendet.

SPI ist nicht I2C

von stm32 (Gast)


Lesenswert?

Wolfgang schrieb:
> Marco D. schrieb:
>> Ich habe mittels CubeMX eine SPI-Schnittstelle konfiguriert und dann
>> mittels  HAL_I2C_Master_Transmit(...) ein Signal an den Sensor gesendet.
>
> SPI ist nicht I2C

Guter Punkt. Habe ich völlig überlesen.

von Ingo L. (corrtexx)


Lesenswert?

Marco D. schrieb:
> Ich dachte der uC schaltet die intern dazu.
Er hat interne Pull-ups, die sind aber für I2C viel zu hochohmig

von Johannes S. (Gast)


Lesenswert?

Oder besser richtige Open Drain ohne PullUp, aber die hat der STM soweit 
ich weiß nicht.
Das Oszi hat auch einen USB Anschluss, über einen Memorystick bekommt 
man schönere Hardcopies vom Bildschirm.

von Christian M. (Gast)


Lesenswert?

Ein Bus sollte eh auf beiden Seiten abgeschlossen werden!

Das gälte auch für Z80 u.ä. Systeme!

Gruss Chregu

von Mad (Gast)


Lesenswert?

Marco D. schrieb:
> Ich bekomme ein sehr merkwürdiges SCL Signal welches ich auch
> nicht triggern kann.

Auf fallende Flanke triggern und das Trigger-Level mal in die Mitte von 
VCC schieben, dann wirds auch was mit dem Trigger....

von Stefan F. (Gast)


Lesenswert?

Christian M. schrieb:
> Ein Bus sollte eh auf beiden Seiten abgeschlossen werden!
> Das gälte auch für Z80 u.ä. Systeme!

Verwechselst du da nicht was?

Z80 ist doch kein Bus.
Und zwei Enden zum Abschließen hat man z.B. bei 10-Base-2, Can, RS-485, 
ISDN, aber sicher nicht bei I²C.

von TrollJäger (Gast)


Lesenswert?

Christian M. schrieb:
> Ein Bus sollte eh auf beiden Seiten abgeschlossen werden!
>
> Das gälte auch für Z80 u.ä. Systeme!
>
> Gruss Chregu

I2C beidseitig abschließen? Nicht dein Ernst (zumindest nicht bis 
400kHz, und darum geht es hier).

Wired-AND bzw. Funktionsweise I2C-Bus ist aber schon ein Begiff, oder?

von Christoph db1uq K. (christoph_kessler)


Lesenswert?

Wobei das Wired-OR zu Zeiten reiner 5V-Logik noch kein Problem war.
Ich möchte einen GPIB-Bus (der arbeitet nur mit wired-OR) am Raspberry 
PI betreiben, der eigentlich nur 3,3V mag. Also sollten da Treiber 
dazwischen, die noch nebenbei die Pegelwandlung übernehmen. Bei GPIB 
sind Widerstände auf beiden Seiten üblich, aber da geht es auch um 
TTL-Signale über mehrere Meter Entfernung mit entsprechenden 
Leitungskapazitäten.
Das Oszillogramm zeigt klar einen zu hochohmigen Pullupwiderstand. 
Irgendwo muss aber einer sein, der Tastkopf gibt jedenfalls keine 
Spannung ab.

: Bearbeitet durch User
von Fred R. (fredylich)


Lesenswert?

TrollJäger schrieb:
> I2C beidseitig abschließen? Nicht dein Ernst (zumindest nicht bis
> 400kHz, und darum geht es hier).

Warum nicht gibt es da einen Nachteil wenn ich sage mal ab 1Meter 
Leitung und 5Volt auf beide Seiten je 10kOhm anschließe?

von Mad (Gast)


Lesenswert?

Christoph db1uq K. schrieb:
> Das Oszillogramm zeigt klar einen zu hochohmigen Pullupwiderstand.
> Irgendwo muss aber einer sein, der Tastkopf gibt jedenfalls keine
> Spannung ab.

Garnix klar.

I2C lässt im Standard-Mode 1µs Rise-Time zu. Mehr als den Verdacht, dass 
diese Anforderung gerade so erfüllt bzw. nicht erfüllt ist, lässt dieses 
Bild garnicht zu.

Ich behaupte die Probleme kommen nicht von einem zu hohen Pull-Up.

von TrollJäger (Gast)


Lesenswert?

Fred R. schrieb:
> TrollJäger schrieb:
>> I2C beidseitig abschließen? Nicht dein Ernst (zumindest nicht bis
>> 400kHz, und darum geht es hier).
>
> Warum nicht gibt es da einen Nachteil wenn ich sage mal ab 1Meter
> Leitung und 5Volt auf beide Seiten je 10kOhm anschließe?

Das ist in etwa so sinnvoll, wie pro Platine 500 0R-Widerstände 
aufzulöten... machbar aber bescheuert. Aber manche stehen halt auf 
sowas.

von Fred R. (fredylich)


Lesenswert?

TrollJäger schrieb:
>>> I2C beidseitig abschließen? Nicht dein Ernst (zumindest nicht bis
>>> 400kHz, und darum geht es hier).
>>
>> Warum nicht gibt es da einen Nachteil wenn ich sage mal ab 1Meter
>> Leitung und 5Volt auf beide Seiten je 10kOhm anschließe?
>
> Das ist in etwa so sinnvoll, wie pro Platine 500 0R-Widerstände
> aufzulöten... machbar aber bescheuert. Aber manche stehen halt auf
> sowas.

Alles klar direkt an den Pins den Pegel auf H ziehen ist bescheuert.
Wieder was gelernt. Danke

von HildeK (Gast)



Lesenswert?

Fred R. schrieb:
> Alles klar direkt an den Pins den Pegel auf H ziehen ist bescheuert.

Bescheuert ist das nicht.
Die LH-Flanke durch den Pullup im I2C-Signal ist relativ uninteressant, 
bis auf die Rise-Time (<1µs im Standard-Mode). Wo auch immer der PU 
sitzt, ist egal, Hauptsache sein Wert ist für die Anwendung, 
Spezifikation der Teilnehmer und die Geschwindigkeitsklasse richtig. 
Siehe I2C-Spezifikation, die im Netz zu finden ist.
Im Anhang ein Auszug über den Wert des PU (Rp). [Rs ist ein optionaler 
Serienwiderstand an den Pins].

Ich würde ihn auf jeden Fall nahe an einem der beteiligten ICs setzen, 
denn dort habe ich sowieso VCC zur Verfügung anstatt irgendwo, wo ich 
mir noch 'ne extra Leitung für VCC hinlegen muss.

von Boris O. (bohnsorg) Benutzerseite


Lesenswert?

Leicht off-topic: Ein RTB2004 mit USB-Schnittstelle und ohne 
Screenshot-Funktion? Oder hat der Internet-Zugangspunkt keine 
USB-Schnittstelle?

von Roland F. (rhf)


Lesenswert?

Hallo,

Boris O. schrieb:
> Leicht off-topic: Ein RTB2004 mit USB-Schnittstelle und ohne
> Screenshot-Funktion? Oder hat der Internet-Zugangspunkt keine
> USB-Schnittstelle?

Bei R&S braucht man für ein Bildschirmfoto kein USB, da reicht ein 
Netzwerkkabel und ein Internet-Browser.

rhf

von TrollJäger (Gast)


Lesenswert?

HildeK schrieb:
> dort habe ich sowieso VCC zur Verfügung anstatt irgendwo, wo ich
> mir noch 'ne extra Leitung für VCC hinlegen muss.

Wo benötigt man I2C auf der Platine aber keine Versorgung? (Mir bisher 
in 20 Jahren nicht begegnet) Der Bus geht zu einem IC hin, der dann auch 
üblicherweise mit Vcc versorgt werden muss...

Fred R. schrieb:
> Alles klar direkt an den Pins den Pegel auf H ziehen ist bescheuert.

Da bringst du was durcheinander... Hast grad deine Tage? Scheinst ja im 
"Wörter nach eigenem Gusto umdrehen" gerade den Weltrekord zu brechen 
:-)

Wie auch immer, nochmal - nur diesmal langsamer und detaillierter für 
die Langsameren unter uns: Du kannst auch 500 Widerstände nehmen, und 
diese alle 2mm an die Leitungen hängen, solange der Gesamtwiderstand 
(und Kapazität) im Rahmen bleibt. Ob das sinnvoll ist und eines 
Ingenieurs würdig, das mus jedes einzele Individuum für sich selber 
beantworten...

Zum Thema Dimensionierung:

http://www.ti.com/lit/an/slva689/slva689.pdf

von Roland F. (rhf)


Lesenswert?

Hallo,

TrollJäger schrieb:
> Zum Thema Dimensionierung:
>
> http://www.ti.com/lit/an/slva689/slva689.pdf

Sehr interessant, aber wäre es da nicht einfacher sich mit einem 
Oszilloskop die Signale anzusehen und dann einfach den richtigen 
Widerstand per probieren auszuwählen? Das ist zwar dann nicht das reine 
Vorgehen eines Ingenieurs, eliminiert aber vielleicht einige 
Einflussfaktoren die bei einer reinen Rechnung nicht sofort ersichtlich 
sind.

rhf

von HildeK (Gast)


Lesenswert?

TrollJäger schrieb:
> Wo benötigt man I2C auf der Platine aber keine Versorgung?

Das meinte ich nicht. Sondern irgendwo im 'freien Platinenfeld' muss 
nicht immer VCC auch geführt sein, am IC schon.

von Fred R. (fredylich)


Lesenswert?

TrollJäger schrieb:
> Ob das sinnvoll ist und eines
> Ingenieurs würdig, das mus jedes einzele Individuum für sich selber
> beantworten...

Hatte mich doch bedankt.
Nicht jedes Individuum ist ein würdiger Ingenieurs wie Du.
Bin nur Techniker also der Langsamere.

von Klaus (Gast)


Lesenswert?

Roland F. schrieb:
> dann einfach den richtigen Widerstand per probieren auszuwählen?

Kann man machen, wird aber nichts bringen. Die gezeigten Signale sind 
ok, tausend mal gemacht. Kann man aber auch hier im Forum nachlesen. In 
jedem I2C Thread kommt das so:

>> Mach mal die Pullups kleiner!
> hat nichts gebracht

Meist kommt dann noch:

>> Da fehlt der Abblockkondensator!
> hab ich eingelötet, geht trotzdem nicht

Un zu guter letzt:

>> Mach das ganze viel langsamer!
> geht immer noch nicht

MfG Klaus

von Stefan F. (Gast)


Lesenswert?

Christoph db1uq K. schrieb:
> Wobei das Wired-OR zu Zeiten reiner 5V-Logik noch kein Problem war.
> Ich möchte einen GPIB-Bus (der arbeitet nur mit wired-OR) am Raspberry
> PI betreiben, der eigentlich nur 3,3V mag.

I²C ist Wired-AND.

Dann manchst du halt die Pull-Up Widerstände an 3,3V. Ich sehe da kein 
Problem.

von Wolfgang (Gast)


Lesenswert?

Christoph db1uq K. schrieb:
> Das Oszillogramm zeigt klar einen zu hochohmigen Pullupwiderstand.

Wie kannst du das erkennen, ohne zu wissen, wie die Taktflanken liegen?

von HildeK (Gast)


Lesenswert?

Wolfgang schrieb:
> Wie kannst du das erkennen, ohne zu wissen, wie die Taktflanken liegen?

Das sieht man an der kräftigen Verrundung. Der Beginn der Flanken ist 
auch ganz klar: da wo der Knick vom LOW zur steigenden Flanke ist.

von TrollJäger (Gast)


Lesenswert?

Fred R. schrieb:
> Nicht jedes Individuum ist ein würdiger Ingenieurs wie Du.

Ist auch gut so... Wo kämen wir hin ohne fähige Bäcker, Schreiner oder 
Klemptner? Solange sie ihren Job beherrschen ist doch alles in Butter. 
Und genau hier liegt der Hund begraben: auch Elektronik sollte man mit 
ausreichend Fachwissen bauen und nicht irgendwie zusammenschustern. Hat 
man dieses Fachwissen nicht, so sollte man dies schleunigst nachholen. 
Ist ja kein Hexenwerk. Früher musste man dazu noch Bücher wälzen, heute 
geht das wesentlich einfacher (wenn auch qualitativ deutlich schlechter)

Komischerweise würde jeder schreien, wenn ein gelernter Metzger sich als 
Bäcker ausgibt und in dem Beruf arbeitet.  Aber wenn Elektronik 
"entwickelt" wird, so ist jeder noch so unbedarfter zumindest ein 
"Maker" wenn nicht gleich ein "Entwickler".

> Bin nur Techniker also der Langsamere.

Was hat das eine mit dem anderen zu tun?

von Christoph db1uq K. (christoph_kessler)


Lesenswert?

Ob man das wired-AND oder wired-OR nennt hängt nur von der Bezeichnung 
der Pegel ab. Bei GPIB wird "mindestens ein Open-collector 
durchgeschaltet" als High bezeichnet, obwohl das Signal dann auf GND 
liegt. Wenn man bei I2C die üblichen TTL-Bezeichnungen nimmt, ist das 
ein wired-AND, die Schaltung ist aber identisch.

von Wolfgang (Gast)


Lesenswert?

HildeK schrieb:
> Das sieht man an der kräftigen Verrundung. Der Beginn der Flanken ist
> auch ganz klar: da wo der Knick vom LOW zur steigenden Flanke ist.

Was SDA macht, solange SCL auf LOW ist, ist völlig Schnuppe. Dafür ist 
der Takt da. Vor der steigenden Flanke von SCL kann SDA beliebig rund 
sein.

von Christoph db1uq K. (christoph_kessler)


Lesenswert?

Ja das funktioniert vermutlich auch mit solchen runden Flanken, aber es 
ist nicht zuverlässig. Wenn es so aussieht sollte man die Schaltung 
nochmal überdenken.

Zum Thema GPIB gibt es eine Bachelorarbeit aus Wien.
http://elektronomikon.org/wp-content/uploads/2017/12/Bakkarbeit.pdf
Hier werden normalerweise Treiber bestückt, aber man kann sie auch durch 
Null-Ohm-Widerstände ersetzen. Dann bekommt man aber Probleme mit 
gemischten Betriebsspannungen.
Dasselbe gilt auch für I2C. Es kann gut gehen, muß aber nicht. Wenn ein 
neu angeschlossenes Gerät einen pull-up nach +5V hat, dann ist das für 
nicht-tolerante 3,3V-Logik ein Problem.

von TrollJäger (Gast)


Lesenswert?

Christoph db1uq K. schrieb:
> Wenn ein
> neu angeschlossenes Gerät einen pull-up nach +5V hat, dann ist das für
> nicht-tolerante 3,3V-Logik ein Problem.

Wobei dies dann unter "Basteln" fällt, da man einen 3V3-Bus und einen 
5V-Bus getrennt betrachten sollte.

nxp hat da einige Dokumente dazu, hier zwei als Auswahl:

https://www.nxp.com/docs/en/application-note/AN10441.pdf

https://www.nxp.com/docs/en/application-note/AN10418.pdf

von Stefan F. (Gast)


Lesenswert?

Wolfgang schrieb:
> Was SDA macht, solange SCL auf LOW ist, ist völlig Schnuppe. Dafür ist
> der Takt da. Vor der steigenden Flanke von SCL kann SDA beliebig rund
> sein.

Keineswegs.

Wenn SDA seinen Pegel ändert, während SCL auf LOW ist, dann bedeutet 
dies entweder ein START oder ein STOP Signal.

von Klaus (Gast)


Lesenswert?

Christoph db1uq K. schrieb:
> aber es
> ist nicht zuverlässig. Wenn es so aussieht sollte man die Schaltung
> nochmal überdenken.

Das ist aber nicht das Problem. Beim TO geht es zuverlässig, nämlich 
immer gar nicht.

MfG Klaus

von TrollJäger (Gast)


Lesenswert?

Mal eine ganz triviale Idee: schifte doch mal die Adresse um eins nach 
rechts und teste mal ob du ein ACK vom Slave bekommst. In manchen 
Datenblättern steht es etwas merkwürdig formuliert.

Tipp am Rande: wenn an deiner Arbeitsstelle ein R&S Oszi steht, so haben 
sie auch ganz sicher einen Logic-Analyzer. Das wäre dann das geeignete 
Werkzeug...

von Einer K. (Gast)


Lesenswert?

TrollJäger schrieb:
> Tipp am Rande: wenn an deiner Arbeitsstelle ein R&S Oszi steht, so haben
> sie auch ganz sicher einen Logic-Analyzer. Das wäre dann das geeignete
> Werkzeug...

Erst die Flanken in Ordnung bringen!
Dafür ist ein Oszi gut geeignet.
Ein LA eher nicht, denn der schleift das Signal "schön" rechteckig.

Später, wenn die Grundfunktion gewährleistet ist, dann ist ein LA das 
richtige, um das Protokoll, bzw. den Datenstrom, zu untersuchen.

von Stefan F. (Gast)


Lesenswert?

Ich möchte erwähnen, dass nicht alle Slaves eine "richtige" I²C 
Schnittstelle gemäß der Spezifikation von NXP haben (mit Tiefpass-Filter 
und Schmitt-Trigger). Diese reagieren schlecht auf so extrem flache 
Flanken, wie wir sie auf dem Oszilloskop-Bild sehen.

von Martin W. (martin_s86)


Lesenswert?

Arduino Fanboy D. schrieb:
> Erst die Flanken in Ordnung bringen!
> Dafür ist ein Oszi gut geeignet.

HildeK schrieb:
> Das sieht man an der kräftigen Verrundung. Der Beginn der Flanken ist
> auch ganz klar: da wo der Knick vom LOW zur steigenden Flanke ist.

Christoph db1uq K. schrieb:
> Ja das funktioniert vermutlich auch mit solchen runden Flanken, aber es
> ist nicht zuverlässig. Wenn es so aussieht sollte man die Schaltung
> nochmal überdenken.

Ihr solltet alle mal euer Geschreibsel hier überdenken.

I2C hat immer "kräftige Verrundungen". Das ist das Prinzip hinter einem 
Open-Collector.

Das einzige was man hier offensichtlich erkennen kann, ist dass die 
Rise-Time in der Dimension um 1µs liegt. Alles andere ist Glaskugel. Im 
Standard-Mode wie bereits angemerkt sollte die Rise-Time unter 1µs 
liegen. Es lohnt also eine konkrete Messung. Die wurde hier bisher nicht 
gemacht bzw. ist nicht vom Bild ablesbar.

Nur Unwissende behaupten, dass an dem Bild definitiv eine zu langsame 
steigende Flanke vorliegt.

von Einer K. (Gast)


Lesenswert?

Martin S. schrieb:
> Ihr solltet alle mal euer Geschreibsel hier überdenken.

Und du solltest nicht Sinn verzerrend zitieren!

Es kann sein dass du manche Texte nicht verstehst, aber das berechtigt 
dich nicht zu öffentlichen Urteilen.

von Klaus (Gast)


Lesenswert?

Martin S. schrieb:
> Das einzige was man hier offensichtlich erkennen kann, ist dass die
> Rise-Time in der Dimension um 1µs liegt. Alles andere ist Glaskugel. Im
> Standard-Mode wie bereits angemerkt sollte die Rise-Time unter 1µs
> liegen. Es lohnt also eine konkrete Messung. Die wurde hier bisher nicht
> gemacht bzw. ist nicht vom Bild ablesbar.

Und selbst wenn der Wert von 1µs gerissen wird, ist das Fehlerbild 
nicht: "geht gar nicht". Hier bellt der Hund den falschen Baum an.

MfG Klaus

von Christian M. (Gast)


Lesenswert?

Stefanus F. schrieb:
> Christian M. schrieb:
>> Ein Bus sollte eh auf beiden Seiten abgeschlossen werden!
>> Das gälte auch für Z80 u.ä. Systeme!
>
> Verwechselst du da nicht was?
>
> Z80 ist doch kein Bus.
> Und zwei Enden zum Abschließen hat man z.B. bei 10-Base-2, Can, RS-485,
> ISDN, aber sicher nicht bei I²C.

Nein nein, ich verwechsle nichts. Nur weil man es nicht macht, ist das 
technisch noch lange nicht sauber.

Jeder Bus, also jede Leitung eines Buses, sollte am Ende abgeschlossen 
werden. Bidirektionale Leitungen an beiden Enden.

Und dazu gehören auch I²C und auch z.B. die Datenleitungen eines 
Z80-Systems. Wobei es normal bei so kurzen Leitungen nicht gemacht wird, 
da Reflektionen keinen grossen Einfluss auf die Flanken haben.

Bei I²C wird nur auf das Wired-OR geschaut und Refektionen ausser acht 
gelassen, darum nur jeweils ein R irgendwo.

Ich persönlich mache auf beiden Seiten ein R rein, habe so auch längere 
Leitungen ohne Probleme realisiert (>10m).

Gruss Chregu

von Stefan F. (Gast)


Lesenswert?

Klaus schrieb:
> Selbst wenn der Wert von 1µs gerissen wird, ist das Fehlerbild
> nicht: "geht gar nicht". Hier bellt der Hund den falschen Baum an.

Das nicht, aber es ist ein deutlicher hinweis, was man mit geringstem 
Aufwand als erstes versuchen sollte.

Wenn mein Fahrrad plötzlich schwergängig wird und es pfffft macht, 
greife ich schließlich auch zuerst nach der Luftpumpe.

von HildeK (Gast)


Lesenswert?

Martin S. schrieb:
> HildeK schrieb:
>> Das sieht man an der kräftigen Verrundung. Der Beginn der Flanken ist
>> auch ganz klar: da wo der Knick vom LOW zur steigenden Flanke ist.

Du solltest verstehen, worauf ich mich bezogen hatte.
Es wurde behauptet, man kann nicht wissen, wo die Taktflanken liegen:

Wolfgang schrieb:
> Wie kannst du das erkennen, ohne zu wissen, wie die Taktflanken liegen?

Wir sehen nach Aussagen des TO im ersten Post auf dem Skope SCL. Und wo 
die Flanken liegen, ist dort eindeutig zu erkennen. Ob es mit dem SDA 
zusammenpasst, kann man nicht sehen.

Und weil die Anstiegszeit bei rund 1µs (ich hätte eher gesagt, noch 
mehr) liegt, ist auch die I2C-Spezifikation ev. verletzt. So eine müde 
Flanke lässt auf einen zu hochohmigen PU oder zu hohe kapazitive Last an 
SCL schließen.
Nichts anderes hat Christoph db1uq K. behauptet.
Das hat auch der TO bestätigt:

Marco D. schrieb:
> Ich hab keine Pullups dazugeschaltet, ich hänge die Leitungen direkt ans
> Oszi. Ich dachte der uC schaltet die intern dazu.

Marco D. hat seither nichts mehr dazu gesagt. Vielleicht haben 
brauchbare PUs sein Problem schon gelöst.

von Marco D. (Gast)


Lesenswert?

Habe die Pullups hinzugefügt und den Takt etwas runtergeschraubt. Jetzt 
sieht es schon ordentlich uas und ich kann auch das Adressbyte über den 
Master versenden was ich mir an meinem Oszi anzeigen lassen kann. Ich 
bekomme allerdings kein ACK-Bit vom Slave. Habe von meinem Betreuer 
erfahren das er selbst Probleme damit hat. Er meinte es liege wohl an 
einer Busyflag die vom Master gesetzt aber nicht zurückgenommen wird und 
somit den Slave blockiert. Hat jemand von euch Erfahung damit gemacht ? 
Ich verwende die Funktion:

HAL_StatusTypeDef HAL_I2C_Master_Transmit(I2C_HandleTypeDef *hi2c, 
uint16_t DevAddress, uint8_t *pData, uint16_t Size, uint32_t Timeout)

von Matthias S. (Firma: matzetronics) (mschoeldgen)


Lesenswert?

Marco D. schrieb:
> HAL_StatusTypeDef

Da sind ja return Werte drin, die du mal abfragen solltest. Generell 
gibt es bei I²C immer die Unsicherheit, welche Library welche 
Adressierung verwendet.

Da gibt es 7-bit Adressen + RW-Bit die z.B. beim Standard EEPROM (24C02) 
als 0x50 + R/W bit benutzt werden (7-bit Adresse), aber auch die 
Notation '0xA0 | R/W Bit', so das beim Lesen 0xA1 und beim Schreiben 
0xA0 als Adresse benutzt wird.

Dieser EEPROM hat z.B. auch noch die Besonderheit der 'Restart 
Condition', die mögl. auch dein Sensor braucht. Dabei wird erstmal die 
gewünschte Registeradresse mit I2C Write gesetzt, dann kommt eine 
Re-Adressierung mit gesetztem Read-Bit, um das Register zu lesen. 
Überprüfe das Datenblatt des I²C Slaves darauf.

Aus dem HAL Aufruf schliesse ich eher auf letztere Variante (8-bit 
Adressen), die zumindest bei der SPL auch üblich war. Da wir nicht 
wissen, welchen Chip du ansprechen willst, bleibts erstmal dabei. Hat 
denn das periphere Board jemals funktioniert? Oder liegt da evtl. ein C 
noch direkt an SCL und/oder SDA?

: Bearbeitet durch User
von Johannes S. (Gast)


Lesenswert?

ich hatte vor kurzem auch einen zickigen Sensor, da hatten dann 
Serienwiderstände von 100R in den SDA/SCL Leitungen geholfen.
Beitrag "Omron D6T Thermal Sensor"
Die HAL möchte 8 Bit Adressen, findet man in den Parameterbeschreibungen 
in den Quellen.
1
  * @param  DevAddress Target device address The device 7 bits address value
2
  *         in datasheet must be shifted to the left before calling the interface

von Klaus (Gast)


Lesenswert?

Ich zitier mich mal selber

Klaus schrieb:
> Kann man machen, wird aber nichts bringen. Die gezeigten Signale sind
> ok, tausend mal gemacht. Kann man aber auch hier im Forum nachlesen. In
> jedem I2C Thread kommt das so:
>
>>> Mach mal die Pullups kleiner!
>> hat nichts gebracht
>
> Meist kommt dann noch:
>
>>> Da fehlt der Abblockkondensator!
>> hab ich eingelötet, geht trotzdem nicht
>
> Un zu guter letzt:
>
>>> Mach das ganze viel langsamer!
>> geht immer noch nicht

Marco D. schrieb:
> Habe die Pullups hinzugefügt und den Takt etwas runtergeschraubt. Jetzt
> sieht es schon ordentlich aus und ich kann auch das Adressbyte über den
> Master versenden was ich mir an meinem Oszi anzeigen lassen kann. Ich
> bekomme allerdings kein ACK-Bit vom Slave.

Stefanus F. schrieb:
> Klaus schrieb:
>> Selbst wenn der Wert von 1µs gerissen wird, ist das Fehlerbild
>> nicht: "geht gar nicht". Hier bellt der Hund den falschen Baum an.
>
> Das nicht, aber es ist ein deutlicher hinweis, was man mit geringstem
> Aufwand als erstes versuchen sollte.
>
> Wenn mein Fahrrad plötzlich schwergängig wird und es pfffft macht,
> greife ich schließlich auch zuerst nach der Luftpumpe.

Wenn du schon vergleichst, solltest du ein Fahrrad nehmen, bei dem sich 
die Räder noch nie gedreht haben.

MfG Klaus

von HildeK (Gast)


Lesenswert?

Johannes S. schrieb:
> Die HAL möchte 8 Bit Adressen, findet man in den Parameterbeschreibungen
> in den Quellen.

Jedes I2C Device will mit 8 Bit angesprochen werden, nämlich 7Bit + Read 
oder Write im LSB. Bei vielen Devices sind auch noch 1-3Bit zusätzlich 
vorhanden, um die Adresse modifizieren zu können.
Die Fragen sind aber:
- wie ist der Wert im Datenblatt gemeint. Manche nennen eine 7Bit-, 
andere zwei 8Bit-Adressen.
- wie spricht die SW das Device an, als z.B. über zwei Funktionen Read 
und Write mit 7Bit-Adresse, die dann schiebt und R bzw W hinzufügt oder 
eine Funktion, der man Rd bzw. Write in der 8Bit-Adresse mit übergeben 
muss.

Es gibt auch (sicherlich wenige) Devices, die im Timing kritisch sind. 
Wir haben das an einem Imager mal erlebt. Da könnten schon 
unterschiedliche Leitungslängen von SCL und SDA zuschlagen. Das führt 
aber meist nur zu sporadischen Fehlern.

von Marco D. (Gast)


Lesenswert?

Ich möchte den Temperatursensor LM75B auslesen. Mit einem Genuino Board 
hat es jetzt funktioniert die Register auszulesen, daher kann ich sicher 
sein, dass der IC funktionsfähig ist. Hier der Arduino Code:

#include<Wire.h>

void setup() {
 Serial.begin(9600);
 Wire.begin();
 }

void loop() {
 Wire.beginTransmission(72);

 Wire.write(3); //register 0x03 auslesen

 Wire.endTransmission();

 Wire.requestFrom(72,2);

 while(Wire.available() == 0);

 int antwort = Wire.read();
 Serial.print(antwort);
 antwort = Wire.read();
 Serial.print(antwort);
 Serial.println("\n");

 delay(1000);
}

Die 7 Bit Adresse lautet 1001000 oder 0x48. Mit dem Nucleo habe ich es 
versucht mit:

if(HAL_I2C_IsDeviceReady(&hi2c2,0x48<<1,10,10) == HAL_OK){
      HAL_GPIO_TogglePin(GPIOB,GPIO_PIN_13);
    }
Nichts tut sich, daher sollte ich ausschließen können das es an meinem 
Code liegt, es sei denn ihr seht noch einen Fehler. Ich hab es auch mit 
der mem_read Funktion versucht was auch nichts gebracht hat. Scheinbar 
hat mein Betreuer recht und es liegt am HAL code.

von Matthias S. (Firma: matzetronics) (mschoeldgen)


Lesenswert?

Marco D. schrieb:
> Die 7 Bit Adresse lautet 1001000 oder 0x48

Wie oben schon geschrieben, benutzen HAL und SPL 8-Bit Adressen. 
Probiere also mal 0x90 (schreiben) bzw. 0x91 (lesen).

von Marco D. (Gast)


Lesenswert?

Hab ich auch schon versucht, tut sich auch nichts.

von ÄXl (Gast)


Lesenswert?

Wire.BeginTransmission(73)? du willst ja was hinschreiben
( gesetztes RW-Bit )

von Marco D. (Gast)


Lesenswert?

Wie bereits geschrieben habe ich mit dem Arduino die Register von dem IC 
ausgelesen und nicht reingeschrieben. Das hat auch funktioniert, die 
Antwort des IC's war die erwartete.

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.