I2C read-Funktion liest falsch aus

OP #7073737
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
Angehängte Dateien:
Beitrag #7073869 wurde von einem Moderator gelöscht.
#7082695
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.
OP #7083938
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

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren