Verständnis Probleme I2C und Mega und Wire

Hallo,

ich bin neu in der Arduino Welt und habe mir eine Projekt vorgenommen. Das Prograammieren ist nicht das Problem, aber die Umsetzung hinkt.

Zur Sache:

Ich möchte mit einem MEGA ein Register aus einem ST Dev Board auslesen.
Der Chip auf dem dev Board ist ein STWLC33.
Ich benötige etwas Hilfe dabei den Code zu schreiben. Ich verstehe nicht wie ich Wire laut der Interface Beschreibung des STWLC33 Datenblatt konfigurieren muss.

Ich würde euch zum Ausdruck meiner recht hohen Motivation gerne etwas Code präsentieren.
Jedoch war das bisher nichts brauchbares. :confused:

Ich habe mit I2C zwar schon Register anderer Chips ausgelesen, jedoch waren mir dabei Bibliotheken aus dem WWW behilflich.

Ich bin für jede Hilfe dankbar.

8.8 Reading from a single register

The reading operation starts with a START bit followed by 7-bit device address of the STWLC33.
The 8th bit is the R/W bit, which is 0 in this case.
The STWLC33 confirms to receive the address + R/W bit by an acknowledge pulse.
The address of the register, which should be read, is sent afterward and confirmed again by an acknowledge pulse of the STWLC33 again.
The master generates a START bit again and sends the device address followed by the R/W bit, which is 1 now.
The STWLC33 confirms to receive the address + R/W bit by an acknowledge pulse and starts to send the data to the master.
No acknowledge pulse from the master is required after receiving the data. Then the master generates a STOP bit to terminate the communication.

Das Datenblatt in diesem Link:
https://www.st.com/resource/en/datasheet/stwlc33.pdf

Wichtig sind für dich eigentlich die Seiten 33 und 34 des Datenblattes.

Die I2C-Adresse deines Sensors lautet 0x61

Danach musst du auf das zugreifen, was du auslesen willst oder die Daten anfragen (steht eigentlich immer im Datsheet).

Guck dir mal ein Beispielsketch von der Wire-Bibliothek an, dann sollte das eventuell klar werden.

Den ganzen Kram mit R/W-Bits und Start Stop Conditions nimmt dir die Wire Bibliothek ab.

Schreiben:

Wire.beginTransmission(device_adr);
Wire.write(adr);  //Adresse im Speicher
Wire.write(data);
Wire.endTransmission();

Hier gibt man die Anfangsadresse an und kann auch mehrere Bytes schreibe. Der Adresszeiger inkrementiert automatisch

Lesen:

Wire.beginTransmission(device_adr);
Wire.write(adr);     //Speicherzelle bei der das Lesen anfängt
Wire.endTransmission();

Wire.requestFrom(device_adr, 1);
if (Wire.available())
{
   byte data = Wire.read();
   ...
}

Man kann da auch mehr als ein Byte anfordern und in einer for-Schleife lesen

Danke für eure Hilfestellungen.
Ich habe es jetzt geschnallt:

Meine eigentliche Mission ist es ja Daten über die Qi Verbindung auszutauschen.
Habt ihr evtl. dazu auch ein paar Hinweise?
Die ganzen Register die mit dem senden von Daten zusammen hängen, oder notwenig sind wirken auf mich gerade noch sehr kryptisch.

So funktioniert das Auslesen:

#include <Wire.h>

void setup(){
  Serial.begin(57600);
  Serial.println("Start"); 
}

void loop(){
Wire.begin();
Wire.beginTransmission(0x61);    
Wire.write(0x35);                               
Wire.requestFrom(0x61,1);          
byte example = Wire.read();        
Wire.endTransmission();                   
Serial.println(example);
delay(500);
}

Da hast du gleich zwei Fehler gemacht:

1.) begin() macht man nur einmal in setup()
2.) endTransmission() sendet die Daten die im Ausgangspuffer stehen. Nach dem Lesen hat das nichts zu suchen

Ahh, danke.

das begin rutsche ich nach oben.

Deinen Hinweis auf Wire.endTransmission(); verstehe ich nicht ganz. In deinem Beispiel hast du es ebenfalls verwendet. Bzw. wo ist der Unterschied zwischen unserem Wire.endTransmission();?

Das habe ich leider nicht verstanden.

Edit:
Alles klar "nach dem lesen". :slight_smile: Habs verstanden.

endTransmission() schließt das SENDEN ab. write() schreibt Daten in einen Puffer. endTransmission() sendet den Puffer.

Beim Lesen schickt man zuerst die Speicherzelle an der man mit dem Lesen anfangen möchte. Das muss natürlich geschehen bevor man die Daten empfängt