Hallo, ich versuche über einen Raspberry Pi die SPS01 Mikrofluidikpumpen von Labsmith anzusteuern. Diese erlauben die I2C-Ansteuerung. Die Pumpe habe ich an einen Logic Analyzer angeschlossen, um mir die Bitmanipulation anschauen zu können. Ich benutze die SMBus library, da diese die gleichen Sende- und Abfrageprotokolle benutzt wie die Pumpen (gelistet im Datenblatt). Die Write-Funktion tut was sie soll auf Bit-Ebene, die Read-Funktion leider nicht. Hier mein Code, die denkbar einfachste Registeransteuerung. from smbus import SMBus import time bus=SMBus(1) i2caddress = 0x28 value = [0x55, 0x7f] bus.write_block_data(i2caddress, 0x08, value) # works just fine answer = bus.read_word_data (i2caddress, 0x09) # from getmode register print(answer) Im Anhang ein Foto des Logic Analyzers. Die Read-Funktion gibt immer 0xEE und 0x00 aus, egal welches Register ich auslese. Die Befehlsstruktur stimmt allerdings. Kann ich die SMBus library doch nicht benutzen oder ist die Lösung viel einfacher... Vielen Dank
:
Verschoben durch Moderator
Beitrag #7073869 wurde von einem Moderator gelöscht.
Kannst du mal die Protokollbeschreibung verlinken? Ich habe nur die Produktseite mit dem Datenblatt gefunden: https://labsmith.com/products/uprocess-syringe-pump-sps01/
Hallo, gerne. Hier ein Link zum Handbuch: http://www.revodix.co.kr/wp-content/uploads/2015/08/LabSmith-uDevice-Electrical-Interface_0315.pdf Danke
Danny F. schrieb: > gerne. Hier ein Link zum Handbuch: und dort steht bei CS_GETMODE (0x09) dass keine Parameter und keine Daten kommen. Was das x09 Kommando dann genau macht ist seltsam, jedenfalls kann es keinen Mode liefern. Ich würde ja erst einmal GetName ausprobieren.
Aus der verlinkten Doku geht hervor, dass es sich dabei um einen PIC 18F µC handelt, der wenig überraschend Clock Stretching nutzt. Und das kann der RasPi nicht richtig. Also so weit mit dem I2C-Takt runter gehen, bis es funktioniert.
:
Bearbeitet durch User
Danny F. schrieb: > Die Read-Funktion gibt immer > 0xEE und 0x00 aus Nun, lt. Handbuch bedeutet das: "command not executed". Und damit dürfte er Recht haben. Es sind mindestens 4 Bytes zu senden, Du sendest aber nur 2. Write packet sequence: S / Addr<<1 | 0 <Ack>/ Cnt <Ack> / Cmd <Ack> /{optional data block Data1/<Ack>…DataN<Ack>}/Chksum<Ack>/ P Ohne korrekte Checksumme wird er immer nur 0xEE antworten.
Ich müsste nun also an die Pumpen angepasste Read- und Write-Befehlstrukturen basteln um den Datenaustausch zu ermöglichen? Es scheint ja so, dass die SMBus Read-Funktion die Register nicht richtig auslesen kann, das es bei jeder Ansprache 0xEE auswirft. (laut Datenblatt passiert dies, bei nicht übereinstimmender packet sequence) Wie schreibe und implementiere ich diese Befehle nun? Da müsste ich wahrscheinlich in C++ machen oder? Gibt es eine Library die diese Ansprache auf Bit-level ermöglicht? Was genau muss dafür entworfen werden? Vielen Dank
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.