onewire --- 1-Wire 总线协议

onewire 模块实现了 1-Wire 总线主机协议,供 DS18x20 温度传感器等设备使用。它使用一个配置为开漏模式的 machine.Pin 来与共享总线上的一个或多个从设备通信。

示例:

from machine import Pin
from onewire import OneWire

ow = OneWire(Pin("P7"))
devices = ow.scan()
for rom in devices:
    print(rom)

class onewire.OneWire(pin: machine.Pin)

在给定的 machine.Pin 上构造一个 1-Wire 总线主机。该引脚会自动配置为带上拉的开漏模式。

ROM 命令常量:

SEARCH_ROM: int

Search ROM 命令(0xF0)。由 scan() 在内部使用,以发现总线上的设备。

MATCH_ROM: int

Match ROM 命令(0x55)。由 select_rom() 在内部使用,以通过 64 位 ROM 码寻址特定设备。

SKIP_ROM: int

Skip ROM 命令(0xCC)。同时寻址总线上的所有设备,跳过 ROM 匹配。

总线复位:

reset(required: bool = False) bool

在总线上发出一个复位脉冲。如果至少有一个从设备以存在脉冲响应,则返回 True,否则返回 False。如果 requiredTrue 且没有设备响应,则抛出 OneWireError

位/字节 I/O:

readbit() int

从总线读取单个位并以 01 返回。

readbyte() int

从总线读取单个字节并以整数(0--255)返回。

readinto(buf: bytearray) None

从总线读取 len(buf) 个字节到给定的预分配缓冲区中。

writebit(value: int) None

向总线写入单个位(01)。

writebyte(value: int) None

向总线写入单个字节(0--255)。

write(buf: bytes | bytearray) None

buf 中的字节写入总线。

设备寻址:

select_rom(rom: bytes | bytearray) None

先发出一次复位,再发出 MATCH ROM 命令,以寻址其 64 位 ROM 码在 rom(一个 8 字节缓冲区)中的设备。

scan() list[bytearray]

搜索总线并返回 8 字节 ROM 码的列表(每个检测到的设备对应一个 bytearray)。如果没有设备存在,则返回空列表。

循环冗余校验:

crc8(data: bytes | bytearray) int

data 计算 Maxim/Dallas 8 位 CRC。当 data 已经包含有效的尾随 CRC 字节时,结果为 0,可用于校验接收到的暂存器(scratchpad)内容。

异常

exception onewire.OneWireError

当 1-Wire 操作失败时抛出。目前由 OneWire.reset()requiredTrue 且没有从设备响应复位脉冲时抛出。