I2C 类 – 一种两线串行协议¶
I2C 是一种用于在设备之间进行通信的两线协议。在物理层,它由 2 条线组成:SCL 和 SDA,分别是时钟线和数据线。
I2C 对象是附加到特定总线上创建的。它们可以在创建时初始化,也可以稍后初始化。
例子:
from pyb import I2C
i2c = I2C(1) # create on bus 1
i2c = I2C(1, I2C.MASTER) # create and init as a master
i2c.init(I2C.MASTER, baudrate=20000) # init as a master
i2c.init(I2C.SLAVE, addr=0x42) # init as a slave with given address
i2c.deinit() # turn off the peripheral
打印 i2c 对象可为您提供有关其配置的信息。
基本方法是send和recv:
i2c.send('abc') # send 3 bytes
i2c.send(0x42) # send a single byte, given by the number
data = i2c.recv(3) # receive 3 bytes
要就地接收,首先创建一个字节数组:
data = bytearray(3) # create a buffer
i2c.recv(data) # receive 3 bytes, writing them into data
您可以指定超时(以毫秒为单位):
i2c.send(b'123', timeout=2000) # timeout after 2 seconds
主人必须指定收件人的地址:
i2c.init(I2C.MASTER)
i2c.send('123', 0x42) # send 3 bytes to slave with address 0x42
i2c.send(b'456', addr=0x42) # keyword for address
Master还有其他方法:
i2c.is_ready(0x42) # check if slave 0x42 is ready
i2c.scan() # scan for slaves on the bus, returning
# a list of valid addresses
i2c.mem_read(3, 0x42, 2) # read 3 bytes from memory of slave 0x42,
# starting at address 2 in the slave
i2c.mem_write('abc', 0x42, 2, timeout=1000) # write 'abc' (3 bytes) to memory of slave 0x42
# starting at address 2 in the slave, timeout after 1 second
构造函数¶
-
class
pyb.
I2C
(bus, ...)¶ 在给定的总线上构造一个 I2C 对象。
bus
可以是 1 或 2,'X' 或 'Y'。在没有附加参数的情况下,I2C 对象被创建但不初始化(它具有总线上次初始化的设置,如果有的话)。如果给出了额外的参数,则总线被初始化。参见init
初始化参数。Pyboards V1.0 和 V1.1 上 I2C 总线的物理引脚是:
I2C(1)
在 X 位置:(SCL, SDA) = (X9, X10) = (PB6, PB7)
I2C(2)
在 Y 位置:(SCL, SDA) = (Y9, Y10) = (PB10, PB11)
在 Pyboard Lite 上:
I2C(1)
在 X 位置:(SCL, SDA) = (X9, X10) = (PB6, PB7)
I2C(3)
在 Y 位置:(SCL, SDA) = (Y9, Y10) = (PA8, PB8)
使用“X”或“Y”调用构造函数可实现 Pyboard 类型之间的可移植性。
方法¶
-
I2C.
deinit
()¶ 关闭 I2C 总线。
-
I2C.
init
(mode, *, addr=18, baudrate=400000, gencall=False, dma=False)¶ 使用给定的参数初始化 I2C 总线:
mode
必须是I2C.MASTER
或I2C.SLAVE
addr
是 7 位地址(仅对从机有效)baudrate
是 SCL 时钟速率(仅适用于主机)gencall
是否支持通用呼叫模式dma
是否允许使用 DMA 进行 I2C 传输(注意 DMA 传输有更精确的时序,但目前不能正确处理总线错误)
-
I2C.
is_ready
(addr)¶ 检查 I2C 设备是否响应给定地址。仅在主模式下有效。
-
I2C.
mem_read
(data, addr, memaddr, *, timeout=5000, addr_size=8)¶ 从 I2C 设备的内存中读取:
data
可以是整数(要读取的字节数)或要读入的缓冲区addr
是 I2C 设备地址memaddr
是 I2C 设备内的内存位置timeout
是等待读取的超时时间(以毫秒为单位)addr_size
选择 memaddr 的宽度:8 位或 16 位
返回读取的数据。这仅在主模式下有效。
-
I2C.
mem_write
(data, addr, memaddr, *, timeout=5000, addr_size=8)¶ 写入 I2C 设备的内存:
data
可以是整数或要写入的缓冲区addr
是 I2C 设备地址memaddr
是 I2C 设备内的内存位置timeout
是等待写入的超时时间(以毫秒为单位)addr_size
选择 memaddr 的宽度:8 位或 16 位
返回
None
。这仅在主模式下有效。
-
I2C.
recv
(recv, addr=0, *, timeout=5000)¶ 在总线上接收数据:
recv
可以是一个整数,它是要接收的字节数,也可以是一个可变缓冲区,它将用接收到的字节填充addr
是要接收的地址(仅在主模式下需要)timeout
是等待接收的超时时间(以毫秒为单位)
返回值:如果
recv
是一个整数,则接收到的字节的新缓冲区,否则与传入的缓冲区相同recv
。
-
I2C.
send
(send, addr=0, *, timeout=5000)¶ 在总线上发送数据:
send
是要发送的数据(要发送的整数或缓冲区对象)addr
是要发送到的地址(仅在主模式下需要)timeout
是等待发送的超时时间(以毫秒为单位)
返回值:
None
。
-
I2C.
scan
()¶ 扫描从 0x01 到 0x7f 的所有 I2C 地址并返回响应的列表。仅在主模式下有效。