LuatOS核心库API——【i2c】I2C 操作

在连接温度传感器、加速度计或实时时钟芯片时,I2C协议是首选通信方式。对开发者而言,掌握如何正确发起I2C操作------包括地址配置、读写模式切换和应答处理------是实现设备控制与数据采集的基础。本文提供一份实用的操作指南。

一、概述

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

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

二、核心示例

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

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

三、常量详解

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

四、函数详解

i2c.exist(id)

功能

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

参数

id

返回值

local result = i2c.exist(id)

result

示例

i2c.setup(id, speed, polling)

功能

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

注意:硬件I2C一定会发送stop信号,如果所用芯片规定不能有stop信号的话请用软件i2c。

参数

id

speed

polling

返回值

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

result

示例

i2c.createSoft(scl, sda, delay)

功能

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

注:软件 I2C 受网络业务影响,通信时可能不准确。使用时需在插入SIM卡并且网络业务满载运行的环境下用逻辑分析仪来确认下精度是否符合要求,或者长时间运行软件i2c业务来观察下功能是否正常来确认下是否可以满足要求。

参数

scl

sda

delay

返回值

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

softI2C

示例

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

功能

通过 I2C 总线发送数据。

参数

id

addr

data

stop

返回值

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

result

示例

i2c.recv(id, addr, len)

功能

通过 I2C 总线接收数据。

参数

id

addr

len

返回值

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

data

示例

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

功能

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

参数

id

addr

reg

data

stop

返回值

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

result

示例

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

功能

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

参数

id

addr

reg

len

stop

返回值

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

data

示例

i2c.close(id)

功能

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

参数

id

返回值

无返回值。

示例

i2c.readDHT12(id, addr)

功能

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

参数

id

addr

返回值

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

result

humidity

temperature

示例

i2c.readSHT30(id, addr)

功能

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

参数

id

addr

返回值

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

result

humidity

temperature

示例

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

功能

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

发送 N 字节数据

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

接收 N 字节数据

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

参数

id

addr

txBuff

rxBuff

rxLen

返回值

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

result

rxdata

示例

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

功能

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

参数

id

addr

txBuff

rxBuff

rxLen

transfer_done_topic

timeout

返回值

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

result

示例

i2c.scan(id, speed)

功能

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

参数

id

speed

返回值

无返回值。

示例

五、模组支持说明

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

今天的内容就分享到这里了~

相关推荐
xlp666hub1 天前
Leetcode第五题:用C++解决盛最多水的容器问题
linux·c++·leetcode
张宏2361 天前
原子操作 (基于Linux 应用层 C 语言)
linux
kymjs张涛2 天前
OpenClaw 学习小组:初识
android·linux·人工智能
程序设计实验室2 天前
经历分享,发现挖矿木马后,服务器快速备份与重装(腾讯云平台)
linux
Miku162 天前
OpenClaw-Linux+飞书官方Plugin安装指南
linux·人工智能·agent
Miku162 天前
OpenClaw 接入 QQ Bot 完整实践指南
linux·人工智能·agent
Yogurt_cry2 天前
[树莓派4B] 闲置近10年的爱普生 L310 打印机爆改无线打印机
linux·物联网·树莓派
爱吃橘子橙子柚子3 天前
3CPU性能排查总结(超详细)【Linux性能优化】
运维·cpu
Johny_Zhao3 天前
OpenClaw中级到高级教程
linux·人工智能·信息安全·kubernetes·云计算·yum源·系统运维·openclaw
Sheffield4 天前
Docker的跨主机服务与其对应的优缺点
linux·网络协议·docker