#include <Wire.h>
int incomingByte = 0;
void setup()
{
Wire.begin(); // join i2c bus (address optional for master)
Serial.begin(9600);
Wire.beginTransmission(60); // transmit to device #4
Wire.send(0x03); // sends one byte
Wire.send(0x00); // sends one byte
byte ret = Wire.endTransmission(); // stop transmitting
Serial.write(ret);
}
void loop()
{}
}
Mit diesem Code bekomme ich immer eine 3, das heisst er kann die Daten nicht senden, die Adresse funktioniert aber! Also habe ich mir mal die i2cmaster library von Peter Fleury geholt und versucht mit folgendem Code zu schreiben:
#include <i2cmaster.h>
void setup()
{
i2c_init();
Serial.begin(9600);
//digitalWrite(13,1);
byte ret = i2c_start(120); // set device address and write mode
Serial.write(ret);
//digitalWrite(13,0);
ret = i2c_write(3); // write address = 5
Serial.write(ret);
ret = i2c_rep_start(120);
Serial.write(ret);
ret = i2c_write(0x00); // write address = 5
Serial.write(ret);
ret = i2c_write(0x02); // write address = 5
Serial.write(ret);
ret = i2c_write(0x00); // write address = 5
Serial.write(ret);
i2c_stop();
}
void loop()
{}
Das Ergebnis: "010111", d.h. die Funktionen i2c_start und i2c_rep_start funktionieren, die funktion i2c_write allerdings nicht!
Hat jemand eine Vorstellung warum das so sein könnte? Ich kann das Gerät addressieren aber nicht reinschreiben?!
danke für Deine Antwort. So, wie ich das verstanden habe, macht das die Wire-library automatisch, oder nicht?!
Grüße,
Max
:edit: also laut Datenblatt ist die Slave-Adresse:
0 1 1 1 1 0 0 (1/0) wobei das letzte Bit festlegt ob gelesen oder geschrieben werden soll. Wobei 0 = schreiben ist. 1111000 = 120 = 0x78. Soweit ich weiß, fügt die Wire-Library das letzte Bit automatisch ein. Könnte sein, dass die das falsch macht?! Aber mit der anderen Library (i2cmaster) funktioniert es ja auch nicht...
ich habe aber doch immer nur 60 verwendet, niemals 0x60, das ist mir klar dass das was gänzlich anderes ist. Auf Seite 8 habe ich schon mehrfach geschaut, ich weiss leider nicht wie die Wire-Library das genau umsetzt, aber meiner Meinung nach müsste es ja dann so funktionieren! Die Stop-Condition kommt ja erst nach dem endTransmission, oder nicht?!
Ich verstehe das so:
When addressing I2C devices using the Wire library you'll want to use the 7 bit address. The Wire library will automatically add the 8 LSB (read/write bit) to the 7 bit address you use depending on which way the data is flowing.
Das bedeutet, ich darf nicht die 8bit-Adresse (die du verwendest) hernehmen, sondern nur die 7bit, also ohne die letzte 0! Statt 0b01111000 und 120 also 0b0111100 und 60!!
:edit: Ich habe das Problem gefunden: die Kamera arbeitet im I²C fast mode, der Arduino aber nur im standard mode!! Man muss in der Library die Frequenz auf 400000L ändern!