Forum: Mikrocontroller und Digitale Elektronik I2C read-Funktion liest falsch aus


von Danny F. (danny_f)


Angehängte Dateien:

Lesenswert?

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.
von Bernd (Gast)


Lesenswert?

Kannst du mal die Protokollbeschreibung verlinken?
Ich habe nur die Produktseite mit dem Datenblatt gefunden:
https://labsmith.com/products/uprocess-syringe-pump-sps01/

von Danny F. (danny_f)


Lesenswert?


von Thomas Z. (usbman)


Lesenswert?

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.

von (prx) A. K. (prx)


Lesenswert?

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
von Peter D. (peda)


Lesenswert?

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.

von Danny F. (danny_f)


Lesenswert?

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
Noch kein Account? Hier anmelden.