2.7 I2C 模块API手册#

前言#

概述#

本文档主要介绍machine模块下的I2C类API。

读者对象#

本文档(本指南)主要适用于以下人员:

  • 技术支持工程师

  • 软件开发工程师

缩略词定义#

简称

说明

I2C

二进制双向通信模块

修订记录#

文档版本号

修改说明

修改者

日期

V1.0

初版

软件部

2023-09-21

1. 概述#

K230内部包含五个I2C硬件模块,支持标准100kb/s,快速400kb/s模式,高速模式3.4Mb/s。 通道输出IO配置参考IOMUX模块。

2. Master API描述#

I2C类位于machine模块下

2.1 示例#

from machine import I2C
# i2c0 init 100KHz clock
i2c = I2C(0, freq=100000)
# Scan the slave on the I2C bus
i2c.scan()
# Reading data from the bus
i2c.readfrom(addr, len, True)
# Read data and place it in buff
i2c.readfrom_into(addr, buf, True)
# Sending data to the slave
i2c.writeto(addr, buf, True)
# Read slave register
i2c.readfrom_mem(addr, memaddr, nbytes, mem_size=8)
# Read slave register and place it in buff
i2c.readfrom_mem_into(addr, memaddr, buf, mem_size=8)
# Write data to slave register
i2c.writeto_mem(addr, memaddr, buf, mem_size=8)
# i2c deinit
i2c.deinit()

2.2 构造函数#

i2c = I2C(id, freq=100000)

【参数】

  • id: I2C ID, [0~4] (I2C.I2C0~I2C.I2C4)

  • freq: I2C时钟频率

2.3 scan#

i2c.scan()

扫描I2C总线上的从机

【参数】

【返回值】

list 对象, 包含了所有扫描到的从机地址

2.4 readfrom#

i2c.readfrom(addr, len, True)

从总线读取数据

【参数】

  • addr: 从机地址

  • len: 数据长度

  • stop: 是否产生停止信号,保留,目前只能使用默认值Ture

【返回值】

读取到的数据,bytes 类型

2.5 readfrom_into#

i2c.readfrom_into(addr, buf, True)

读取数据并放到制定变量中

【参数】

  • addr: 从机地址

  • buf: bytearray类型, 定义了长度,读取到的数据存放在此

  • stop: 是否产生停止信号,保留,目前只能使用默认值Ture

【返回值】

2.6 writeto#

i2c.writeto(addr, buf, True)

发送数据到从机

【参数】

  • addr: 从机地址

  • buf: 需要发送的数据

  • stop: 是否产生停止信号,保留,目前只能使用默认值Ture

【返回值】

成功发送的字节数

2.7readfrom_mem#

i2c.readfrom_mem(addr, memaddr, nbytes, mem_size=8)

读取从机寄存器

【参数】

  • addr: 从机地址

  • memaddr: 从机寄存器地址

  • nbytes: 需要读取的长度

  • mem_size: 寄存器宽度, 默认为8位

【返回值】

返回bytes类型的读取到的数据

2.8 readfrom_mem_into#

i2c.readfrom_mem_into(addr, memaddr, buf, mem_size=8)

读取从机寄存器值到指定变量中

【参数】

  • addr: 从机地址

  • memaddr: 从机寄存器地址

  • buf: bytearray类型, 定义了长度,读取到的数据存放在此

  • mem_size: 寄存器宽度, 默认为8位

【返回值】

2.9 writeto_mem#

i2c.writeto_mem(addr, memaddr, buf, mem_size=8)

写数据到从机寄存器

【参数】

  • addr: 从机地址

  • memaddr: 从机寄存器地址

  • buf: 需要写的数据

  • mem_size: 寄存器宽度, 默认为8位

【返回值】

2.10 deinit#

i2c.deinit()

释放i2c资源

【参数】

【返回值】

3. Slave API描述#

I2C_Slave类位于machine模块下

注意:I2C默认是master模式,要开启slave模式,需要在编译固件时使用 make rtsmart-menuconfig配置打开 Enable I2Cx SLAVE mode 选项(路径:Drivers Configuration/Enable/I2C/Enable I2Cx/Enable I2Cx SLAVE mode),并重新编译烧录固件。 cover

