Adafruit CircuitPython Bus Device

5.2.16 · active · verified Thu Apr 16

Adafruit CircuitPython Bus Device provides helper classes, `I2CDevice` and `SPIDevice`, to simplify managing transaction state on I2C and SPI buses. It handles bus locking, device addressing for I2C, and chip select and protocol changes for SPI. The library is actively maintained by Adafruit, with frequent releases to address bug fixes and add minor enhancements. The current version is 5.2.16.

Common errors

Warnings

Install

Imports

Quickstart

This quickstart demonstrates how to use `I2CDevice` and `SPIDevice` to perform basic read operations. It initializes the respective bus, creates a device object, and uses a `with` statement to manage bus locking and chip select automatically during transactions. Replace placeholder addresses and pins with your specific hardware configuration. For CPython, ensure `adafruit-blinka` is installed and GPIO/bus access is configured.

import board
import busio
import digitalio
from adafruit_bus_device.i2c_device import I2CDevice
from adafruit_bus_device.spi_device import SPIDevice

# --- I2C Example ---
# Replace with your actual I2C device address (e.g., 0x68 for DS3231)
I2C_DEVICE_ADDRESS = 0x68
I2C_REGISTER_ADDRESS = 0x0E # Example register

print("--- I2C Device Example ---")
try:
    # Initialize I2C bus
    i2c = busio.I2C(board.SCL, board.SDA)
    # Create an I2CDevice object
    i2c_device = I2CDevice(i2c, I2C_DEVICE_ADDRESS)

    # Perform an I2C transaction
    with i2c_device:
        i2c_device.write(bytes([I2C_REGISTER_ADDRESS]))
        result = bytearray(1)
        i2c_device.readinto(result)
    print(f"I2C read from 0x{I2C_DEVICE_ADDRESS:02X}, register 0x{I2C_REGISTER_ADDRESS:02X}: {result[0]:02X}")
except Exception as e:
    print(f"I2C Example Error: {e}")
finally:
    if 'i2c' in locals() and i2c.locked: i2c.unlock() # Ensure bus is unlocked

# --- SPI Example ---
# Replace with your actual SPI settings and CS pin
SPI_REGISTER_ADDRESS = 0xD0 # Example register for BMP280

print("\n--- SPI Device Example ---")
try:
    # Initialize SPI bus and Chip Select pin
    spi_bus = busio.SPI(board.SCK, MOSI=board.MOSI, MISO=board.MISO)
    cs_pin = digitalio.DigitalInOut(board.D5) # Use an appropriate digital pin

    # Create an SPIDevice object
    spi_device = SPIDevice(spi_bus, cs_pin)

    # Perform an SPI transaction
    with spi_device as spi:
        spi.write(bytes([SPI_REGISTER_ADDRESS]))
        result = bytearray(1)
        spi.readinto(result)
    print(f"SPI read from register 0x{SPI_REGISTER_ADDRESS:02X}: {result[0]:02X}")
except Exception as e:
    print(f"SPI Example Error: {e}")
finally:
    if 'spi_bus' in locals() and spi_bus.locked: spi_bus.unlock() # Ensure bus is unlocked

print("Examples complete.")

view raw JSON →