O i2CDevice é uma estrutura Python destinada a lidar com padrões de interação comuns de dispositivo SMBUS/I2C.
Este projeto tem como objetivo tornar as implementações em grupo das bibliotecas Python para dispositivos I2C mais fáceis, mais simples e inerentemente autocumentos.
Faz isso separando uma descrição detalhada dos registros de hardware e como eles devem ser manipulados em um idioma de definição estruturado.
Este projeto não pretende ajudá-lo a criar uma API pública para dispositivos Python- que deve ser construído sobre os fundamentos apresentados aqui.
Geralmente, você deve buscar uma representação 1: 1 dos registros de hardware no dispositivo que você está implementando, mesmo que não planeje usar toda a funcionalidade. Ter o conjunto de registros completo implementado permite a fácil adição de novos recursos no futuro.
Confira as bibliotecas listadas abaixo para exemplos do mundo real.
512ms ) para registrar valores (como 0b111 ) e de voltagetset com argumentos de palavras -chave O exemplo abaixo define o registro ALS_CONTROL em um LTR559, com endereço de registro 0x80 .
Tem 3 campos; Ganho - que é mapeado para valores do mundo real - e sw_reset/modo que são sinalizadores de bits únicos.
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 )
))Uma tabela de pesquisa não é necessária para valores, no entanto, uma função pode ser usada para traduzir valores e para um formato que o dispositivo entende.
O exemplo abaixo usa i2cdevice._byte_swap para alterar a endianidade de dois valores de 16 bits antes de serem armazenados/recuperados.
# 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 ) Um "registro" e seu "campo de bits" definem um conjunto de regras e lógica para detalhes com o registro de hardware, que é interpretado pela classe de dispositivo. Os registros são declarados em um dispositivo usando o argumento registers=() da palavra -chave:
I2C_ADDR = 0x23
ltr559 = Device ( I2C_ADDR , bit_width = 8 , registers = (
ALS_CONTROL ,
ALS_DATA
)) Um configurou os campos de um registro pode ser lido em um nome nomeado usando o método get :
register_values = ltr559 . get ( 'ALS_CONTROL' )
gain = register_values . gain
sw_reset = register_values . sw_reset
mode = register_values . mode O nome do nome retornado do get é imutável e não tenta mapear os valores de volta ao hardware, a fim de escrever um ou mais campos em um registro, você deve usar set com um argumento de palavra -chave para cada campo:
ltr559 . set ( 'ALS_CONTROL' ,
gain = 4 ,
sw_reset = 1 )Isso lerá o estado do registro do dispositivo, atualizará os Bitfields de acordo e escreverá o resultado de volta.