I2CDeviceは、一般的なSMBUS/I2Cデバイスの相互作用パターンを扱うことを目的としたPythonフレームワークです。
このプロジェクトの目的は、I2Cデバイス用のPythonライブラリのグループアップ実装を簡単に、よりシンプルで、本質的に自己文書化することを目的としています。
これは、ハードウェアレジスタの詳細な説明と、それらを構造化された定義言語に操作する方法を分離することにより行います。
このプロジェクトは、Pythonデバイス用のパブリックAPIの作成を支援することを目的としていません。これは、ここに示されている基礎の上に構築する必要があります。
通常、すべての機能を使用する予定がなくても、実装しているデバイス内のハードウェアレジスタの1:1表現を目指す必要があります。フルレジスタセットを実装することで、将来的に新機能を簡単に追加できるようになります。
実際の例については、以下にリストされているライブラリをご覧ください。
512msなど)からの値翻訳( 0b111など)および再び戻るgetを使用して、フィールドの名前の付いたものにレジスタを読み取りますsetを使用して、トランザクションで複数のレジスタフィールドを書き込む以下の例は、LTR559のALS_CONTROLレジスタを定義し、登録アドレス0x80を定義しています。
3つのフィールドがあります。ゲイン - 実世界の値にマッピングされます - およびシングルビットフラグであるsw_reset/モード。
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 )
))値にはルックアップテーブルは必要ありませんが、関数を使用して、デバイスが理解する形式の値を変換します。
以下の例では、 i2cdevice._byte_swapを使用して、保存/取得する前に2つの16ビット値のエンディアンネスを変更します。
# 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 ) 「レジスタ」とその「ビットフィールド」は、デバイスクラスによって解釈されるハードウェアレジスタで詳細に詳細にするための一連のルールとロジックを定義します。レジスタは、 registers=()キーワード引数を使用してデバイスで宣言されます。
I2C_ADDR = 0x23
ltr559 = Device ( I2C_ADDR , bit_width = 8 , registers = (
ALS_CONTROL ,
ALS_DATA
))getメソッドを使用して、レジスタのフィールドを構成したフィールドを名前を付けて読み取ることができます。
register_values = ltr559 . get ( 'ALS_CONTROL' )
gain = register_values . gain
sw_reset = register_values . sw_reset
mode = register_values . mode getから返されたAngiantTupleは不変であり、値をハードウェアにマッピングしようとはしません。1つ以上のフィールドをレジスタに書き込むために、各フィールドのキーワード引数でsetを使用する必要があります。
ltr559 . set ( 'ALS_CONTROL' ,
gain = 4 ,
sw_reset = 1 )これにより、デバイスからレジスタ状態を読み取り、それに応じてビットフィールドを更新し、結果を書き戻します。