Forum: Mikrocontroller und Digitale Elektronik Schrittmotorsteuerung TMC 223 über I2C an Arduino


von Richard W. (baltersice)


Angehängte Dateien:

Lesenswert?

Guntag!

Ich habe einen TMC223 (Für diese Anwendung identisch: Amis-30624, 
TMC222) über I2C Bus mit meinem Arduino Uno (ATMEGA-328P) verbunden und 
verlasse mich dabei auf die vorgefertigte TWI Funktionsbibliothek und 
die internen Pullup Widerstände für die SDA und die SCL Leitung, von 
denen man überall liest. Scheinbar hat man damit auch überall recht, 
denn bisher funktioniert alles (SetMotorParam, GetFullStatus1, 
GetFullStatus2, RunVelocity, Softstop) bis auf eine Ausnahme: 
GetOTPParam. Der Befehl sollte den 223 dazu anregen, seine 8 OTP Bytes 
herauszurücken. Allerdings gibt er nur Bytes nach dem Schema 11111110 
heraus. Das widerspricht einerseits dem Datenblatt, denn laut ihm ist 
Byte 0x00 schon auf 11111111 vorprogrammiert, andererseits weicht die 
Adresse, die in Byte 0x02 stünde von der Adresse ab, über die ich gerade 
mit dem Gerät kommuniziere.

Zur Isolation des Fehlers habe ich mein Programm auf das Folgende 
reduziert:
1
    #include <Wire.h> //I2C Biblipthek importieren
2
3
    void getOTPParam(){           //Wird alle 3 Sekunden aufgerufen
4
      Wire.beginTransmission(96); //Übertragung an Gerät 1100000 einleiten
5
      Wire.write(0x82);           //Befehl 10000010 alias GetOTPParam senden
6
      Wire.endTransmission();     //Übertragung beenden
7
      Wire.requestFrom(96, 8);    // 8 Bytes von 1100000 verlangen
8
      while(Wire.available()) {   //Solange es etwas zu Lesen gibt
9
        Serial.println(Wire.read(),BIN); //lese ein Byte und schreib es auf die Konsole
10
      }
11
    }
12
13
14
    void setup(){         //Wird ein Mal aufgerufen
15
      Serial.begin(9600); //Serielle Verbindung starten
16
      Wire.begin();       //Als Master dem I2C Bus beitreten
17
    }
18
19
20
    void loop() {  //Wird immer wieder aufgerufen
21
    getOTPParam(); //Ruft meine Funktion auf
22
    delay(3000);   //Wartet 3 Sekunden
23
    }

Doch die Erleuchtung blieb bisher aus! Weiterhin nur 11111110 Bytes, je 
nachdem wieviele ich verlange. Wenn ich den Befehl 0x82 durch 0x81 
ersetze, was GetFullStatus1 entspricht, bekomme ich genau die Antwort, 
die ich erwarte.

Ich habe auch schon an die Broadcastadresse gesendet, die Bitrate mit 
(((F_CPU / TWI_FREQ) - 16) / 2) = 72 ermittelt, und nochmal die korrekte 
Verbindung des HW Pins mit GND über 1k Widerstand geprüft

Bleibt mir etwas anderes, als zu versuchen, die I2C Funktionen selbst zu 
implementieren?

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.