Skip to main content

i2cdevice

Build Status Coverage Status PyPi Package Python Versions

i2cdevice is a Python framework aimed at dealing with common SMBus/i2c device interaction patterns.

This project aims to make group-up implementations of Python libraries for i2c devices easier, simpler and inherently self-documenting.

It does this by separating a detailed description of the hardware registers and how they should be manipulated into a structured definition language.

This project does not aim to help you make a public API for Python devices- that should be built on top of the fundamentals presented here.

Using This Library

You should generally aim for a 1:1 representation of the hardware registers in the device you're implementing, even if you don't plan to use all the functionality. Having the full register set implemented allows for the easy addition of new features in future.

Check out the libraries listed below for real-world examples.

Features

  • Classes for describing devices, registers and individual bit fields within registers in a fashion which maps closely with the datasheet
  • Value translation from real world numbers (such as 512ms) to register values (such as 0b111) and back again
  • Read registers into a namedtuple of fields using get
  • Write multiple register fields in a transaction using set with keyword arguments
  • Support for treating multiple-bytes as a single value, or single register with multiple values

Built With i2cdevice

Examples

The below example defines the ALS_CONTROL register on an ltr559, with register address 0x80.

It has 3 fields; gain - which is mapped to real world values - and sw_reset/mode which are single bit flags.

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)
))

A lookup table is not required for values, however, a function can be used to translate values from and to a format that the device understands.

The below example uses i2cdevice._byte_swap to change the endianness of two 16bit values before they are stored/retrieved.

# 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" and its "BitField"s define a set of rules and logic for detailing with the hardware register which is interpreted by the device class. Registers are declared on a device using the registers=() keyword argument:

I2C_ADDR = 0x23
ltr559 = Device(I2C_ADDR, bit_width=8, registers=(
	ALS_CONTROL,
	ALS_DATA
))

Reading Registers

One configured a register's fields can be read into a namedtuple using the get method:

register_values = ltr559.get('ALS_CONTROL')
gain = register_values.gain
sw_reset = register_values.sw_reset
mode = register_values.mode

Writing Registers

The namedtuple returned from get is immutable and does not attempt to map values back to the hardware, in order to write one or more fields to a register you must use set with a keyword argument for each field:

ltr559.set('ALS_CONTROL',
           gain=4,
           sw_reset=1)

This will read the register state from the device, update the bitfields accordingly and write the result back.

1.0.0

  • Enhancement: Repackage to pyproject.toml/hatchling
  • Switch i2c_dev fallback from smbus to smbus2

0.0.7

  • BugFix: Prevent .get from reading multiple times (thanks @dkao)
  • Enhancement: Better error output (thanks Kamil Klimek)

0.0.6

  • New API methods set and get

0.0.5

  • Bump to stable release

0.0.4

  • Bugfixes

0.0.3

  • Added License

0.0.2

  • Major Refactor

0.0.1

  • Initial Release

Release files for i2cdevice 1.0.0

For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.

Source distribution (sdist)

Source distribution for i2cdevice 1.0.0
File Size Uploaded
i2cdevice-1.0.0.tar.gz 17.0 kB Details

Built distribution (wheel)

Table of built distributions (wheels) for i2cdevice 1.0.0
File Interpreter ABI Platform
i2cdevice-1.0.0-py3-none-any.whl Python 3 none any Details

Total release size: 27.8 kB

Release files / i2cdevice-1.0.0.tar.gz

Download URL i2cdevice-1.0.0.tar.gz
Size 17.0 kB
Tags Source
SHA-256 checksum
How to use checksums
a9a5d1666a11b6733d16c73f148fc85cba767dd1b976e5bcc56ad970986c96c4
BLAKE2b-256 checksum
How to use checksums
c39f017fbfac4f1c69be128b59f432a16d5d9559794c1975c926bd549596bbfe
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/4.0.2 CPython/3.11.2

Release files / i2cdevice-1.0.0-py3-none-any.whl

Download URL i2cdevice-1.0.0-py3-none-any.whl
Size 10.8 kB
Tags Python 3
SHA-256 checksum
How to use checksums
595cfa3815aab4d8a4bbe1cbd4a4e1271d56cf7c1de367eab6a94dd80566f0c1
BLAKE2b-256 checksum
How to use checksums
250c38c1b44e9233378fad579ce89040d934d12c53ed8536982ad26a6a3bab7f
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/4.0.2 CPython/3.11.2

Release history Release notifications | RSS feed

This release

1.0.0 This release

2 release files

0.0.7

3 release files

0.0.6

3 release files

0.0.5

3 release files

0.0.4

3 release files

0.0.3

3 release files

0.0.2

3 release files

0.0.1

1 release file

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page