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

Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt. Bitte hier nur auf die ursprüngliche Frage antworten, für neue Fragen einen neuen Beitrag erstellen.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.