在连接温度传感器、加速度计或实时时钟芯片时,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 引脚可能有所不同,请参考具体模组的硬件手册。
今天的内容就分享到这里了~