I2CDevice ist ein Python -Framework, das sich mit gemeinsamen SMBUS/I2C -Geräte -Interaktionsmustern befassen.
Dieses Projekt zielt darauf ab, Gruppenimplementierungen von Python-Bibliotheken für I2C-Geräte einfacher, einfacher und von Natur aus selbstdokumentiert zu machen.
Dies geschieht, indem eine detaillierte Beschreibung der Hardware -Register getrennt wird und wie sie in eine strukturierte Definitionssprache manipuliert werden sollten.
Dieses Projekt soll Ihnen nicht helfen, eine öffentliche API für Python-Geräte zu erstellen, die auf den hier vorgestellten Grundlagen aufgebaut werden sollten.
Sie sollten im Allgemeinen eine 1: 1 -Darstellung der Hardware -Register in dem von Ihnen implementierten Gerät anstreben, auch wenn Sie nicht planen, alle Funktionen zu verwenden. Durch das implementierte vollständige Register -Set können neue Funktionen in Zukunft leicht hinzugefügt werden.
Schauen Sie sich die unten aufgeführten Bibliotheken an, um Beispiele für reale Welt zu erhalten.
512ms ), um Werte (z. B. 0b111 ) und wieder zurück zu registrierengetset mit Keyword -Argumenten Das folgende Beispiel definiert das ALS_CONTROL -Register in einem LTR559 mit Registeradresse 0x80 .
Es hat 3 Felder; Gewinn - der auf reale Werte der realen Welt zugeordnet ist - und SW_Reset/Modus, die einzelne Bitflags sind.
ALS_CONTROL = Register ( 'ALS_CONTROL' , 0x80 , fields = (
BitField ( 'gain' , 0b00011100 , values_map = { 1 : 0b000 , 2 : 0b001 , 4 : 0b011 , 8 : 0b011 , 48 : 0b110 , 96 : 0b111 }),
BitField ( 'sw_reset' , 0b00000010 ),
BitField ( 'mode' , 0b00000001 )
))Für Werte ist keine Nachschlagetabelle erforderlich. Eine Funktion kann jedoch verwendet werden, um Werte von und in ein Format zu übersetzen, das das Gerät versteht.
Das folgende Beispiel verwendet i2cdevice._byte_swap , um die Endiantheit von zwei 16 -Bit -Werten zu ändern, bevor sie gespeichert/abgerufen werden.
# This will address 0x88, 0x89, 0x8A and 0x8B as a continuous 32bit register
ALS_DATA = Register ( 'ALS_DATA' , 0x88 , fields = (
BitField ( 'ch1' , 0xFFFF0000 , bitwidth = 16 , values_in = _byte_swap , values_out = _byte_swap ),
BitField ( 'ch0' , 0x0000FFFF , bitwidth = 16 , values_in = _byte_swap , values_out = _byte_swap )
), read_only = True , bitwidth = 32 ) Ein "Register" und sein "Bitfield" definieren eine Reihe von Regeln und Logik für Details mit dem Hardware -Register, das von der Geräteklasse interpretiert wird. Die Register werden auf einem Gerät unter Verwendung des Schlüsselwortarguments registers=() deklariert:
I2C_ADDR = 0x23
ltr559 = Device ( I2C_ADDR , bit_width = 8 , registers = (
ALS_CONTROL ,
ALS_DATA
)) Eine konfigurierte Felder eines Registers können mit der get -Methode in einen benannten Tuple gelesen werden:
register_values = ltr559 . get ( 'ALS_CONTROL' )
gain = register_values . gain
sw_reset = register_values . sw_reset
mode = register_values . mode Das von get zurückgegebene benannte Tuple ist unveränderlich und versucht nicht, Werte an die Hardware zurückzugeben. Um ein oder mehrere Felder in ein Register zu schreiben, müssen Sie für jedes Feld mit einem Schlüsselwortargument set werden:
ltr559 . set ( 'ALS_CONTROL' ,
gain = 4 ,
sw_reset = 1 )Dadurch wird der Registerstatus vom Gerät aus gelesen, die Bitfields entsprechend aktualisiert und das Ergebnis zurückgeschrieben.