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.MASTERI2C.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 地址并返回响应的列表。仅在主模式下有效。

常数

I2C.MASTER

用于将总线初始化为主模式

I2C.SLAVE

用于将总线初始化为从机模式