类 I2C – 双线串行协议
I2C是用于设备之间通信的双线协议。在物理层面,它由2条线组成:SCL和SDA,分别是时钟和数据线。
创建连接到特定总线的I2C对象。它们可以在创建时初始化,也可以在以后初始化。
示例:
from machine import I2C,Pin
i2c = I2C(scl=Pin(22), sda=Pin(23), 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对象:
id
标识特定的I2C外设。默认值-1选择I2C的软件实现scl
应该是一个pin对象,指定用于SCL的引脚sda
应该是一个pin对象,指定用于SDA的引脚freq
应该是一个整数,它设置SCL的最大频率。0 < freq ≤ 500000(Hz)。
Attention
I2C可使用引脚有GPIO 0/2/4/5/9/16/17/18/19/21/22/23/25/26/27
通用方法
- I2C.init(scl, sda, \*, freq=400000)
Initialise the I2C bus with the given arguments:
scl
是SCL线的pin对象sda
是SDA线的pin对象freq
是SCL时钟速率
- I2C.deinit()
关闭I2C总线。
- I2C.scan()
扫描0x08和0x77之间的所有I2C地址,并返回响应的列表。如果在总线上发送其地址(包括写入位)后将器件拉低,则器件会响应。
原始的I2C操作
以下方法实现Primitive I2C operations主总线操作,并且可以组合以进行任何I2C事务。如果您需要更多控制总线,则提供它们, 否则可以使用标准方法(见下文)。
- I2C.start()
在总线上生成START条件(SDA在SCL为高电平时转换为低电平)。
- I2C.stop()
在总线上生成STOP条件(SDA在SCL为高电平时转换为高电平)。
- I2C.readinto(buf, nack=True)
从总线读取字节并将它们存储到 buf
中。读取的字节数是 buf
的长度。在接收到除最后一个字节之外的所有字节之后,
将在总线上发送 ACK
。在接收到最后一个字节之后,如果 nack
为真,则将发送 NACK
,否则将发送 ACK
(并且在这种情况下,从属设备假定在稍后的调用中将读取更多字节)。
- I2C.write(buf)
将 buf
中的字节写入总线。检查每个字节后是否收到 ACK
,如果收到 NACK
,则停止发送剩余的字节。该函数返回已接收的 ACK
数。
标准总线操作
下面的方法实现了针对给定从设备的标准I2C主读写操作。
- I2C.readfrom(addr, nbytes, stop=True)
从 addr
指定的从程序中读取 nbytes
。如果 stop
为真,则在传输结束时生成一个停止条件。返回一个读取数据的 bytes
对象。
- I2C.readfrom_into(addr, buf, stop=True)
从 addr
指定的奴隶读入 buf
。读取的字节数将是 buf
的长度。如果 stop
为真,则在传输结束时生成一个停止条件。
该方法返回 None
。
- I2C.writeto(addr, buf, stop=True)
将 buf
中的字节写入 addr
指定的从机。如果在从 buf
写入一个字节后收到 NACK ,则不发送剩余的字节。
如果 stop
为true,则即使收到NACK,也会在传输结束时生成STOP条件。该函数返回已接收的ACK数。
寄存器操作
某些I2C器件充当可以读写的存储器器件(或寄存器集)。在这种情况下,有两个与I2C事务相关的地址:从地址和存储器地址。 以下方法是与这些设备通信的便利功能。
- I2C.readfrom_mem(addr, memaddr, nbytes, \*, addrsize=8)
从 memaddr
指定的内存地址开始,从 addr
指定的slave中读取 nbytes
。参数 addrsize
以位为单位指定地址大小。
返回读取数据的 bytes
对象。
- I2C.readfrom_mem_into(addr, memaddr, buf, \*, addrsize=8)
从 memaddr
指定的内存地址开始,从 addr
指定的slave中读入 buf
。读取的字节数是 buf
的长度。
参数 addrsize
以位为单位指定地址大小。
该方法返回 None
。
- I2C.writeto_mem(addr, memaddr, buf, \*, addrsize=8)
从 memaddr
指定的内存地址开始,将 buf
写入 addr
指定的从机。参数 addrsize
以位的形式指定地址大小。
该方法返回 None
。