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?
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.
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...
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.
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.
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.
> 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?
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.
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?)