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?