i2cperipheral –两线串行协议外设

i2cperipheral 模块包含支持 I2C 外设的类。

模拟具有 2 个地址(读和写)的外设的示例:

import board
from i2cperipheral import I2CPeripheral

regs = [0] * 16
index = 0

with I2CPeripheral(board.SCL, board.SDA, (0x40, 0x41)) as device:
    while True:
        r = device.request()
        if not r:
            # Maybe do some housekeeping
            continue
        with r:  # Closes the transfer if necessary by sending a NACK or feeding dummy bytes
            if r.address == 0x40:
                if not r.is_read:  # Main write which is Selected read
                    b = r.read(1)
                    if not b or b[0] > 15:
                        break
                    index = b[0]
                    b = r.read(1)
                    if b:
                        regs[index] = b[0]
                elif r.is_restart:  # Combined transfer: This is the Main read message
                    n = r.write(bytes([regs[index]]))
                #else:
                    # A read transfer is not supported in this example
                    # If the microcontroller tries, it will get 0xff byte(s) by the ctx manager (r.close())
            elif r.address == 0x41:
                if not r.is_read:
                    b = r.read(1)
                    if b and b[0] == 0xde:
                        # do something
                        pass

本示例设置了一个可以从 Linux 访问的 I2C 设备,如下所示:

$ i2cget -y 1 0x40 0x01
0x00
$ i2cset -y 1 0x40 0x01 0xaa
$ i2cget -y 1 0x40 0x01
0xaa

警告

I2CPeripheral 利用时钟延长来减慢主机的速度。确保 I2C 主机支持这一点。

Raspberry Pi 的 I2C 硬件模块尤其不支持此功能。这可以通过使用 i2c-gpio bit banging 驱动程序来解决。由于 RPi 固件使用 hw i2c,因此无法模拟 HAT eeprom。

在这些板上可用
  • Adafruit EdgeBadge
  • Adafruit Feather M4 CAN
  • Adafruit Feather M4 Express
  • Adafruit Grand Central M4 Express
  • Adafruit Hallowing M4 Express
  • Adafruit ItsyBitsy M4 Express
  • Adafruit Matrix Portal M4
  • Adafruit Metro M4 Airlift Lite
  • Adafruit Metro M4 Express
  • Adafruit Monster M4SK
  • Adafruit PyGamer
  • Adafruit PyPortal
  • Adafruit PyPortal Pynt
  • Adafruit PyPortal Titano
  • Adafruit Pybadge
  • Adafruit Trellis M4 Express
  • AloriumTech Evo M51
  • BDMICRO VINA-D51
  • CP32-M4
  • Capable Robot Programmable USB Hub
  • CircuitBrains Deluxe
  • DynOSSAT-EDU-OBC
  • Mini SAM M4
  • PyCubedv04
  • PyCubedv04-MRAM
  • PyCubedv05
  • PyCubedv05-MRAM
  • Robo HAT MM1 M4
  • SAM E54 Xplained Pro
  • SAM32v26
  • Seeeduino Wio Terminal
  • Silicognition LLC M4-Shim
  • SparkFun MicroMod SAMD51 Processor
  • SparkFun Thing Plus - SAMD51
  • Sprite_v2b
  • TG-Boards' Datalore IP M4
  • The Open Book Feather
  • UARTLogger II

class i2cperipheral.I2CPeripheral(scl: microcontroller.Pin, sda: microcontroller.Pin, addresses: Sequence[int], smbus: bool = False)

两线串行协议外设

I2C 是一种用于设备间通信的两线协议。这实现了外围(传感器、次级)侧。

参数
  • scl (Pin) – 时钟引脚

  • sda (Pin) – 数据引脚

  • addresses (list[int]) – 要响应的 I2C 地址(多少取决于硬件)。

  • smbus (bool) – 如果硬件支持,则使用 SMBUS 计时

deinit(self)None

释放对底层硬件的控制,以便其他类可以使用它。

__enter__(self)I2CPeripheral

上下文管理器中使用的无操作。

__exit__(self)None

在上下文退出时自动取消初始化硬件。有关更多信息,请参阅 Lifetime 和 ContextManagers

request(self, timeout: float = - 1)I2CPeripheralRequest

等待 I2C 请求。

参数

timeout (float) – 以秒为单位的超时时间。零表示永远等待,负值表示检查一次

返回

I2C Slave Request 或 None 如果 timeout=-1 并且没有请求

返回类型

I2C外设请求

class i2cperipheral.I2CPeripheralRequest(peripheral: I2CPeripheral, address: int, is_read: bool, is_restart: bool)

关于 I2C 传输请求的信息 这不能直接实例化,而是由 返回I2CPeripheral.request()

参数
  • peripheral – 接收此请求的 I2CPeripheral 对象

  • address – I2C 地址

  • is_read – 如果主要外设正在请求数据,则为真

  • is_restart – 重复启动条件

address :int

请求的 I2C 地址。

is_read :bool

I2C 主控制器正在从该外设读取数据。

is_restart :bool

是重复启动条件。

__enter__(self)I2CPeripheralRequest

上下文管理器中使用的无操作。

__exit__(self)None

关闭请求。

read(self, n: int = - 1, ack: bool = True)bytearray

读取数据。如果 ack=False,则调用者负责调用I2CPeripheralRequest.ack().

参数
  • n – 要读取的字节数(负数表示全部)

  • ack – 是否在第 n 个字节后发送 ACK

返回

读取的字节数

write(self, buffer: _typing.ReadableBuffer)int

写入缓冲区中包含的数据。

参数

buffer (ReadableBuffer) –写出这个缓冲区中的数据

返回

写入的字节数

ack(self, ack: bool = True)None

确认或不确认收到的最后一个字节。与 I2CPeripheralRequest.read()ack=False一起使用。

参数

ack –是发送 ACK 还是 NACK