3.1 示例#

本实例使用K210作为master,K230作为slave,其中K230 IO5用于数据改变时通知master读取数据。 K230 code:

from machine import Pin
from machine import FPIOA
from machine import I2C_Slave
import time,os

#初始化gpio用于通知主机有数据更新
def gpio_int_init():
    # 实例化FPIOA
    fpioa = FPIOA()
    # 设置Pin5为GPIO5
    fpioa.set_function(5, FPIOA.GPIO5)
    # 实例化Pin5为输出
    pin = Pin(5, Pin.OUT, pull=Pin.PULL_NONE, drive=7)
    # 设置输出为高
    pin.value(1)
    return pin

pin = gpio_int_init()
#i2c slave设备id列表
device_id = I2C_Slave.list()
print("Find i2c slave device:",device_id)

#构造I2C Slave,设备地址为0x01,模拟eeprom映射的内存大小为20byte
i2c_slave = I2C_Slave(device_id[0],addr=0x10,mem_size=20)

#等待master发送数据,并读取映射内存中的值
last_dat = i2c_slave.readfrom_mem(0,20)
dat = last_dat
while dat == last_dat:
    dat = i2c_slave.readfrom_mem(0,20)
    time.sleep_ms(100)
    os.exitpoint()
print(dat)
  
#修改映射内存中的值
for i in range(len(dat)):
    dat[i] = i
i2c_slave.writeto_mem(0,dat)
#通知主机有数据更新
pin.value(0)
time.sleep_ms(1)
pin.value(1)

K210 code:

from machine import I2C
from fpioa_manager import fm
from maix import GPIO

fm.register(8, fm.fpioa.GPIO2)

int_io = GPIO(GPIO.GPIO2,GPIO.IN,GPIO.PULL_UP)

i2c = I2C(I2C.I2C3, freq=100000, scl=6, sda=7) 

i2c.writeto_mem(0x10,0,bytearray(("abcdefghijklnmopqrst")))

while int_io.value() == 1:
    pass

buf = i2c.readfrom_mem(0x10,0,20)
print(buf)

3.1 类方法list()#

用于获取当前系统中所有可用的I2C从机设备ID列表。这个列表对于在初始化 I2C_Slave对象时指定正确的设备ID至关重要。

【参数】

  • 此方法不接受任何参数。

【返回值】

  • 返回一个列表(list),其中包含系统中所有可用的I2C从机设备的ID。这些ID是整数或类似的标识符,用于在创建 I2C_Slave对象时指定具体的从机设备。

【注意】

  • 具体的ID值和它们所代表的设备取决于硬件平台和系统配置。

  • 在没有可用从机设备的情况下,返回的列表可能为空。

3.2 构造函数#

i2c = I2C_Slave(id, addr=0x10,mem_size=20)

此构造函数用于创建一个I2C从机对象,允许设备在I2C总线上以从机模式运行,并模拟一个具有指定内存大小的EEPROM。

【参数】

  • id:i2C slave设备的ID,这是设备在硬件层面或系统配置中唯一的标识符。通常,你可以通过调用 I2C_Slave.list()方法来获取可用的slave设备ID列表。

  • addr:设备在从机模式下的I2C地址。这个地址用于主设备识别并与之通信。

  • mem_size: 模拟EEPROM映射的空间内存大小,以字节为单位。

【返回值】

i2c slave对象

3.3 readfrom_mem#

i2c.readfrom_mem(addr, n)

从映射的内存地址读取数据(i2c master通过epprom时序写入的数据)。

【参数】

  • addr: 起始内存地址,从该地址开始读取数据。

  • n: 要读取的字节数。

【返回值】

  • 返回一个字节数组(bytearray),包含从指定地址读取的n个字节的数据。

3.4 writeto_mem#

i2c.writeto_mem(addr, data)

从映射的内存地址写入数据(i2c master通过epprom时序读取此数据)。

【参数】

  • addr: 起始内存地址,从该地址开始写入数据。

  • data: 一个字节数组(bytearray),包含要写入的数据。

【返回值】