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.
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
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?)
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.