Ich wollte mir gerade eine I2C-Schaltung zwischen Attiny (Slave) und Raspberry Pi (Master) aufbauen. Der Attiny kann auch mit 3,3V betrieben werden, soweit also kein Problem. Mittels dem Befehl "i2cdetect" wird auch erkannt, dass der Attiny als Slave am I2C hängt. I2C an sich funktoioniert also wohl. Jedoch funktioniert das Senden von Daten nur sehr unzuverlässig und das Empfangen von Daten noch unzuverlässiger (manchmal kommt durchaus am Attiny an, was ankommen soll, und die LED leuchtet dann, oft aber auch nicht). Nach sehr vielen Versuchen habe ich das Gefühl, dass die Geräte die Spannung nicht auf LOW gezogen kriegen. Ich kriege i.d.R. als Antwort des Attiny 0xff oder 0x7f oder auch 0xXX (ich vermute, das bedeutet undefinierte Spannung), obwohl ich 0x00 erwarte. Meiner Recherche nach sollte der Raspberry Pi an sich schon einen Pullup-Transistor für I2C haben, jedoch messe ich in diesem Fall ungefähr 1,5V an der Leitung zwischen Attiny und Raspberry Pi. Deshalb habe ich verschiedene Widerstandsgrößen versucht: 20 Ohm, 330 Ohm, 3,3kOhm, 10kOhm, 47kOhm. Nie habe ich die erwarteten Zahlen erhalten. Bei 20 Ohm tendierte die Ausgabe Richtung 0x0, aber es war immer noch nicht alles 0. Nur wenn ich einen Pulldown-Transistor aufgebaut hab, war logischerweise alles auf 0 (aber so funktioniert I2C ja nicht mehr). Wie kann man sowas denn am besten debuggen? Mein Multimeter ist viel zu langsam, um irgendwie zusehen, welche Spannungen nun anliegen, sobald ich Daten senden will. Ich sehe bei einem Massenkommando wie "i2cdump" (liest alle Register auf dem Slave), dass die Spannung einbricht, aber nicht schnell genug bis auf 0,0 (an meinem Multimeter, aber vllt ist das auch einfach zu langsam).
Anbei mal noch so eine schematische Schaltung. - 3,3V-Spannungsausgang des Pi am Vcc-Eingang des Attiny - GND des Pi am GND-Eingang des Attiny - SCL und SDA jeweils verbunden (testweise mit Pullup-Widerständen)
Die Pullups dürften zu groß sein. Probiere mal 1,8k. Edit: Zu spät gelesen, dass du verschiedene Pullups schon probiert hast. Bei I2C sind mehrere Open-Kollektor-Transistoren parallel geschalten. Somit wird der High-Pegel nur durch den PullUp erzeugt. 1,5V sind aber auf jeden Fall zu wenig. Hast du ein Oszi, vielleicht sogar ein DSO? Damit kann man I2C ganz gut debuggen.
:
Bearbeitet durch User
Vielleicht sendet der RPi auch mit zu hoher Frequenz. Es gibt 100kHz, 400kHz und 1MHz. 400kHz sind quasi Standard aber wenn die Frequenz im µC falsch eingestellt ist, gibt es Probleme. Ich kenne den Tiny nicht, aber wäre es denkbar, dass der I2C noch auf Master steht?
Jens PICler schrieb: > Die Pullups dürften zu groß sein. Probiere mal 1,8k. Sehr komisch. Als ich es eben mit 1,5kOhm probiert habe, lief es mal recht gut (nicht optimal, aber viel besser). Dann habe ich 1,0kOhm, 1,8kOhm und wieder 1,5kOhm probiert und bei keinem wollte es dann. Da steckt doch irgendwo der Wurm... Oszilloskop hab ich leider keins. LOW und HIGH scheint damit aber schonmal ganz gut zu passen. An SCL hat er nun standardmäßig 3,3V, an SDA standardmäßig 0,10V. Ob das so gehört, weiß ich noch nicht, aber auf jeden Fall ist das eine ganz klar HIGH und das andere ganz klar LOW.
Jens PICler schrieb: > Ich kenne den Tiny nicht, aber > wäre es denkbar, dass der I2C noch auf Master steht? Das eigentlich nicht. Der Tiny kann gar kein I2C von sich aus. Das ist eine Software-Implementierung für ein Slave-Protokoll (über so Allgemein-Seriell-Pins, USI heißt es). Im Moment nutze ich da ein "i2cslave"-Programm. https://github.com/ni-c/raspberry2c (Dateien sind in include/ und libs/) Aber soweit ich mich noch an eine Vorlesung erinnerre, dachte ich, dass bei I2C doch alle Komponenten den Takt "vereinbaren", weil einer sein LOW am spätesten wieder loslässt... Lese jetzt aber bei Wikipedia "Der Bustakt wird immer vom Master ausgegeben.". Anscheinend habe ich das mit einem anderen Protokoll verwechselt. Dann ist natürlich die Frage, wie schnell mit Attiny hinterherkommt. Getaktet ist er meines Wissens mit 1MHz. "The default clock source setting is therefore the Internal Oscillator running at 8.0 MHz with longest start-up time and an initial system clock prescaling of 8, resulting in 1.0 MHz system clock." Nur wie krieg ich daraus die Baudrate des USI/i2c-Anschlusses? Im Datenblatt gibts noch einen Punkt "Serial Programming Characteristics". Da steht "Oscillator Frequency (ATtiny24/44/84V): 0-4MHz (min-max)". Ist das das richtige Stichwort? http://www.atmel.com/Images/doc8006.pdf (S. 183) Nur der kann wohl keine 4MHz Frequenz erreichen, wenn er selbst nur mit 1MHz läuft?
Jens PICler schrieb: > 400kHz sind quasi Standard aber wenn die Frequenz im µC > falsch eingestellt ist, gibt es Probleme. AHA! Ich hab die Baudrate im Raspberry Pi mal auf 2 setzen wollen. Ging nicht, Minimum war 3814. Jetzt krieg ich aber bei 100 Iterationen von "Schreibe 0, schreibe 1" keinen einzigen Fehler. Sieht gut aus. Beim Auslesen des Speichers gibts auch kein einziges X mehr und die Ausgabe ist auch richtig. Dann sollte ich nur noch wissen, wie ich die richtige Baudrate irgendwo ablesen kann. Vielleicht weiß da einer was, ich find den Atmel-Dokumentationen fehlt immer das Inhaltsverzeichnis...
newbie schrieb: > Dann sollte ich nur noch wissen, wie ich die richtige Baudrate irgendwo > ablesen kann. Vielleicht weiß da einer was, ich find den > Atmel-Dokumentationen fehlt immer das Inhaltsverzeichnis... Da du eine Software-I2C-Lösung hast, wird die richtige Baudrate nirgendwo stehen. Die ist in erster Linie von der Leistungsfähigkeit des µC abhängig. Bei 8MHz µC-Takt hast du bei 400kHz Baudrate ca. 25 Befehle pro Bit. Das könnte schon etwas knapp werden. 1MHz kannst du dabei vergessen. Die Frequenz kann hier beliebig tiefer sein, da der Master den Takt vorgibt und sich alle Slaves danach richten müssen. Sie müssen halt nur hinterherkommen. Natürlich spielt auch noch die Leitungslänge eine Rolle. Es existieren zwar hier im Forum Berichte von Übertragungen über 20m, doch I2C wurde nun mal für die Verbindung zwischen zwei ICs auf einer Platine gemacht.
I2c braucht PullUps und zwar extern und keine PullDowns wie in deiner Zeichnung. Darum misst du auch die Hälfte der Betriebsspannung.
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.