bitbangio – 由 CPU 实现的数字协议¶
该 bitbangio 模块包含提供数字总线协议支持的类,无论底层硬件是否存在以使用该协议。
首先尝试使用 busio模块代替,它可以利用外围硬件来实现协议。本机实现将比 bitbanged 版本更快并具有更多功能。
如果程序在使用后继续,所有类都会更改硬件状态,并且在不再需要它们时应取消初始化。为此,请调用deinit() 或使用上下文管理器。有关更多信息,请参阅
Lifetime 和 ContextManagers。
例如:
import bitbangio
from board import *
i2c = bitbangio.I2C(SCL, SDA)
print(i2c.scan())
i2c.deinit()
此示例将初始化设备,运行
scan() ,然后 deinit()是硬件。最后一步是可选的,因为 CircuitPython 会在程序完成后自动重置硬件。
在这些板上可用
- 
class bitbangio.I2C(scl: microcontroller.Pin, sda: microcontroller.Pin, *, frequency: int = 400000, timeout: int = 255)¶
- 两线串行协议 - I2C 是一种用于在设备之间进行通信的两线协议。在物理层,它由 2 条线组成:SCL 和 SDA,分别是时钟线和数据线。 - 也可以看看 - 直接使用这个类需要仔细的锁管理。相反,用于 - I2CDevice管理锁。- 也可以看看 - 使用此类直接读取寄存器需要手动位解包。相反,使用现有的驱动程序或使用 注册数据描述符制作一个 。 - 
__exit__(self) → None¶
- 在上下文退出时自动取消初始化硬件。有关更多信息,请参阅 Lifetime 和 ContextManagers 。 
 - 
readfrom_into(self, address: int, buffer: _typing.WriteableBuffer, *, start: int = 0, end: Optional[int] = None) → None¶
- buffer从 选择的设备读入- address。读取的字节数将是 的长度- buffer。必须至少读取一个字节。- 如果提供 - start或- end,则缓冲区将被切片,就像- buffer[start:end]。这不会像- buf[start:end]will 那样导致分配, 因此可以节省内存。- 参数
- address (int) – 7 位设备地址 
- buffer (WriteableBuffer) – 要写入的缓冲区 
- start (int) – 开始写入的索引 
- end (int) – 要写入但不包括的索引 
 
 
 - 
writeto(self, address: int, buffer: _typing.ReadableBuffer, *, start: int = 0, end: Optional[int] = None) → None¶
- 将字节写入由 - buffer选择的设备- address,然后发送一个停止位。- writeto_then_readfrom在需要写入时使用,在读取之前不停止和重复启动。- 如果提供 - start或- end,则缓冲区将被切片,就像- buffer[start:end]。这不会像- buffer[start:end]will 那样导致分配, 因此可以节省内存。- 允许写入长度为零的缓冲区或切片,因为它可用于轮询设备是否存在。 - 参数
- address (int) – 7 位设备地址 
- buffer (ReadableBuffer) – 包含要写入的字节的缓冲区 
- start (int) – 开始写入的索引 
- end (int) –要读取的索引但不包括 
 
 
 - 
writeto_then_readfrom(self, address: int, out_buffer: _typing.ReadableBuffer, in_buffer: _typing.ReadableBuffer, *, out_start: int = 0, out_end: Optional[int] = None, in_start: int = 0, in_end: Optional[int] = None) → None¶
- 将字节从 写入由 - out_buffer选择的设备- address,不生成停止位,生成重复启动并读入- in_buffer。- out_buffer并且- in_buffer可以是相同的缓冲区,因为它们是按顺序使用的。- 如果提供 - start或- end,则相应的缓冲区将被切片为 if- buffer[start:end]。这不会像- buf[start:end]will 那样导致分配,因此可以节省内存。- 参数
- address (int) – 7 位设备地址 
- out_buffer (ReadableBuffer) – 包含要写入的字节的缓冲区 
- in_buffer (WriteableBuffer) – 要写入的缓冲区 
- out_start (int) – 开始写入的索引 
- out_end (int) – 要读取但不包括的索引。默认为 - len(buffer)
- in_start (int) – 开始写入的索引 
- in_end (int) – 要写入但不包括的索引。默认为 - len(buffer)
 
 
 
- 
- 
class bitbangio.SPI(clock: microcontroller.Pin, MOSI: Optional[microcontroller.Pin] = None, MISO: Optional[microcontroller.Pin] = None)¶
- 一个 3-4 线串行协议 - SPI 是一种串行协议,具有用于数据进出主设备的专用引脚。它通常比 - I2C使用单独的引脚来选择设备而不是传输地址要快。此类仅管理四个 SPI 线路中的三个:- clock,- MOSI,- MISO。由客户来管理适当的选择行,通常缩写为- CS或- SS。(这很常见,因为多个辅助节点可以共享- clock,- MOSI和- MISO线路,从而共享硬件。)- 在给定的引脚上构造一个 SPI 对象。 - 也可以看看 - 直接使用这个类需要仔细的锁管理。相反,用于 - SPIDevice管理锁。- 也可以看看 - 使用此类直接读取寄存器需要手动位解包。相反,使用现有的驱动程序或使用 注册 数据描述符制作一个 。 - 参数
 - 
__exit__(self) → None¶
- 退出上下文时自动取消初始化硬件。有关更多信息,请参阅 Lifetime 和 ContextManagers 。 
 - 
configure(self, *, baudrate: int = 100000, polarity: int = 0, phase: int = 0, bits: int = 8) → None¶
- 配置 SPI 总线。仅在锁定时有效。 
 - 
write(self, buf: _typing.ReadableBuffer) → None¶
- 写入包含在 - buf. 需要锁定 SPI。如果缓冲区为空,则什么也不会发生。
 - 
readinto(self, buffer: _typing.WriteableBuffer, *, start: int = 0, end: Optional[int] = None, write_value: int = 0) → None¶
- 读 - buffer入时写入- write_value每个字节读取。SPI 对象必须被锁定。如果要读取的字节数为 0,则什么也不会发生。
 - 
write_readinto(self, buffer_out: _typing.ReadableBuffer, buffer_in: _typing.ReadableBuffer, *, out_start: int = 0, out_end: Optional[int] = None, in_start: int = 0, in_end: Optional[int] = None) → None¶
- 写出数据, - buffer_out同时读入数据- buffer_in。SPI 对象必须被锁定。由- buffer_out[out_start:out_end]和定义的切片的长度- buffer_in[in_start:in_end]必须相等。如果缓冲区切片长度都为 0,则什么也不会发生。- 参数
- buffer_out (ReadableBuffer) – 写出这个缓冲区中的数据 
- buffer_in (WriteableBuffer) – 将数据读入该缓冲区 
- out_start (int) – 要写出的 buffer_out 切片的开始: - buffer_out[out_start:out_end]
- out_end (int) – 切片的结尾;该指数不包括在内。默认为 - len(buffer_out)
- in_start (int) – - buffer_in要读入的切片的开始:- buffer_in[in_start:in_end]
- in_end (int) – 切片的结尾;该指数不包括在内。默认为 - len(buffer_in)