Forum: Mikrocontroller und Digitale Elektronik I2C Bitbang Problem mit MPU6050 und seltener Hardware


von Kay C. (kay_c)


Angehängte Dateien:

Lesenswert?

Guten Abend alle miteinander,

ich kämpfe jetzt bereits seit geraumer Zeit mit einem Problem wobei ich 
einfach keinen Fortschritt sehe. Diverse Fehlerquellen habe ich bereits 
ausgeschlossen nun ist es einfach an der Zeit für neuen Input.

Ich programmiere also gerade per bitbanging ein I2C Schnittstelle um den 
MPU6050 (Ein Gyro auf dem Breakoutboard von sparkfun) auszulesen aber 
wie so viele vor mir bekomme ich einfach kein ACK Signal. Ab und zu wenn 
ich Glück habe bekomm ich eins nach den ersten 8 bit, das wars dann aber 
schon wieder.

Ab jetzt könnte es für euch interessant werden. Das ganze passiert 
nämlich nicht mit keinem Atmega o.Ä. sondern mit einem ADWin Pro II 
System von Jäger Messtechnik. Das ersetzt mir meinem Microkontroller und 
funktioniert an sich sehr gut. Lässt sich mit verschiedenen Sprachen 
programmieren und für zeitkritische Prozesse hab ich das DIO-32-TiCo 
Modul. Aber genug davon.

Ich kann damit sehr gut bitweise programmieren. Das Modul hat 32 
Digitale Inputs/Outputs mit TTL Level (5V), SDA und SCL vom ADWIN sind 
an einen Level Shifter angeschlossen.
Ich hab schon ein oder zwei Meinungen gehört das der Gyro auch TTL 
tolerant ist, aber dazu hab ich im Datenblatt nichts gefunden darum so.

Das Breakoutboard hab ich korrekt verdrahtet (denke ich)
Spannungsquelle sind 2 Netzteile (5V und 3.3V)
VDD - 3.3v
GND -  GND
INT - NC
FSYNC - NC
SCL - SCL (zum levelshifter)
SDA - SDA  (zum levelshifter)
VIO - 3.3v
CLK - NC
ASCL - NC
ASDA - NC

So, ganz schön viel zu schreiben grad...
Jetzt hab ich mal einen Logic analyser drangehängt und geschaut, aber 
ich sehe darin nicht den Fehler. Im Anhang mal die Version bei der ich 
ein ACK Signal nach den ersten 8 Bit bekommen habe.
Zur Erklärung: Signal 1 und 2 sind SCK und SDA auf der 5V seite, 4 und 5 
SCK und SDA auf der 3.3V Seite. Signal 3 ist das Signal für die Richtung 
des Level Shifters. HIGH: 5V -> 3V(Gyro), LOW 3V zu 5V

Signale :
1: SCK 5V (ADWin)
2: SDA 5V (ADWin)
3: Levelshifter
4: SCK 3V (Gyro)
5: SDA 3V (Gyro)

Man kann sehen:
1) der Level shifter arbeitet. In beiden Richtungen
2) Das erste ACK Sig läuft. Der Levelshifter kann die Leitung auf 0V 
ziehen
3) am Ende wartet er auf ein ACK aber bekommt keins...:( und schließt 
mit dem Stop Signal
4) Ebenfalls die SCK line wird vom Gyro getrieben, und auf HIGH gezogen
(was ich allerdings seltsam finde weil der Gyro ja eigentlich Slave sein 
sollte und SCK nicht treiben sollte ?!?!? Außer wenn er Buisy ist und 
dann sollte SCK auf LOW gezogen werden.)


Phu was kann ich noch sagen:
- Adresse des MPU stimmt, AD0 ist low (default vom Breakout board)
- Write bit (0) sieht man ja auch...
- Registeradresse stimmt, (in PWR_MGMT_1 @ 0x6B soll 00b geschrieben 
werden, zum aufwecken)
- SCL und SDA haben auf der 3V seite 10kOhm Pull-Ups
- wenn signal 3 (Richtung des Levelshifter) auf Low gesetzt wird werden 
auch SCK und SDA als Eingänge gesetzt
## Wichtig ##
- die 5V Digital IO des ADWin Systems haben 10k Pull-DOWN Widerstände 
fest eingebaut.  Zuerst dachte ich das sei das Problem aber wie man 
sieht werden beide, sobald als Eingang geschaltet, auch ohne Probleme 
hoch und runter gezogen...also glaube ich da nicht dran.
## /Wichtig ##
- In einer I2C Spezifikation habe ich gelesen das man, wenn man möchte, 
SDA und SCK über einen Widerstand ( ca 300 Ohm) laufen lassen soll um 
sie vor Spannungsspitzen zu schützen. Das habe ich (noch) nicht. Werde 
ich morgen mal ausprobieren.

