class I2C – I2C协议

I2C是一个设备间通信的双线串行协议。其物理层包含两条线: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对象可以提供关于其配置的信息。

基本方法是发送和接收:

i2c.send('abc')      # send 3 bytes
i2c.send(0x42)       # send a single byte, given by the number
data = i2c.recv(3)   # receive 3 bytes

要接收数据,先创建一个bytearray:

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

主机也有其他方法

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

I2C总线的物理引脚为:

  • I2C(1) is on the X position: (SCL, SDA) = (X9, X10) = (PB6, PB7)

  • I2C(2) is on the Y position: (SCL, SDA) = (Y9, Y10) = (PB10, PB11)

在精简版本中

  • I2C(1) is on the X position: (SCL, SDA) = (X9, X10) = (PB6, PB7)

  • I2C(3) is on the Y position: (SCL, SDA) = (Y9, Y10) = (PA8, PB8)

调用构造函数,使用 ‘X’ 或 ‘Y’ 使能端口

方法

I2C.deinit()

关闭I2C总线。

I2C.init(mode, *, addr=0x12, 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设备内存中读取:

  • addr 可为一个要读入的整数(要读取的字节数量)或缓冲区

  • addr is the I2C device address

  • memaddr 是I2C设备中内存的位置

  • timeout 是以毫秒计的等待读取的超时时长

  • addr_size 选择memaddr宽度:8或16位

返回读取数据。只在主模式下有效。

I2C.mem_write(data, addr, memaddr, *, timeout=5000, addr_size=8)

写入I2C设备的内存:

  • data 可为一个用来写入的整数或缓冲区。

  • addr is the I2C device address

  • memaddr 是I2C设备中内存的位置

  • timeout 是以毫秒计的等待写入的超时时长

  • addr_size 选择memaddr宽度:8或16位

返回 None . 只在主模式下有效。

I2C.recv(recv, addr=0x00, *, timeout=5000)

Receive data on the bus:

  • recv 可为一个整数,即接收的字节的数量;或为一个使用收到的字节来填充的可变缓冲区。

  • addr 是用以接收的地址(只在主模式下需要)

  • timeout 是以毫秒计的等待接收的超时时长

返回值:若 recv 为一个整数,则有一个新的字节缓冲区来接收,否则这一缓冲区将传递给 recv .

I2C.send(send, addr=0x00, *, timeout=5000)

在总线上发送数据:

  • send 是要发送的数据(一个整数或一个缓冲区对象)

  • addr 是要发送到的地址(只在主模式下需要)

  • timeout 是以毫秒计的等待发送的超时时长

Return value: None.

I2C.scan()

浏览从0x01到0x7f的所有I2C地址,并返回一个响应的地址的列表。只在主模式下有效。

常量

I2C.MASTER

将总线初始化为主模式

I2C.SLAVE

将总线初始化为从模式