Forum: Mikrocontroller und Digitale Elektronik raspberry i2c


von futz (Gast)


Lesenswert?

Hallo
ich suche eine Möglichkeit, den raspberry pi über i2c mit einem Gerät 
kommunizieren zu lassen.
Das Problem: Das Gerät erwartet folgendes "protokoll":

START(Write)
  AnzahlderWriteDaten,

  data1,

  data2,

  ....

Restart(Read)

  Anzahl der ReadBytes

  data1,

  data2,

  ...

STOP

bedeutet: erst wenn ich das erste Byte gelesen habe, weis ich, wieviele 
bytes ich lesen muss.
Die Bibliothekten, die ich gefunden habe (bcm2835) bieten aber nur 
Befehle an, eine vorher bekannte Anzahl von Bytes zu lesen 
(bcm2835_i2c_write_read_rs).
Kennt jemand eine Bibliothek, die meinem Problem abhilfe schafft?

von Clemens L. (c_l)


Lesenswert?

Das BSC-Modul der BCM2835-Hardware will die Anzahl der Bytes vorher 
wissen.

Du könntest einfach mehr Bytes lesen (und hoffen, dass der Slave sich 
dabei nicht aufhängt).

Oder deinen eigenen I²C-Master per Bit-Banging implementieren.

von StefG (Gast)


Lesenswert?

Wenn einmal bekannt ist, wieviele Bytes für welche Read Anfrage 
zurückkommen, ist doch das kein Problem mehr?
Angenommen, das Gerät liefert für Read Befehl x immer y Bytes Daten...

von futz (Gast)


Lesenswert?

StefG schrieb:
> Angenommen, das Gerät liefert für Read Befehl x immer y Bytes Daten...

tuts eben nicht. (z.B. wenn alle verfügbaren messwerte gelesen werden 
sollen). Ich benutzte bisher immer einen PIC als I2C Master und da 
konnte man dieses Protokoll einfach handeln.

von Klaus R. (klara)


Lesenswert?

futz schrieb:
> tuts eben nicht.

Das mußt Du mal genauer erklären.

von futz (Gast)


Lesenswert?

Klaus R. schrieb:
> futz schrieb:
>> tuts eben nicht.
>
> Das mußt Du mal genauer erklären.

das Gerät nimmt ständig Messwerte auf. Ich sende dem Gerät eine 
I2C-Nachricht und erwarte als Antwort eine Bytefolge variabler Länge, 
wobei mir das erste byte sagt, wieviele Bytes noch kommen (also wieviele 
Messwerte aufgenommen wurden). Die restlichen Bytes, falls vorhanden, 
sind dann diese Messwerte.
Ich dachte, dieses System wäre furchtbar schlau.
Ich bräuchte halt eine I2C-Bibliothek, die mir erlaubt, Start, Write, 
Restart, Read und Stopp einzeln zu senden.

von Clemens L. (c_l)


Lesenswert?

futz schrieb:
> Ich bräuchte halt eine I2C-Bibliothek, die mir erlaubt, Start, Write,
> Restart, Read und Stopp einzeln zu senden.

Wie schon erwähnt, die Hardware erlaubt das nicht; da kann keine 
Bibliothek helfen.

In Software ginge das mit dem "i2c-gpio"-Treiber.
https://raspberrypi.stackexchange.com/questions/37796/how-to-use-i2c-gpio-with-raspberry-pi

von Alex G. (dragongamer)


Lesenswert?

Muss nacher am Rechner mal genauer in mein Projekt schauen, aber ich bin 
mir zu 80% sicher dass die pi4j Bibliothek im Zusammenhang mit I2c eine 
readByte Funktion besitzt.

von futz (Gast)


Lesenswert?

Gut, danke.

von StefG (Gast)


Lesenswert?

> tuts eben nicht.

Dann lies zuerst 1 Byte.
Da steht drin wieviele Bytes Messdaten vorhanden sind.
Dann lies diese Anzahl Bytes.

Oder verstehe ich das Problem immer noch nicht?

von Clemens L. (c_l)


Lesenswert?

StefG schrieb:
> Dann lies zuerst 1 Byte.
> Da steht drin wieviele Bytes Messdaten vorhanden sind.
> Dann lies diese Anzahl Bytes.

Das wären zwei Lese-Transaktionen. Die Beschreibung klingt so, als ob 
der Slave schon nach der ersten die Messwerte wegschmeißt.

von futz (Gast)


Lesenswert?

Hallo zusammen.
Da ich vor einigen Tagen bereits eine Frage zu diesem Thema hatte, jetzt 
Teil 2:
Ich benutzt die Funktion
uint8_t bcm2835_i2c_write_read_rs(char* cmds, uint32_t cmds_len, char* 
buf, uint32_t buf_len)
aus der Bibliothek http://www.airspayce.com/mikem/bcm2835/
mit der ich angeblich eine beliebige Anzahl von Bytes senden kann, 
danach ein Repeatet start erfolgt, und schließlich eine beliebige Anzahl 
von Bytes gelesen wird. Funktioniert, solange ich weniger als 12 Bytes 
(könnten auch 13, 14 oder 15 sein, keinesfalls jedoch 20) sende 
einwandfrei. Über dieser Grenze funktioniert es jedoch nicht mehr 
(raspberry bleibt hängen).
Hat jemand eine Erklärung dafür? (evtl. die gleiche Erfahrung?)

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.