跳转至

i2c - I2C 操作

作者:拓毅恒

一、概述

I2C(Inter-Integrated Circuit)是一种两线式串行总线,用于连接微控制器及其外围设备。在嵌入式系统中,I2C 总线常用于连接各种传感器、显示器、存储器等设备。

LuatOS 提供了 I2C 核心库,支持硬件 I2C 和软件模拟 I2C 两种方式,可以方便地与各种 I2C 设备进行通信。

二、核心示例

1、核心示例是指:使用本库文件提供的核心 API,开发的基础业务逻辑的演示代码;

2、核心示例的作用是:帮助开发者快速理解如何使用本库,所以核心示例的逻辑都比较简单;

3、更加完整和详细的 demo,请参考 LuatOS 仓库 中各个产品目录下的相关示例:demo/i2c-sht20

log.info("i2c".. id, "hw i2c initial",  i2c.setup(id)) --初始化I2C

while true do
    i2c.send(id, addr, string.char(0xF3)) --发送0xF3来查询温度
    sys.wait(100)
    tmp = i2c.recv(id, addr, 2)  --读取传感器的温度值
    log.info("SHT20", "read tem data", tmp:toHex())

    i2c.send(id, addr, string.char(0xF5)) --发送0xF5来查询湿度
    sys.wait(100)
    hum = i2c.recv(id, addr, 2)  --读取传感器湿度值
    log.info("SHT20", "read hum data", hum:toHex())
    local _,tval = pack.unpack(tmp,'>H') --提取一个按照大端字节序编码的16位无符号整数
    local _,hval = pack.unpack(hum,'>H')
    log.info("SHT20", "tval hval", tval,hval)
        if tval and hval then
            --按照传感器手册来计算对应的温湿度
            temp = (((17572 * tval) >> 16) - 4685)/100
            hump = (((12500 * hval) >> 16) - 600)/100
            log.info("SHT20", "temp,humi",string.format("%.2f",temp),string.format("%.2f",hump))
        end
    sys.wait(1000)
end

三、常量详解

核心库常量,顾名思义是由合宙 LuatOS 内核固件中定义的、不可重新赋值或修改的固定值,在脚本代码中不需要声明,可直接调用;

常量
类型
解释
参数示例
i2c.FAST
number
高速模式 400 kHz (千赫兹)
i2c.setup(1, i2c.FAST)
i2c.SLOW
number
低速模式 100 kHz (千赫兹)
i2c.setup(1, i2c.SLOW)
i2c.PLUS
number
超高速模式 1 MHz (兆赫兹)
i2c.setup(1, i2c.PLUS)

四、函数详解

i2c.exist(id)

功能

检查指定的 I2C 设备 ID 是否存在。

参数

id

参数含义:设备 ID,例如i2c1的id为1, i2c2的id为2
数据类型:number
取值范围:根据具体产品不同,支持的 I2C 设备 ID 不同,可以查询具体产品的硬件手册;
是否必选:必须传入此参数;
注意事项:暂无;
参数示例:1 表示检查 i2c1 是否存在;

返回值

local result = i2c.exist(id)

result

含义说明:I2C 设备是否存在;
数据类型:boolean
取值范围:true 表示存在,false 表示不存在;
注意事项:暂无;
返回示例:true 表示 I2C 设备存在;

示例

-- 检查 i2c1 是否存在
if i2c.exist(1) then
    log.info("i2c", "存在 i2c1")
end

i2c.setup(id, speed, polling)

功能

初始化指定的 I2C 设备,需在 I2C 读写操作之前调用。

参数

id

参数含义:设备 ID,例如i2c1的id为1, i2c2的id为2
数据类型:number
取值范围:根据具体产品不同,支持的 I2C 设备 ID 不同,可以查询具体产品的硬件手册;
是否必选:必须传入此参数;
注意事项:暂无;
参数示例:1 表示初始化 i2c1

speed

参数含义:I2C 通信速度;
数据类型:number
取值范围:可选择 i2c.FASTi2c.SLOWi2c.PLUS
是否必选:必须传入此参数;
注意事项:暂无;
参数示例:i2c.FAST 表示使用高速模式;

polling

参数含义:是否使用轮询模式。轮询模式是I2C通信的一种工作方式CPU会主动持续检查I2C通信状态,而非被动等待硬件中断信号;
业务逻辑:代码会检查该参数是否为 true,若是则将 i2c 设为轮询模式。
数据类型:boolean
取值范围:true 表示使用轮询模式,false 表示不使用轮询模式;
是否必选:可选传入此参数;如果没有传入此参数或者传入了 nil 类型,则使用默认值false,即不设置轮询模式;
注意事项:轮询模式会持续占用CPU资源,可能增加系统功耗,除非遇到明确的通信问题,否则通常不需要特别指定轮询模式;
参数示例:true 表示使用轮询模式;

