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。
在这些板上可用
-
class
i2cperipheral.
I2CPeripheral
(scl: microcontroller.Pin, sda: microcontroller.Pin, addresses: Sequence[int], smbus: bool = False)¶ 两线串行协议外设
I2C 是一种用于设备间通信的两线协议。这实现了外围(传感器、次级)侧。
- 参数
-
__enter__
(self) → I2CPeripheral¶ 上下文管理器中使用的无操作。
-
__exit__
(self) → None¶ 在上下文退出时自动取消初始化硬件。有关更多信息,请参阅 Lifetime 和 ContextManagers 。
-
request
(self, timeout: float = - 1) → I2CPeripheralRequest¶ 等待 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¶ 上下文管理器中使用的无操作。
-
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