C++ --> Python I²C-Command Übersetzung

OP #7134795
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
Angehängte Dateien:
OP #7134888
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,..,...)"?
Gast #7134942
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.
Gast #7135367
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.
Gast #7135467
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.

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