class I2C
I2C 是设备之间的两线通信协议。在物理层它只需要两个信号线: SCL 和 SDA,分别是时钟和数据线。
I2C 对象关联到总线,它可以创建时初始化,也可以稍后在初始化。
构造函数
- class machine.I2C(scl, sda, *, freq=400000)
创建并返回新的 I2C 对象,参数部分可以参考下面的初始化函数。
方法
- I2C.init(scl, sda, *, freq=400000)
初始化 I2C:
- scl 代表 SCL 引脚
- sda 代表 SDA 引脚
- freq 代表 SCL 时钟速率
注: 实际上第一个参数默认是SDA,或者用scl强制指定Pin。
- I2C.scan()
扫描 0x08 到 0x77 之间的 I2C 地址,并返回设备列表。如果收到地址后设备拉低 SDA (包括读取位) 代表设备有响应。
原始 I2C 操作
下面方法执行原始的 I2C 主操作,它们可以组合产生各种 I2C 事务。提供这些方法是可以更好的控制总线,否则使用标准方法就足够。
- I2C.start()
在总线上发送 start 位 (当 SCL 是高时 SDA 变低)。
- I2C.stop()
发送停止位 (当 SCL 是高时 SCL 变高)。
- I2C.readinto(buf)
从总线上读取数据并存放到 buf,读取的数量是 buf 的长度。接收到倒数第二个数据时发送 ACK 信号,接收到全部数据后发送 NACK 信号。
- I2C.write(buf)
写入缓冲区数据到总线。每发送一个字节后将检查是否收到 ACK,如果没有收到将引发 OSError 异常。
标准总线操作
下面方法是标准的 I2C 主模式读写操作。
- I2C.readfrom(addr, nbytes)
从指定地址设备读取数据,返回读取对象。
- I2C.readfrom_into(addr, buf)
从指定地址设备读取数据到缓冲区,读取的数量是 buf 的长度。
只有 WiPy 返回读取数据的数量,其他模块都返回 None。
- I2C.writeto(addr, buf, *, stop=True)
写入数据到设备。stop 参数 (仅 WiPy) 代表发送完成后需要再发送停止位。
只有 WiPy 返回读取数据的数量,其他模块都返回 None。
内存操作
某些 I2C 设备作为存储设备 (或一组寄存器) ,可以读取或者写入。这种情况下,有两个地址和 I2C 事务相关: 从设备地址和内存地址。下面方法用于和这些设备进行通信。
- I2C.readfrom_mem(addr, memaddr, nbytes, *, addrsize=8)
读取从设备 addr 的内存地址 memaddr 数据,addrsize 指定地址大小 (在 ESP8266 上这个参数无效,地址大小总是 8 位),返回读取数据的字节对象。
- I2C.readfrom_mem_into(addr, memaddr, buf, *, addrsize=8)
读取从设备 addr 的内存地址 memaddr 数据到缓冲区,addrsize 指定地址大小 (在 ESP8266 上这个参数无效,地址大小总是 8 位),读取数据数量是buf的长度。
在 WiPy 上返回值是读取数据数量,其他模块都返回 None。
- I2C.writeto_mem(addr, memaddr, buf, *, addrsize=8)
写入 buf 到从设备 addr 的内存 memaddr,addrsize 代表地址大小 (在 ESP8266 上这个参数无效,地址大小总是 8 位)。
在 WiPy 上返回值是读取数据数量,其他模块都返回 None。
参考例子:
from machine import Pin, I2C
i2c = I2C(Pin(14), Pin(2))
i2c = I2c(scl = Pin(2), sda = Pin(14), frq = 100000)
i2c.scna()
buf = bytearray(1)
buf[0] = 0xAA
i2c.writeto(0x77, buf)
i2c.readfrom(0x77, 1)