I2CDevice est un cadre Python visant à traiter les modèles d'interaction de périphérique SMBUS / I2C communs.
Ce projet vise à faciliter les implémentations en groupe des bibliothèques Python pour les appareils I2C plus faciles, plus simples et intrinsèquement auto-documentés.
Il le fait en séparant une description détaillée des registres matériels et comment ils doivent être manipulés en un langage de définition structuré.
Ce projet ne vise pas à vous aider à créer une API publique pour les appareils Python - qui devrait être construit en plus des fondamentaux présentés ici.
Vous devez généralement viser une représentation 1: 1 des registres matériels dans l'appareil que vous implémentez, même si vous ne prévoyez pas d'utiliser toutes les fonctionnalités. Le fait que l'ensemble de registre complet est implémenté permet l'ajout facile de nouvelles fonctionnalités à l'avenir.
Consultez les bibliothèques énumérées ci-dessous pour des exemples du monde réel.
512ms ) pour enregistrer les valeurs (telles que 0b111 ) et vice-versagetset avec des arguments de mots clés L'exemple ci-dessous définit le registre ALS_CONTROL sur un LTR559, avec l'adresse du registre 0x80 .
Il a 3 champs; gain - qui est mappé aux valeurs du monde réel - et sw_reset / mode qui sont des indicateurs de 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 )
))Une table de recherche n'est pas requise pour les valeurs, cependant, une fonction peut être utilisée pour traduire les valeurs et un format que l'appareil comprend.
L'exemple ci-dessous utilise i2cdevice._byte_swap pour modifier la Endianness de deux valeurs 16 bits avant d'être stockées / récupérées.
# 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 "registre" et son "Bitfield" définissent un ensemble de règles et de logique pour les détails avec le registre matériel qui est interprété par la classe de périphérique. Les registres sont déclarés sur un appareil à l'aide de l'argument de mot-clé registers=() :
I2C_ADDR = 0x23
ltr559 = Device ( I2C_ADDR , bit_width = 8 , registers = (
ALS_CONTROL ,
ALS_DATA
)) L'un des champs configurés d'un registre peut être lu dans un NamedTuple en utilisant la méthode get :
register_values = ltr559 . get ( 'ALS_CONTROL' )
gain = register_values . gain
sw_reset = register_values . sw_reset
mode = register_values . mode Le NamedTuple renvoyé de get est immuable et n'essaie pas de ramener les valeurs au matériel, afin d'écrire un ou plusieurs champs dans un registre, vous devez utiliser set avec un argument de mot-clé pour chaque champ:
ltr559 . set ( 'ALS_CONTROL' ,
gain = 4 ,
sw_reset = 1 )Cela lira l'état de registre à partir de l'appareil, mettra à jour les champs de bit en conséquence et rédigera le résultat.