I2CDevice es un marco de Python destinado a tratar con patrones de interacción del dispositivo SMBUS/I2C comunes.
Este proyecto tiene como objetivo hacer que las implementaciones de grupos de las bibliotecas de Python para dispositivos I2C sean más fáciles, más simples e inherentemente autodocumentables.
Lo hace separando una descripción detallada de los registros de hardware y cómo deben manipularse en un lenguaje de definición estructurado.
Este proyecto no tiene como objetivo ayudarlo a hacer una API pública para los dispositivos Python, que deben construirse sobre los fundamentos presentados aquí.
En general, debe apuntar a una representación 1: 1 de los registros de hardware en el dispositivo que está implementando, incluso si no planea usar toda la funcionalidad. Tener el conjunto de registros completo implementado permite la fácil adición de nuevas características en el futuro.
Consulte las bibliotecas que se enumeran a continuación para ver ejemplos del mundo real.
512ms ) para registrar valores (como 0b111 ) y regresar nuevamentegetset con argumentos de palabras clave El siguiente ejemplo define el registro ALS_CONTROL en un LTR559, con la dirección de registro 0x80 .
Tiene 3 campos; Gane, que se asigna a los valores del mundo real, y SW_RESET/MODE, que son banderas de un solo bits.
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 )
))No se requiere una tabla de búsqueda para los valores, sin embargo, se puede usar una función para traducir valores de y a un formato que el dispositivo entiende.
El siguiente ejemplo usa i2cdevice._byte_swap para cambiar la endianness de dos valores de 16 bits antes de que se almacenen/recuperen.
# 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 ) Un "Registro" y su "Bitfield" definen un conjunto de reglas y lógica para detalles con el registro de hardware que interpreta la clase de dispositivo. Los registros se declaran en un dispositivo utilizando el argumento de palabras clave registers=() :
I2C_ADDR = 0x23
ltr559 = Device ( I2C_ADDR , bit_width = 8 , registers = (
ALS_CONTROL ,
ALS_DATA
)) Uno configurado Los campos de un registro se pueden leer en un TameTuple utilizando el método get :
register_values = ltr559 . get ( 'ALS_CONTROL' )
gain = register_values . gain
sw_reset = register_values . sw_reset
mode = register_values . mode El NameTuple devuelto de get es inmutable y no intenta mapear los valores al hardware, para escribir uno o más campos en un registro que debe set con un argumento de palabras clave para cada campo:
ltr559 . set ( 'ALS_CONTROL' ,
gain = 4 ,
sw_reset = 1 )Esto leerá el estado de registro desde el dispositivo, actualizará los bitfields en consecuencia y volverá a escribir el resultado.