返回值

local result = i2c.setup(id, speed, polling)

result

含义说明:初始化是否成功;
数据类型:number
取值范围:成功返回 1,失败返回 0
注意事项:暂无;
返回示例:1 表示初始化成功;

示例

-- 初始化 i2c1
local result = i2c.setup(1, i2c.FAST) -- id 正确就一定成功
log.info("i2c", "初始化结果", result)

i2c.createSoft(scl, sda, delay)

功能

创建一个软件 I2C 对象,软件 I2C 的速率与模组 GPIO 速率相关,需注意 GPIO 驱动能力,AGPIO 驱动能力较弱,尽量选用普通 GPIO,适用于硬件 I2C 不够用的场景。

参数

scl

参数含义:I2C SCL 引脚编号(GPIO 编号);
数据类型:number
取值范围:模组 GPIO 编号,根据具体产品不同,支持的 GPIO 引脚编号不同;
是否必选:必须传入此参数;
注意事项:暂无;
参数示例:1 表示使用 GPIO1 作为 SCL 引脚;

sda

参数含义:I2C SDA 引脚编号(GPIO 编号);
数据类型:number
取值范围:模组 GPIO 编号,根据具体产品不同,支持的 GPIO 引脚编号不同;
是否必选:必须传入此参数;
注意事项:暂无;
参数示例:2 表示使用 GPIO2 作为 SDA 引脚;

delay

参数含义:控制 I2C 通信中时钟线(SCL)和数据线(SDA)高低电平的持续时间,单位是微秒(μs)
         简单来说,这个参数决定了 I2C 通信的速率快慢,数值越大通信越慢,数值越小通信越快;
数据类型:number
取值范围:无特别限制;
是否必选:可选传入此参数;如果没有传入此参数或者传入了 nil 类型,则使用默认值 5
注意事项:通过调整 delay 参数的值,可增加或降低 I2C 的速度;
         实际使用时需根据从设备手册中的 “最小 SCL  / 低电平时间” 调整(例如手册要求 5μs,则 delay 可设为 5~10μs)。
参数示例:5 表示每个操作延时 5us

返回值

local softI2C = i2c.createSoft(scl, sda, delay)

softI2C

含义说明:软件 I2C 对象;
数据类型:userdata
取值范围:无特别限制;
注意事项:软件 I2C 是通过 GPIO 软件模拟实现的,软件 I2C 的速率与模组 GPIO 速率相关;不需要调用 i2c.close 接口;
返回示例:一个软件 I2C 对象;

示例

-- 初始化软件 i2c
local softI2C = i2c.createSoft(1, 2, 5)
i2c.send(softI2C, 0x5C, string.char(0x0F, 0x2F))

i2c.send(id, addr, data, stop)

功能

通过 I2C 总线发送数据。

参数

id

参数含义:设备 ID,例如i2c1的id为1, i2c2的id为2
数据类型:number
取值范围:根据具体产品不同,支持的 I2C 设备 ID 不同,可以查询具体产品的硬件手册;
是否必选:必须传入此参数;
注意事项:暂无;
参数示例:1 表示使用 i2c1 发送数据;

addr

参数含义:I2C 子设备的地址(7 位地址);
数据类型:number
取值范围:0x00-0x7F
是否必选:必须传入此参数;
注意事项:暂无;
参数示例:0x5C 表示发送数据到地址为 0x5C 的设备;

data

参数含义:待发送的数据;
数据类型:numberstring  table
取值范围:无特别限制;
是否必选:必须传入此参数;
注意事项:自适应参数类型;
参数示例:0x75 表示发送一个字节的数据;
         string.char(0x0F, 0x2F) 表示发送两个字节的数据;
         {0x0F, 0x2F} 表示发送两个字节的数据;

stop

参数含义:是否发送停止位;
数据类型:number
取值范围:1 表示发送,0 表示不发送;
是否必选:可选传入此参数;如果没有传入此参数或者传入了 nil 类型,则使用默认值 1
注意事项:暂无;
参数示例:1 表示发送停止位;

返回值

local result = i2c.send(id, addr, data, stop)

result

