I2CDevice adalah kerangka kerja Python yang bertujuan berurusan dengan pola interaksi perangkat SMBU/I2C yang umum.
Proyek ini bertujuan untuk membuat implementasi kelompok Python Libraries untuk perangkat I2C lebih mudah, lebih sederhana dan secara inheren mendokumentasikan diri.
Ini melakukan ini dengan memisahkan deskripsi terperinci tentang register perangkat keras dan bagaimana mereka harus dimanipulasi menjadi bahasa definisi terstruktur.
Proyek ini tidak bertujuan untuk membantu Anda membuat API publik untuk perangkat Python- yang harus dibangun di atas dasar-dasar yang disajikan di sini.
Anda umumnya harus bertujuan untuk representasi 1: 1 dari register perangkat keras di perangkat yang Anda terapkan, bahkan jika Anda tidak berencana untuk menggunakan semua fungsionalitas. Memiliki set register lengkap yang diimplementasikan memungkinkan penambahan fitur baru yang mudah di masa depan.
Lihatlah perpustakaan yang tercantum di bawah ini untuk contoh dunia nyata.
512ms ) untuk mendaftarkan nilai (seperti 0b111 ) dan kembali lagigetset dengan argumen kata kunci Contoh di bawah ini mendefinisikan register ALS_CONTROL pada LTR559, dengan alamat register 0x80 .
Ini memiliki 3 bidang; Gain - yang dipetakan ke nilai dunia nyata - dan SW_reset/mode yang merupakan bendera bit tunggal.
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 )
))Tabel pencarian tidak diperlukan untuk nilai, namun, fungsi dapat digunakan untuk menerjemahkan nilai dari dan ke format yang dipahami perangkat.
Contoh di bawah ini menggunakan i2cdevice._byte_swap untuk mengubah endianness dari dua nilai 16bit sebelum disimpan/diambil.
# 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 ) A "Register" dan "Bitfield" -nya menentukan seperangkat aturan dan logika untuk merinci dengan register perangkat keras yang ditafsirkan oleh kelas perangkat. Register dinyatakan pada perangkat menggunakan argumen kata kunci registers=() :
I2C_ADDR = 0x23
ltr559 = Device ( I2C_ADDR , bit_width = 8 , registers = (
ALS_CONTROL ,
ALS_DATA
)) Satu yang dikonfigurasi bidang register dapat dibaca ke dalam namedtuple menggunakan metode get :
register_values = ltr559 . get ( 'ALS_CONTROL' )
gain = register_values . gain
sw_reset = register_values . sw_reset
mode = register_values . mode NamedTuple yang dikembalikan dari get tidak dapat diubah dan tidak mencoba memetakan nilai kembali ke perangkat keras, untuk menulis satu atau lebih bidang ke register yang harus Anda gunakan set dengan argumen kata kunci untuk setiap bidang:
ltr559 . set ( 'ALS_CONTROL' ,
gain = 4 ,
sw_reset = 1 )Ini akan membaca status register dari perangkat, memperbarui bitfields yang sesuai dan menulis hasilnya kembali.