So... es tut mir leid das es doch so viel geworden ist, ist aber doch 
recht umfangreiches Thema. Wo seht ihr den Fehler???

Vielen Dank an alle die bis hier hin gelesen haben ... Falls noch was 
unklar ist bitte fragt!

Liebe Grüße Konrad


Hardware:
MPU6050: https://www.sparkfun.com/products/11028
ADWin Pro II: http://www.adwin.de/de/produkte/proII.html
Level Shifter: 
http://www.onsemi.com/pub_link/Collateral/MC74LVX4245-D.PDF

von Abdul K. (ehydra) Benutzerseite


Lesenswert?

Ersetz das Gyro durch ein EEPROM und probiers damit mal.

von Peter D. (peda)


Lesenswert?

Kay C. schrieb:
> Im Anhang mal die Version bei der ich
> ein ACK Signal nach den ersten 8 Bit bekommen habe.

Ich sehe kein ACK.
Das ACK muß deutlich vor der High-Flanke des SCL beginnen und darf erst 
nach der Low-Flanke wieder auf high gehen.

Peter

von Kay C. (kay_c)


Lesenswert?

Peter Dannegger schrieb:
> Kay C. schrieb:
>> Im Anhang mal die Version bei der ich
>> ein ACK Signal nach den ersten 8 Bit bekommen habe.
>
> Ich sehe kein ACK.
> Das ACK muß deutlich vor der High-Flanke des SCL beginnen und darf erst
> nach der Low-Flanke wieder auf high gehen.
>
> Peter

Das Problem ist das SCK und SDA über den selben Levelshifter laufen 
dessen Ports ich nur alle gemeinsam umschalten kann...

von Joerg L. (Firma: 100nF 0603 X7R) (joergl)


Lesenswert?

Kay C. schrieb:
> Das Problem ist das SCK und SDA über den selben Levelshifter laufen
> dessen Ports ich nur alle gemeinsam umschalten kann...

So kann das nicht funktionieren.
Der Levelshifter muß bidirektional sein, und zwar ohne Umschaltung.
Bau Dir einen aus 2 FETs BSS138, das tut super.
Von Philips/NXP gibts dazu eine App-Note - die benutzen zwar andere 
FETs, ich hab hier aber nur die 138er.

von Joerg L. (Firma: 100nF 0603 X7R) (joergl)


Lesenswert?

Nachtrag: Dir ist aber schon klar, daß bei I2C die Ausgänge alle 
Open-Collector bzw Open-Drain sind, und das "High" auf dem Bus per 
Pullups realisiert wird? Deine Levelshifter sehen so gar nicht nach 
Open-Collector aus, die haben Push-Pull-Stufen!

von Peter D. (peda)


Lesenswert?

Ich würd erstmal im Datenblatt nachschlagen, ob der 5V-IC TTL-kompatibel 
ist (high >= 2,4V), d.h. ein Level-Shifter unnötig.


Peter

von Kay C. (kay_c)


Lesenswert?

Joerg L. schrieb:
> Kay C. schrieb:
>> Das Problem ist das SCK und SDA über den selben Levelshifter laufen
>> dessen Ports ich nur alle gemeinsam umschalten kann...
>
> So kann das nicht funktionieren.
> Der Levelshifter muß bidirektional sein, und zwar ohne Umschaltung.
> Bau Dir einen aus 2 FETs BSS138, das tut super.
> Von Philips/NXP gibts dazu eine App-Note - die benutzen zwar andere
> FETs, ich hab hier aber nur die 138er.

Bist du dir da sicher? schließlich muss ich ja auch meine Digital Ein- 
und Ausgänge umschalten(D.h. auf Eingang schalten) wenn ich dem Gyro 
zuhöre, dann kann ich doch auch den Level-shifter umschalten.

Peter Dannegger schrieb:
> Ich würd erstmal im Datenblatt nachschlagen, ob der 5V-IC TTL-kompatibel
> ist (high >= 2,4V), d.h. ein Level-Shifter unnötig.
>
>
> Peter