含义说明:发送是否成功;
数据类型:boolean
取值范围:true 表示成功,false 表示失败;
注意事项:暂无;
返回示例:true 表示发送成功;

示例

-- 往 i2c0 发送 1 个字节的数据
i2c.send(0, 0x68, 0x75)
-- 往 i2c1 发送 2 个字节的数据
i2c.send(1, 0x5C, string.char(0x0F, 0x2F))
i2c.send(1, 0x5C, {0x0F, 0x2F})

i2c.recv(id, addr, len)

功能

通过 I2C 总线接收数据。

参数

id

参数含义:设备 ID,例如i2c1的id为1, i2c2的id为2
数据类型:number
取值范围:根据具体产品不同,支持的 I2C 设备 ID 不同,可以查询具体产品的硬件手册;
是否必选:必须传入此参数;
注意事项:暂无;
参数示例:1 表示使用 i2c1 接收数据;

addr

参数含义:I2C 子设备的地址(7 位地址);
数据类型:number
取值范围:0x00-0x7F
是否必选:必须传入此参数;
注意事项:暂无;
参数示例:0x5C 表示从地址为 0x5C 的设备接收数据;

len

参数含义:接收数据的长度;
数据类型:number
取值范围:无特别限制;
是否必选:必须传入此参数;
注意事项:暂无;
参数示例:2 表示接收 2 个字节的数据;

返回值

local data = i2c.recv(id, addr, len)

data

含义说明:接收成功收到的数据,失败返回空字符串;
数据类型:string
取值范围:无特别限制;
注意事项:暂无;
返回示例:例如收到两字节的数据,对应的ascii值,分别是 0x01  0x02

示例

-- 从 i2c1 读取 2 个字节的数据
local data = i2c.recv(1, 0x5C, 2)
log.info("i2c", "接收数据", data)

i2c.writeReg(id, addr, reg, data, stop)

功能

通过 I2C 总线写入寄存器数据。

参数

id

参数含义:设备 ID,例如i2c1的id为1, i2c2的id为2
数据类型:number
取值范围:根据具体产品不同,支持的 I2C 设备 ID 不同,可以查询具体产品的硬件手册;
是否必选:必须传入此参数;
注意事项:暂无;
参数示例:1 表示使用 i2c1 写入寄存器数据;

addr

参数含义:I2C 子设备的地址(7 位地址);
数据类型:number
取值范围:0x00-0x7F
是否必选:必须传入此参数;
注意事项:暂无;
参数示例:0x5C 表示向地址为 0x5C 的设备写入寄存器数据;

reg

参数含义:寄存器地址;
数据类型:number
取值范围:无特别限制;
是否必选:必须传入此参数;
注意事项:暂无;
参数示例:0x01 表示写入地址为 0x01 的寄存器;

data

参数含义:待发送的数据;
数据类型:string
取值范围:无特别限制;
是否必选:必须传入此参数;
注意事项:暂无;
参数示例:string.char(0x00, 0xF2) 表示写入两个字节的数据;

stop

参数含义:是否发送停止位;
数据类型:number
取值范围:1 表示发送,0 表示不发送;
是否必选:可选传入此参数;如果没有传入此参数或者传入了 nil 类型,则使用默认值 1
注意事项:暂无;
参数示例:1 表示发送停止位;

返回值

local result = i2c.writeReg(id, addr, reg, data, stop)

result

含义说明:发送是否成功;
数据类型:boolean
取值范围:true 表示成功,false 表示失败;
注意事项:暂无;
返回示例:true 表示发送成功;

示例

-- 向 i2c1 的地址为 0x5C 的设备的寄存器 0x01 写入 2 个字节的数据
i2c.writeReg(1, 0x5C, 0x01, string.char(0x00, 0xF2))

i2c.readReg(id, addr, reg, len, stop)

功能

通过 I2C 总线读取寄存器数据。

参数

id

参数含义:设备 ID,例如i2c1的id为1, i2c2的id为2
数据类型:number
取值范围:根据具体产品不同,支持的 I2C 设备 ID 不同,可以查询具体产品的硬件手册;
是否必选:必须传入此参数;
注意事项:暂无;
参数示例:1 表示使用 i2c1 读取寄存器数据;

addr

参数含义:I2C 子设备的地址(7 位地址);
数据类型:number
取值范围:0x00-0x7F
是否必选:必须传入此参数;
注意事项:暂无;
参数示例:0x5C 表示从地址为 0x5C 的设备读取寄存器数据;

reg

