Forum: Mikrocontroller und Digitale Elektronik C++ --> Python I²C-Command Übersetzung


von Manuel N. (manuelambaum)


Angehängte Dateien:

Lesenswert?

Hi,

Ich möchte aus einem C++ Codebeispiel den Code in Python für meinen 
Raspberry Pi umschreiben. Es handelt sich dabei um die kommunikation 
mittels I²C. In dem Codebeispiel ist von 
"soft_i2c_master_write(data_out[x]);" die rede. Wie kann ich das 
mithilfe der SMBUS-Library nachbilden?

Im Anhang befindet sich die Datei mit dem Codebeispiel. Es geht konkret 
um einen Cryptographischen Chip, für welchen es für mich keine 
geeigneten Codebeispiele in Python gibt.

Ich hoffe, jemand kann mir weiterhelfen.

Danke

von Piet (Gast)


Lesenswert?

Was konkret ist das Problem?
Die ursprüngliche Lib schreibt und liest und die SMBUS Lib kann 
schreiben und lesen.
Jetzt musst du nur anfangen.

von Stefan F. (Gast)


Lesenswert?

Ich verstehe die Frage auch nicht. Vielleicht hilft es dir (Manuel), 
erst mal den Wikipedia Artikel über I²C zu lesen, um zu verstehen, womit 
du es hier überhaupt zu tun hast.

von NichtWichtig (Gast)


Lesenswert?

Jupp, klassiches RTFM

von Manuel N. (manuelambaum)


Lesenswert?

Ich möchte wissen, was der befehl "soft_i2c_master_write(data_out[x])" 
in Python bedeuten würde. Also mit welchem smbus-befehl aus folgender 
Übersicht entspricht dem C++ 
command?:https://docs.kernel.org/i2c/smbus-protocol.html

Meiner Meinung nach müsste es "smbus.write_byte(Adresse,Data)" sein. 
Stimmt das? Und wenn mehrere male "soft_i2c_master_write(data_out[x])" 
geschrieben wird, ist es dann synonym zu 
"smbus.write_block_data(Adresse,..,...)"?

von Piet (Gast)


Lesenswert?

// schickt i2c start condition und ein byte mit addresse und write-bit

soft_i2c_master_start(cryptoauth_address | I2C_WRITE);


//schickt 9 rohbytes auf dem Bus hinterher

    for (uint8_t x = 0; x < 10; x++) {
      soft_i2c_master_write(data_out[x]);
    }

// schickt 2 rohbytes an crc, die der chip wohl erwartet

    soft_i2c_master_write(crc[0]);
    soft_i2c_master_write(crc[1]);

// schickt i2c stop condition

    soft_i2c_master_stop();

Diese separat geschickten Bytes musst du jetzt in eine Bytewurst packen 
und an den write data block übergeben. Die write byte Funktion wird 
wahrscheinlich eine separate Übertragung starten, inkl. Start und Stop 
condition (meine Vermutung). Nicht so ängstlich sein und einfach mal 
machen.

von Stefan F. (Gast)


Lesenswert?

Piet schrieb:
> Diese separat geschickten Bytes musst du jetzt in eine Bytewurst packen
> und an den write data block übergeben. Die write byte Funktion wird
> wahrscheinlich eine separate Übertragung starten, inkl. Start und Stop
> condition (meine Vermutung).

So verstehe ich die Doku auch. Allerdings ist das 
(https://docs.kernel.org/i2c/smbus-protocol.html) die Doku vom Linux 
Kernel, nicht die von Python. Verwendest du (Manuel) diese? 
https://pypi.org/project/smbus/

Die würde ich nicht benutzen, weil sie offenbar weder dokumentiert noch 
gepflegt wird. Suche dir eine andere und lies ihre Doku. Wenn du danach 
noch Fragen hast, können wir weiter diskutieren. Dann musst du uns 
allerdings mitteilen, welche Bibliothek du verwendest.

Manche wenige Bibliotheken haben separate Funktionsaufrufe zum Senden 
der Start/Stop Condition. Bei denen kannst du jedes Byte einzeln senden 
und empfangen.

Die meisten wollen aber den ganzen Block an einem Stück (Array) senden. 
Wenn du etwas empfangen willst, musst du angeben, wie viele Bytes du 
erwartest.

Manche Bibliotheken haben auch nur eine einzige Funktion die sowohl zum 
Senden als auch zum Empfangen dient. Sie macht beides nacheinander, 
sofern die jeweilige Blockgröße nicht 0 ist.

von Kaj (Gast)


Lesenswert?


von Schlaumaier (Gast)


Lesenswert?

Manuel N. schrieb:
> data_out[x]

Ist ein Binar-Array. Je nach Libs und (vielleicht möglicher) Deklaration 
meist 8 Bits groß. Man setzt vorher ALLE Bits und schiebt dann via 
Befehl ALLE auf einmal rein.

Du verwechselt da was mit einen Schieberegister wo man die Bits einzeln 
rein schiebt.

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.