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
Ersetz das Gyro durch ein EEPROM und probiers damit mal.
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
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...
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.
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!
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
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.
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
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!
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.