参数含义:寄存器地址;
数据类型:number
取值范围:无特别限制;
是否必选:必须传入此参数;
注意事项:暂无;
参数示例:0x01 表示读取地址为 0x01 的寄存器;

len

参数含义:待接收的数据长度;
数据类型:number
取值范围:无特别限制;
是否必选:必须传入此参数;
注意事项:暂无;
参数示例:2 表示接收 2 个字节的数据;

stop

参数含义:是否发送停止位;
数据类型:number
取值范围:1 表示发送,0 表示不发送;
是否必选:可选传入此参数;如果没有传入此参数或者传入了 nil 类型,则使用默认值 1
注意事项:暂无;
参数示例:1 表示发送停止位;

返回值

local data = i2c.readReg(id, addr, reg, len, stop)

data

含义说明:接收成功收到的数据,失败返回空字符串;
数据类型:string
取值范围:无特别限制;
注意事项:暂无;
返回示例:例如收到两字节的数据,对应的ascii值,分别是 0x00  0xF2

示例

-- 从 i2c1 的地址为 0x5C 的设备的寄存器 0x01 读出 2 个字节的数据
local data = i2c.readReg(1, 0x5C, 0x01, 2)
log.info("i2c", "读取寄存器数据", data)

i2c.close(id)

功能

关闭指定的 I2C 设备,关闭后如需重新使用 i2c 功能,无需使用 i2c.setup() 重新初始化,i2c 读写操作的时候会自动重新打开 i2c。

参数

id

参数含义:设备 ID,例如i2c1的id为1, i2c2的id为2
数据类型:number
取值范围:根据具体产品不同,支持的 I2C 设备 ID 不同,可以查询具体产品的硬件手册;
是否必选:必须传入此参数;
注意事项:暂无;
参数示例:1 表示关闭 i2c1

返回值

无返回值。

示例

-- 关闭 i2c1
i2c.close(1)

i2c.readDHT12(id, addr)

功能

从 I2C 总线读取 DHT12 温湿度传感器的数据。

参数

id

参数含义:设备 ID,例如i2c1的id为1, i2c2的id为2
数据类型:number
取值范围:根据具体产品不同,支持的 I2C 设备 ID 不同,可以查询具体产品的硬件手册;
是否必选:必须传入此参数;
注意事项:暂无;
参数示例:0 表示使用 i2c0 读取 DHT12 数据;

addr

参数含义:DHT12  7bit 设备地址---101 1100;
数据类型:number
取值范围:0x00-0x7F
是否必选:可选传入此参数;如果没有传入此参数或者传入了 nil 类型,则使用默认值 0x5C
注意事项:暂无;
参数示例:0x5C 表示 DHT12 的设备地址为 0x5C

返回值

local result, humidity, temperature = i2c.readDHT12(id, addr)

result

含义说明:读取是否成功;
数据类型:boolean
取值范围:true 表示成功,false 表示失败;
注意事项:暂无;
返回示例:true 表示读取成功;

humidity

含义说明:湿度值,单位 0.1%
数据类型:number
取值范围:20 %RH  95 %RH
注意事项:只有 result  true 时才有意义;
返回示例:591 表示湿度为 59.1%

temperature

含义说明:温度值,单位 0.1 摄氏度;
数据类型:number
取值范围:–20 °C  +60 °C
注意事项:只有 result  true 时才有意义;
返回示例:292 表示温度为 29.2 摄氏度;

示例

-- 从 i2c0 读取 DHT12
i2c.setup(0)
local re, H, T = i2c.readDHT12(0)
if re then
    log.info("dht12", "湿度:", H/10, "%", "温度:", T/10, "°C")
end

i2c.readSHT30(id, addr)

功能

从 I2C 总线读取 SHT30 温湿度传感器的数据。

参数

id

参数含义:设备 ID,例如i2c1的id为1, i2c2的id为2
数据类型:number
取值范围:根据具体产品不同,支持的 I2C 设备 ID 不同,可以查询具体产品的硬件手册;
是否必选:必须传入此参数;
注意事项:暂无;
参数示例:0 表示使用 i2c0 读取 SHT30 数据;

addr

参数含义:SHT30  7bit 设备地址 ---100 0100;
数据类型:number
取值范围:0x00-0x7F
是否必选:可选传入此参数;如果没有传入此参数或者传入了 nil 类型,则使用默认值 0x44
注意事项:暂无;
参数示例:0x44 表示 SHT30 的设备地址为 0x44

返回值

local result, humidity, temperature = i2c.readSHT30(id, addr)

result