Die 5V seite ist schon 3.3V kompatibel, (theshold lvl liegt glaub ich 
bei 1.8V) das habe ich auch bereits ein andres mal so gemacht. Nur der 
MPU6050 ist nicht 5V tolerant. d.h ich würde ihn zerstören wenn ich ohne 
Levelshifter arbeite, befürchte ich.

von Peter D. (peda)


Lesenswert?

Kay C. schrieb:
> schließlich muss ich ja auch meine Digital Ein-
> und Ausgänge umschalten(D.h. auf Eingang schalten) wenn ich dem Gyro
> zuhöre, dann kann ich doch auch den Level-shifter umschalten.

Nein. Der Portpin ist entweder Eingang oder Output-Low. Und das für SDA 
und SCL zu verschiedenen Zeiten.
Beim AVR macht man das, indem einmalig nach Reset PORT.x auf 0 gesetzt 
wird und danach nur noch das DDR.x-Bit umgeschaltet.


Kay C. schrieb:
> Nur der
> MPU6050 ist nicht 5V tolerant. d.h ich würde ihn zerstören wenn ich ohne
> Levelshifter arbeite, befürchte ich.

Die Pullups kommen immer an die kleinere VCC, also an 3,3V.
Wenn der 5V-IC diese 3,3V sicher als high erkennt, ist alles in Butter.
Der 5V-IC muß natürlich open-drain simulieren, darf also niemals aktiv 
5V high auf den Bus geben.


Peter

von Abdul K. (ehydra) Benutzerseite


Lesenswert?

Vom einfachen zum komplizieren debuggen, wenn gar nix mehr gehen will. 
Also gleiche Spannung, niedrige Frequenz, einfaches IC was angesteuert 
werden soll. Level-Shifter erstmal raus.

Beim 8051 mit seiner speziellen Port-Struktur geht Bit-Banging auch 
problemlos. Der treibt kurz HIGH, wobei HIGH nicht sonderlich stark ist 
und nix kaputtgeht. Multi-Master ist nochmal ne Nummer anspruchsvoller. 
Das habe ich mit 8051 nie probiert.

Achso, time-out bei zu niedriger Busfrequenz bei manchen Chips!

von Kay C. (kay_c)


Lesenswert?

Peter Dannegger schrieb:
> Kay C. schrieb:
>> schließlich muss ich ja auch meine Digital Ein-
>> und Ausgänge umschalten(D.h. auf Eingang schalten) wenn ich dem Gyro
>> zuhöre, dann kann ich doch auch den Level-shifter umschalten.
>
> Nein. Der Portpin ist entweder Eingang oder Output-Low. Und das für SDA
> und SCL zu verschiedenen Zeiten.
> Beim AVR macht man das, indem einmalig nach Reset PORT.x auf 0 gesetzt
> wird und danach nur noch das DDR.x-Bit umgeschaltet.
>
>
> Kay C. schrieb:
>> Nur der
>> MPU6050 ist nicht 5V tolerant. d.h ich würde ihn zerstören wenn ich ohne
>> Levelshifter arbeite, befürchte ich.
>
> Die Pullups kommen immer an die kleinere VCC, also an 3,3V.
> Wenn der 5V-IC diese 3,3V sicher als high erkennt, ist alles in Butter.
> Der 5V-IC muß natürlich open-drain simulieren, darf also niemals aktiv
> 5V high auf den Bus geben.
>
>
> Peter

Ich danke euch allen, habt mir sehr geholfen. Aber den Ausschlag gabst 
du Peter :-)

Habe jetzt meinen 5V IC mit dem 3.3 Pull-Up verbunden und softwareseitig 
verhindert dass er auf 5V schaltet. Also alle Ausgänge auf LOW gesetzt.

Wenn der Master jetzt ein HIGH ausgeben soll lasse ich die Leitung 
einfach los (schalte also die Leitung als Eingang), der Pullup zieht die 
line hoch (außer der Slave zieht sie auf GND).
Musste nur den Pull-Up auf ca 2.2kOhm festlegen weil der 5V IC über 
einen 10k Pull-Down verfügt (war im Endeffekt ein Spannungsteiler). Ich 
musste also drauf achten dass der 5V IC noch genügend Volt bekommt um 
ein HIGH zu sehen (min 2V).

Wenn der Master ein LOW ausgeben soll, schalte ich die Leitung als 
Ausgang, dann wird diese auf GND gezogen.

=> Kein Spannungsteiler nötig!
und WHO_AM_I = 0x68 :-)

Also vielen Dank und liebe Grüße Kon

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.