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.FAST、i2c.SLOW、i2c.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
参数含义:待发送的数据;
数据类型:number、string 或 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
参数含义:待发送的数据;
数据类型:number、string 或 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.SLOW、i2c.FAST、i2c.PLUS;
是否必选:可选传入此参数;如果没有传入此参数或者传入了 nil 类型,则使用默认值 i2c.SLOW;
注意事项:由于此日志输出行为是由底层 BSP 决定的,而有些 BSP 在指定 addr 无响应时会输出日志,
所以会导致输出会被打乱,如探测不到则修改此项;
参数示例:i2c.SLOW 表示使用低速模式扫描;
返回值
无返回值。
示例
-- 用于在开发阶段扫描I2C总线上连接的设备,确认I2C设备是否正确连接、地址设置是否正确。
i2c.scan(0)
五、产品支持说明
支持 LuatOS 开发的所有产品都支持 i2c 核心库。不同产品支持的硬件 i2c 接口数量和 gpio 引脚可能有所不同,请参考具体产品的硬件手册。