I2C – 集成电路总线

I²C(Inter-Integrated Circuit)字面上的意思是集成电路之间,它其实是I²C Bus简称,所以中文应该叫集成电路总线。

它是一种串行通信总线,使用多主从架构,由飞利浦公司在1980年代为了让主板、嵌入式系统或手机用以连接低速周边设备而发展。


使用示例: 以HaaS EDU K1 上的温度传感器读写为例

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
# coding=utf-8
from machine import I2C
from machine import Pin
import utime
i2c=I2C(sda=Pin(5),scl=Pin(4), id=1, addr=0x40)
_I2C_ADDRESS = 0x40

i2c.writeto(_I2C_ADDRESS, bytearray([0x84, 0xB8]))
data = i2c.readfrom(_I2C_ADDRESS, 2)[0]
hex(data)

# write RH/T User Register 1
i2c.writeto(_I2C_ADDRESS, bytearray([0xE6, 0xBB]))

# Read RH/T User Register 1
i2c.writeto(_I2C_ADDRESS, bytearray([0xE7]))
data = i2c.readfrom(_I2C_ADDRESS, 1)[0]
hex(data)

# reset
i2c.writeto(_I2C_ADDRESS, bytearray([0xFE]))

# read tem
i2c.writeto(_I2C_ADDRESS, bytearray([0xF3]))
utime.sleep_ms(10)
data = i2c.readfrom(_I2C_ADDRESS, 2)[0]
hex(data)

函数接口


machine_i2c.I2C(id, scl, sda, freq, timeout, mode, addr, addrsize)[源代码]

创建 I2C 类对象

参数
  • id(int) – 必选参数, 设备索引号,每个硬件设备支持的通道数目受硬件限制,具体通道数目请参考硬件手册。HaaS硬件默认提供两个通道。

  • scl(Pin) – 可选参数, 表示 scl 使用的硬件管脚信息。

  • sda(Pin) – 可选参数, 表示 sda 使用的硬件管脚信息。

  • freq(int) – 可选参数, I2C工作频率,默认为400KHz。

  • timeout(int) – 可选参数, 超时等待参数,单位是毫秒,默认为10ms。

  • mode(int) – 可选参数, 工作模式,1 表示主模式, 2 表示从模式。

  • addr(int) – 必选参数, I2C 设备地址。

  • addrsize(int) – 可选参数, I2C 地址模式, 7表示7bit模式, 10表示10bit模式。 默认为7bit模式

返回

I2C 类句柄

引发

ValueError – EINVAL

machine_i2c.readinto(buf, nack)[源代码]

从I2C设备读数据

参数
  • buf(bytearray) – 必选参数,读取数据的存放空间。

  • nack(bool) – 必选参数,是否需要在读取结束后发送nack信号。

返回

None

machine_i2c.write(buf)[源代码]

向I2C设备写数据

参数

buf(bytearray) – 必选参数,待写出的数据。

Returns(int)

成功写出的字节数据

machine_i2c.readfrom(addr, size, stop=True)[源代码]

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

参数
  • addr(int) – 必选参数,I2C 设备地址。

  • size(int) – 必选参数,需要读取的数据字节数。

  • stop(bool) – 可选参数,是否发送停止位,默认发送停止位。

Returns (bytearray)

读取到的有效数据

machine_i2c.readfrom_into(addr, buf, stop=True)[源代码]

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

参数
  • addr(int) – 必选参数,I2C 设备地址。

  • buf(bytearray) – 必选参数,读取后数据存放空间。

  • stop(int) – 可选参数,是否发送停止位,默认发送停止位。

返回

None

machine_i2c.writeto(addr, buf, stop=True)[源代码]

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

停止参数显示是否应在传输结束时发送一个停止位。若为False,则传输应在稍后继续进行。

参数
  • addr(int) – 必选参数,I2C 设备地址。

  • buf(bytearray) – 必选参数,待写数据。

  • stop(int) – 可选参数,是否发送停止位,默认发送停止位。

返回

None

machine_i2c.writevto(addr, vector, stop=True)[源代码]

将 vector 中包含的字节写到 addr 指定的从设备中。 vector 应该是具有缓冲协议的元组或对象列表。

发送一次 addr ,然后按顺序写出 vector 中每个对象的字节。

vector 中的对象的长度可能为零字节,在这种情况下,它们对输出没有帮助。

如果从 vector 中的一个对象写入一个字节后接收到的是NACK,则不发送任何剩余的字节和对象。

如果 stop 为 true,则即使收到一个NACK,也会在传输结束时生成STOP条件。 该函数返回已接收的ACK数。

参数
  • addr(int) – 必选参数,I2C 设备地址。

  • vector(list) – 待写数据队列,数据格式为bytearray。

  • stop(int) – 可选参数,是否发送停止位,默认发送停止位。

返回

machine_i2c.readfrom_mem(addr, memaddr, nbytes, addrsize=8)[源代码]

从memaddr指定的内存地址开始,从 addr 指定的从属设备中将nbytes读取到缓冲区中。

addrsize参数指定以位为单位的地址大小(在HaaS上,该参数未被识别,地址大小通常为8位)。

使用读取的数据返回一个字节对象。

参数
  • addr(int) – 必选参数,I2C 设备地址。

  • memaddr(int) – 必选参数,读取的内存起始地址。

  • nbytes(int) – 必选参数,待读取的数据长度。

  • addrsize(int) – 可选参数,地址位宽大小,默认为8。

Returns (bytearray)

读取到的数据

machine_i2c.readfrom_mem_into(addr, memaddr, buf, addrsize=8)[源代码]

从memaddr指定的内存地址开始,从addr 指定的从属设备中将nbytes读取到缓冲区中。读取的字节数量即为缓冲区的长度。

addrsize参数指定以位为单位的地址大小(在HaaS上,该参数未被识别,地址大小通常为8位)

参数
  • addr(int) – 必选参数,I2C 设备地址。

  • memaddr(int) – 必选参数,读取的内存起始地址。

  • buf(bytearray) – 必选参数,读取到的数据存放空间。

  • addrsize(int) – 可选参数,地址位宽大小,默认为8。

返回

None

machine_i2c.writeto_mem(addr, memaddr, buf, addrsize=8)[源代码]

从memaddr指定的内存地址开始,将缓冲区写到addr 指定的从属设备中。

addrsize参数指定以位为单位的地址大小(在HaaS上,该参数未被识别,地址大小通常为8位)。

参数
  • addr(int) – 必选参数,I2C 设备地址。

  • memaddr(int) – 必选参数,待写入内存的起始地址。

  • buf(bytearray) – 必选参数,待写入数据的存放空间。

  • addrsize(int) – 可选参数,地址位宽大小,默认为8。

返回

None