含义说明:读取是否成功;
数据类型:boolean
取值范围:true 表示成功,false 表示失败;
注意事项:暂无;
返回示例:true 表示读取成功;

humidity

含义说明:湿度值,单位 0.1%
数据类型:number
取值范围:0%RH  100%RH
注意事项:只有 result  true 时才有意义;
返回示例:591 表示湿度为 59.1%

temperature

含义说明:温度值,单位 0.1 摄氏度;
数据类型:number
取值范围:–40   +125 ℃;
注意事项:只有 result  true 时才有意义;
返回示例:292 表示温度为 29.2 摄氏度;

示例

-- 从 i2c0 读取 SHT30
i2c.setup(0)
local re, H, T = i2c.readSHT30(0)
if re then
    log.info("sht30", "湿度:", H/10, "%", "温度:", T/10, "°C")
end

i2c.transfer(id, addr, txBuff, rxBuff, rxLen)

功能

I2C 通用传输,支持三种功能:

  • 发送 N 字节数据
  • 发送 N 字节后接收 N 字节数据(在发送转接收过程中发送 reStart 信号)
  • 接收 N 字节数据

特别说明 :该函数解决了类似 mlx90614 等设备必须带 restart 信号 (重启动信号) 但不能用 i2c.send 控制的问题

参数

id

参数含义:设备 ID,例如i2c1的id为1, i2c2的id为2
数据类型:number
取值范围:根据具体产品不同,支持的 I2C 设备 ID 不同,可以查询具体产品的硬件手册;
是否必选:必须传入此参数;
注意事项:暂无;
参数示例:0 表示使用 i2c0 进行传输;

addr

参数含义:I2C 子设备的地址(7 位地址);
数据类型:number
取值范围:0x00-0x7F
是否必选:必须传入此参数;
注意事项:暂无;
参数示例:0x11 表示与地址为 0x11 的设备进行传输;

txBuff

参数含义:待发送的数据;
数据类型:numberstring  zbuff
取值范围:无特别限制;
是否必选:可选传入此参数;如果为 nil,则不发送数据;
注意事项:自适应参数类型;
参数示例:"\x01\x02" 表示发送两个字节的数据;

rxBuff

参数含义:待接收数据的 zbuff
数据类型:zbuff
取值范围:无特别限制;
是否必选:可选传入此参数;如果为 nil,则不使用 zbuff 接收数据;
注意事项:如果不用 zbuff,则接收数据将在 return 返回;
参数示例:一个 zbuff 对象;

rxLen

参数含义:需要接收的数据长度;
数据类型:number
取值范围:无特别限制;
是否必选:可选传入此参数;如果为 0  nil,则不接收数据;
注意事项:暂无;
参数示例:1 表示接收 1 个字节的数据;

返回值

local result, rxdata = i2c.transfer(id, addr, txBuff, rxBuff, rxLen)

result

含义说明:传输是否成功;
数据类型:boolean
取值范围:true 表示成功,false 表示失败;
注意事项:暂无;
返回示例:true 表示传输成功;

rxdata

含义说明:接收到的数据;
数据类型:string 表示以字符串形式返回原始字节数据;nil 表示没有接收到的数据;
取值范围:无特别限制;
注意事项:
只有当 rxLen  number 且大于 0 时,才会返回接收到的数据;
 i2c.transfer 函数中,当接收数据成功且同时存在 rxBuff 参数时, 数据只会存在于 rxBuff 中,
rxdata 会返回 nil ,不会同时在两者中都有数据
返回示例:"\x01" 表示接收到一个字节的数据 0x01

示例

-- 使用 zbuff 接收数据
local result = i2c.transfer(0, 0x11, txbuff, rxbuff, 1)
-- 只发送数据,不接收数据
local result = i2c.transfer(0, 0x11, txbuff, nil, 0)
-- 发送数据,不接收数据
local result = i2c.transfer(0, 0x11, "\x01\x02\x03", nil, 1)
-- 发送数据,然后接收数据
local result, rxdata = i2c.transfer(0, 0x11, "\x01\x02", nil, 1)
-- 发送一个字节,然后接收数据
local result, rxdata = i2c.transfer(0, 0x11, 0x00, nil, 1)

i2c.xfer(id, addr, txBuff, rxBuff, rxLen, transfer_done_topic, timeout)

功能

I2C 非阻塞通用传输,类似 transfer,但是不会等到 I2C 传输完成才返回,调用本函数会立刻返回,I2C 传输完成后,通过消息回调。

参数

id

