I2C类 – 双线串行协议

I2C是一个设备间通信的双线串行协议。其物理层包含两条线:SCL和SDA,分别为时钟和数据线。

I2C对象在特定总线上创建。可在创建时或创建后初始化。

打印I2C对象可提供关于其配置的信息。

为实现高速I2C,请尽量不要使用该对象,而使用 pyb.I2C 。该类是为通过位拆裂完成的低速软件I2C设计的。

例:

from machine import I2C

i2c = I2C(freq=400000)          # create I2C peripheral at frequency of 400kHz 以400kHz的频率创建I2C外设
                                # depending on the port, extra parameters may be required 取决于端口,可能需要额外参数
                                # to select the peripheral and/or pins to use 选择要使用的外部和/或引脚

i2c.scan()                      # scan for slaves, returning a list of 7-bit addresses 扫描从属设备,返回一个7位地址的列表

i2c.writeto(42, b'123')         # write 3 bytes to slave with 7-bit address 42 使用7位地址42将3个字节写入从属设备
i2c.readfrom(42, 4)             # read 4 bytes from slave with 7-bit address 42 使用7位地址42将4个字节读入从属设备

i2c.readfrom_mem(42, 8, 3)      # read 3 bytes from memory of slave 42, 从从属设备42的内存中读取3个字节
                                #   starting at memory-address 8 in the slave 从从属设备的内存地址8开始
i2c.writeto_mem(42, 2, b'\x10') # write 1 byte to memory of slave 42 将1个字节写入从属设备42的内存
                                #   starting at address 2 in the slave 从从属设备的地址2开始

构建函数

class machine.I2C(id=-1, *, scl, sda, freq=400000)

构建并返回一个新的I2C对象。参数的描述,请参见下文init方法:

  • id 标识一个特定的I2C外设。默认值-1选择一个可处理(在大多数情况下)任意SCL和SDA引脚的I2C的软件实现。若id为-1,则SCL和SDA须被指定。其他允许的id值取决于特定端口/板,此种情况下可能需要或允许指定SCL和SDA。
  • scl 应为一个指定用于SCL的引脚对象。
  • sda 应为一个指定用于SDA的引脚对象。
  • freq 应为一个设置SCL的最大频率的整数。

通用方法

I2C.init(scl, sda, *, freq=400000)

使用给定参数初始化I2C总线:

  • scl 是用于SCL线的引脚对象
  • sda 是用于SDA线的引脚对象
  • freq 是SCL时钟频率
I2C.deinit()

Turn off the I2C bus.

Availability: WiPy.

I2C.scan()

扫描介于0x08和0x77之间的所有I2C地址,并返回一个包含所有响应对象的列表。若在总线上发送地址(包括一个读位)后将SDA线拉低,设备就会响应。

原始I2C操作

以下方法实现了原始I2C主总线操作,且可组合起来执行任何I2C事务。若您需对总线进行更多控制,即可使用该方法,否则可使用标准方法(见下)。

I2C.start()

在总线上发送一个起始位(SDA转换为低,SCL为高)。

Availability: ESP8266.

I2C.stop()

在总线上发送一个终止位(SDA转换为高,SCL为高)。

Availability: ESP8266.

I2C.readinto(buf, nack=True)

从总线中读取字节,并存入缓冲区中。读取的字节数量即为缓冲区的长度。接收除最后一个字节外的所有字节后,将在总线上发送ACK,NACK将在最后一个字节后发送。

Availability: ESP8266.

I2C.write(buf)

将所有字节从缓冲区中写入总线。检查每个字节后是否接收到ACK,若未接收到,则报告OS错误。

Availability: ESP8266.

标准总线操作

以下方法实现了针对给定从属设备的标准I2C主机读写操作。

I2C.readfrom(addr, nbytes, stop=True)

从addr指定的从属设备中读取nbytes。使用读取的数据返回一个字节对象。

I2C.readfrom_into(addr, buf, stop=True)

从addr指定的从属设备中读取到缓冲区中。读取的字节数量即为缓冲区的长度。

I2C.writeto(addr, buf, stop=True)

将字节从缓冲区中读取到addr指定的从属设备中。

终止参数(仅在WiPy上可用)显示是否应在传输结束时发送一个终止位。若为False,则传输应在稍后继续进行。

内存操作

一些I2C设备可作为读取和写入的内存设备(或一组寄存器)。此时,有两个与I2C处理相关的地址:从属地址与内存地址。以下方法是与设备通信的便捷函数。

I2C.readfrom_mem(addr, memaddr, nbytes, *, addrsize=8)

从memaddr指定的内存地址开始,从addr 指定的从属设备中将nbytes读取到缓冲区中。addrsize参数指定以位为单位的地址大小(在ESP8266上,该参数未被识别,地址大小通常为8位)。使用读取的数据返回一个字节对象。

I2C.readfrom_mem_into(addr, memaddr, buf, *, addrsize=8)

从memaddr指定的内存地址开始,从addr 指定的从属设备中将nbytes读取到缓冲区中。读取的字节数量即为缓冲区的长度。addrsize参数指定以位为单位的地址大小(在ESP8266上,该参数未被识别,地址大小通常为8位)。

I2C.writeto_mem(addr, memaddr, buf, *, addrsize=8)

从memaddr指定的内存地址开始,将缓冲区读取到addr 指定的从属设备中。addrsize参数指定以位为单位的地址大小(在ESP8266上,该参数未被识别,地址大小通常为8位)。