Also: schreiben funktioniert ja indem man eine Startcondition sendet, die Bausteinadresse, die Speicheradresse, den Datenwert und dann die Stopcondition. Dazwischen immer ein Clockimpuls für Acknowledge
Startsequenz:
void i2c_start(uint8_t value){
//Startbit - Change data from High to Low while clock is High
int i = 0;
int maske = 1;
//Startcondition
digitalWrite(dataPin, 1);
digitalWrite(clockPin, 1);
digitalWrite(dataPin, 0);
//Bausteinadresse
for(i = 0; i < 8; i++){
maske = B10000000 >> i;
digitalWrite(clockPin, 0);
if((value & maske) == maske){
digitalWrite(dataPin, 1);
}
else{
digitalWrite(dataPin, 0);
}
digitalWrite(clockPin, 1);
}
//Acknowledge
digitalWrite(clockPin, 0);
digitalWrite(clockPin, 1);
}
Stopsequenz
void i2c_stop(){
digitalWrite(clockPin,0);
digitalWrite(dataPin, 0);
digitalWrite(clockPin, 1);
digitalWrite(dataPin, 1);
}
Sendesequenz
void i2c_send(uint8_t F_value){
uint8_t maske = 1;
uint8_t i = 0;
for(i = 0; i < 8; i++){
digitalWrite(clockPin, 0);
maske = B10000000 >> i;
//Write databit while clock is low
if((F_value & maske) == maske){ digitalWrite(dataPin, 1);}
else{digitalWrite(dataPin, 0);}
//change clock to high and keep data stable
digitalWrite(clockPin, 1);
}
//Acknowledge
digitalWrite(clockPin, 0);
digitalWrite(clockPin, 1);
}
Schreiben sieht bei mir dann so aus:
i2c_start(B10100000);
i2c_send(F_adr >> 8);
i2c_send(F_adr & 0xFF);
i2c_send(F_value);
i2c_stop();
delay(5);
Das funktioniert auch.
Auslesen soll laut Datenblatt jetzt ähnlich funktionieren:
Startsequenz, Bausteinadresse, Speicheradresse, Lesesequenz, Stop.
i2c_start(B10100000);
i2c_send(F_adr >> 8);
i2c_send(F_adr & 0xFF);
i2c_start(B10100001);
pinMode(dataPin, INPUT);
for(j=0;j<8;j++){
digitalWrite(clockPin,0);
digitalWrite(clockPin,1);
Serial.println(digitalRead(dataPin));
}
digitalWrite(clockPin,0);
digitalWrite(clockPin,1);
i2c_stop();
Zum Einlesen der Bit's ändere ich meinen Datenpin auf Input und lese bei jedem Clockimpuls den Zustand. Er gibt mir aber immer nur einsen aus.