参数含义:设备 ID,例如i2c1的id为1, i2c2的id为2
数据类型:number
取值范围:根据具体产品不同,支持的 I2C 设备 ID 不同,可以查询具体产品的硬件手册;
是否必选:必须传入此参数;
注意事项:暂无;
参数示例:0 表示使用 i2c0 进行传输;

addr

参数含义:I2C 子设备的地址(7 位地址);
数据类型:number
取值范围:0x00-0x7F
是否必选:必须传入此参数;
注意事项:暂无;
参数示例:0x11 表示与地址为 0x11 的设备进行传输;

txBuff

参数含义:待发送的数据;
数据类型:zbuff
取值范围:无特别限制;
是否必选:必须传入此参数;
注意事项:由于用的非阻塞模型,为保证动态数据的有效性,只能使用 zbuff,发送的数据从 zbuff.addr 开始,长度为 zbuff.used
参数示例:一个包含待发送数据的 zbuff 对象;

rxBuff

参数含义:待接收数据的 zbuff
数据类型:zbuff
取值范围:无特别限制;
是否必选:可选传入此参数;如果为 nil,则忽略后面参数,不接收数据;
注意事项:接收的数据会放在 zbuff.addr 开始的位置,会覆盖掉之前的数据,注意 zhuff 的预留空间要足够;
参数示例:一个用于接收数据的 zbuff 对象;

rxLen

参数含义:需要接收的数据长度;
数据类型:number
取值范围:无特别限制;
是否必选:可选传入此参数;如果为 0  nil,则不接收数据;
注意事项:暂无;
参数示例:1 表示接收 1 个字节的数据;

transfer_done_topic

参数含义:传输完成后回调的消息;
数据类型:string
取值范围:无特别限制;
是否必选:必须传入此参数;
注意事项:回调消息中携带的参数如下:
        wait_result boolean):表示是否成功接收到回调消息
        i2c_id number):执行传输的I2C设备ID
        succ boolean):表示I2C传输是否成功完成
        error_code number):如果传输失败,包含具体的错误代码;
参数示例:"I2CDONE" 表示传输完成后发布名为 "I2CDONE" 的消息;

timeout

参数含义:超时时间;
数据类型:number
取值范围:无特别限制;
是否必选:可选传入此参数;如果为 nil,则为 100ms
注意事项:暂无;
参数示例:1000 表示超时时间为 1000ms

返回值

local result = i2c.xfer(id, addr, txBuff, rxBuff, rxLen, transfer_done_topic, timeout)

result

含义说明:本次传输是否正确启动;
数据类型:boolean
取值范围:true 表示启动成功,false 表示有错误无法启动;
注意事项:传输完成会发布消息 transfer_done_topic  boolean 型结果;
返回示例:true 表示传输启动成功;

示例

local result = i2c.xfer(0, 0x11, txbuff, rxbuff, 1, "I2CDONE")
if result then
    local wait_result, i2c_id, succ, error_code = sys.waitUntil("I2CDONE")
    if not wait_result or not succ then
        log.info("i2c", "fail, error code", error_code)
    else
        log.info("i2c", "ok")
    end
end

i2c.scan(id, speed)

功能

本函数用于在开发阶段扫描 I2C 总线上连接的设备,确认 I2C 设备是否正确连接、地址设置是否正确。

参数

id

参数含义:设备 ID,例如i2c1的id为1, i2c2的id为2
数据类型:number
取值范围:根据具体产品不同,支持的 I2C 设备 ID 不同,可以查询具体产品的硬件手册;
是否必选:必须传入此参数;
注意事项:暂无;
参数示例:0 表示使用 i2c0 扫描设备;

speed

参数含义:扫描速度;
数据类型:number
取值范围:可选 i2c.SLOWi2c.FASTi2c.PLUS
是否必选:可选传入此参数;如果没有传入此参数或者传入了 nil 类型,则使用默认值 i2c.SLOW
注意事项:由于此日志输出行为是由底层 BSP 决定的,而有些 BSP 在指定 addr 无响应时会输出日志,
所以会导致输出会被打乱,如探测不到则修改此项;
参数示例:i2c.SLOW 表示使用低速模式扫描;

返回值

无返回值。

示例

-- 用于在开发阶段扫描I2C总线上连接的设备,确认I2C设备是否正确连接、地址设置是否正确。
i2c.scan(0)

五、产品支持说明

支持 LuatOS 开发的所有产品都支持 i2c 核心库。不同产品支持的硬件 i2c 接口数量和 gpio 引脚可能有所不同,请参考具体产品的硬件手册。