Hallo,
ich versuche momentan mit einem ATtiny einen "Übersetzer" zwischen einem
UART und einem i2c-Bus zu realisieren. Sprich: Daten, die auf dem
i2c-Bus zum ATtiny geschrieben werden, werden von diesem direkt über den
UART rausgeschrieben. Andersherum werden Daten, die über den UART zum
ATtiny kommen gepuffert und beim nächsten i2c-Lesevorgang an den Master
übergeben.
Den i2c-Teil habe ich größtenteils von einem Eintrag hier aus dem Forum
übernommen
( Beitrag "attiny USI Slave Implementierung" )
(meine Version ist im Anhang)
Schreiboperationen funktionieren auch einwandfrei, Daten die ich über
i2c auf den Tiny schreibe, kommen problemlos auf dem UART an. Aber mein
Problem ist nun, dass Lese-Operationen auf dem Tiny fehlschlagen. Ich
habe die Lesevorgänge mal mit einem Oszilloskop angeschaut und werde
einfach nicht schlau daraus (siehe Bilder im Anhang, die grüne, obere
Linie ist SDA, die gelbe, untere SCL.). Es sieht so aus, als ob der tiny
zu spät anfängt Daten rauszuschieben, aber warum er das tut verstehe ich
nicht. Es sieht auch so aus, als ob er an irgendeiner Stelle einen
halben Takt verliert, da er seine Daten dann zu den Low-Phasen des
Taktes rausschreibt.
Auch seltsam sind die zwei verlängerten Clock-Pulse vom Master (ein Lego
NXT) nachdem der tiny seine Adresse mit einem ACK bestätigt hat.
Einige Werte, die ich beim tiny rausschreibe, liefern recht
reproduzierbare Ergebnisse auf dem NXT, zB. wird 0x0f fast immer zu
0x3f. Auch andere Werte folgen diesem "um zwei nach links geshiftet, mit
Einsen aufgefüllt"-Schema, aber andere Werte folgen anderen Mustern oder
sind nicht wirlich reproduzierbar.
der tiny läuft mit 8MHz (interner Oszillator)
Der NXT wurde mit NXC programmiert und der wesentliche Code-Ausschnitt
ist eigentlich nur
1 | until(LowspeedCheckStatus(I2C_PORT) == 0);
|
2 | byte send[1];
|
3 | send[0] = (NODE_ADDR << 1) | 0x01;
|
4 | int len = 1;
|
5 | LowspeedWrite(I2C_PORT, len, send);
|
len ist die Länge der zu erwartenden Antwort. Es verwundert mich auch
etwas, dass der NXT bei dem 0x0f-Lesevorgang offenbar ein zweites Byte
liest und mir dieses dann als das Ergebnis der Leseoperation verkauft.
Sieht irgendjemand, wo mein Fehler ist? Oder hat irgendwer Erfahrung mit
i2c auf dem NXT? Ich vermute ja, dass das Problem erst durch das
Zusammenspiel der beiden entsteht, ich habe leider keinen anderen
i2c-Master um die Funktion des tiny zu überprüfen.
PS: Ich weiß, dass ich mit den angehängten Oszilloskop-Bildern gegen die
Forenregeln verstoße, aber da ich die Bilder nur im JPG-Format habe
macht es wenig Sinn sie zu PNG zu konvertieren. Das würde sie nur größer
machen und die verloren gegangene Qualität kommt so auch nicht wieder.