I2Cdevice - это рамка Python, предназначенная для работы с общими шаблонами взаимодействия устройств SMBU/I2C.
Этот проект направлен на то, чтобы облегчить реализации библиотек Python для устройств I2C, более простые и по своей природе самоокументирование.
Это происходит путем разделения подробного описания регистров аппаратного обеспечения и того, как им следует манипулировать на языке структурированного определения.
Этот проект не направлен на то, чтобы помочь вам сделать публичный API для устройств Python- который должен быть построен на вершине основных принципов, представленных здесь.
Как правило, вы должны стремиться к представлению оборудования для аппаратных регистров в устройстве, которое вы реализуете, даже если вы не планируете использовать всю функциональность. Внедрение полного набора регистра позволяет легко добавить новые функции в будущем.
Проверьте библиотеки, перечисленные ниже для примеров реального мира.
512ms ) для регистрации значений (таких как 0b111 ) и обратно сноваgetset с аргументами ключевых слов Приведенный ниже пример определяет регистр ALS_CONTROL на LTR559, с адресом регистра 0x80 .
У него есть 3 поля; Получение - который сопоставлен с ценностями реального мира - и SW_RESET/MODE, которые представляют собой однобиточные флаги.
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 , чтобы изменить эндоуность двух 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 NameTuple, возвращаемый из get является неизменным и не пытается отобразить значения обратно на аппаратное обеспечение, чтобы написать одно или несколько полей в регистр, вы должны использовать set с аргументом ключевого слова для каждого поля:
ltr559 . set ( 'ALS_CONTROL' ,
gain = 4 ,
sw_reset = 1 )Это будет считывать состояние регистра с устройства, соответственно обновить BitFields и написать результат обратно.