class I2C – I2C协议¶
I2C是一个设备间通信的双线串行协议。其物理层包含两条线:SCL和SDA,分别为时钟和数据线。
I2C对象在特定总线上创建。可在创建时或创建后初始化。
打印I2C对象可提供关于其配置的信息。
使用示例
from machine import I2C
i2c = I2C(freq=400000) # create I2C peripheral at frequency of 400kHz
# 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
i2c.writeto(42, b'123') # write 3 bytes to slave with 7-bit address 42
i2c.readfrom(42, 4) # read 4 bytes from slave with 7-bit address 42
i2c.readfrom_mem(42, 8, 3) # read 3 bytes from memory of slave 42,
# starting at memory-address 8 in the slave
i2c.writeto_mem(42, 2, b'\x10') # write 1 byte to memory of slave 42
# starting at address 2 in the slave
构造函数¶
- class machine.I2C(id=-1, *, scl, sda, freq=400000)¶
为实现高速I2C,请尽量不要使用该对象,而使用 pyb.I2C 。该类是为通过位拆裂完成的低速软件I2C设计的。
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()¶
关闭I2C总线。
可用于:WiPy。
- I2C.scan()¶
扫描介于0x08和0x77之间的所有I2C地址,并返回一个包含所有响应对象的列表。若在总线上发送地址(包括一个读位)后将SDA线拉低,设备就会响应。
原始I2C操作¶
以下方法实现了原始I2C主总线操作,且可组合起来执行任何I2C事务。若您需对总线进行更多控制,即可使用该方法,否则可使用标准方法(见下)。
此方法只使用软件I2C
- I2C.start()¶
在总线上发送一个起始位(SDA转换为低,SCL为高)。
- I2C.stop()¶
在总线上发送一个终止位(SDA转换为高,SCL为高)。
- I2C.readinto(buf, nack=True, /)¶
从总线中读取字节,并存入缓冲区中。读取的字节数量即为缓冲区的长度。接收除最后一个字节外的所有字节后,将在总线上发送ACK,NACK将在最后一个字节后发送。
- I2C.write(buf)¶
将所有字节从缓冲区中写入总线。检查每个字节后是否接收到ACK,若未接收到,则报告OS错误。
标准总线操作¶
以下方法实现了针对给定从属设备的标准I2C主机读写操作。
- I2C.readfrom_into(addr, buf, stop=True, /)¶
从addr指定的从属设备中读取到缓冲区中。读取的字节数量即为缓冲区的长度。s
此方法返还
None
- I2C.writeto(addr, buf, stop=True, /)¶
将字节从缓冲区中读取到addr指定的从属设备中。
- I2C.writevto(addr, vector, stop=True, /)¶
将 vector 中包含的字节写到 addr 指定的从设备中。 vector 应该是具有缓冲协议的元组或对象列表。 发送一次 addr ,然后按顺序写出 vector 中每个对象的字节。 vector 中的对象的长度可能为零字节,在这种情况下,它们对输出没有帮助。
如果从 vector 中的一个对象写入一个字节后接收到的是NACK,则不发送任何剩余的字节和对象。 如果 stop 为true,则即使收到一个NACK,也会在传输结束时生成STOP条件。 该函数返回已接收的ACK数。
内存操作¶
一些I2C设备可作为读取和写入的内存设备(或一组寄存器)。此时,有两个与I2C处理相关的地址:从属地址与内存地址。以下方法是与设备通信的便捷函数。
- I2C.readfrom_mem(addr, memaddr, nbytes, *, addrsize=8)¶
从memaddr指定的内存地址开始,从addr 指定的从属设备中将nbytes读取到缓冲区中。addrsize参数指定以位为单位的地址大小(在ESP8266上,该参数未被识别,地址大小通常为8位)。使用读取的数据返回一个
bytes
字节对象。
- I2C.readfrom_mem_into(addr, memaddr, buf, *, addrsize=8)¶
从memaddr指定的内存地址开始,从addr 指定的从属设备中将nbytes读取到缓冲区中。读取的字节数量即为缓冲区的长度。 addrsize参数指定以位为单位的地址大小(在ESP8266上,该参数未被识别,地址大小通常为8位)。
此方法返还
None
- I2C.writeto_mem(addr, memaddr, buf, *, addrsize=8)¶
从memaddr指定的内存地址开始,将缓冲区读取到addr 指定的从属设备中。 addrsize参数指定以位为单位的地址大小(在ESP8266上,该参数未被识别,地址大小通常为8位)。
此方法返还
None