I2C
一、I2C 概述:
I2C(Inter-Integrated Circuit)是一种广泛应用于嵌入式系统的通信协议,尤其适用于主从架构下的短距离通信。它最早由飞利浦(现在的NXP)公司开发,主要用于在集成电路内部以及设备之间的低速通信。以下是I2C协议的一些关键特性和工作原理:
物理层
-
I2C使用两根线进行数据传输:SCL(时钟线)和SDA(数据线)。
-
两根线通过上拉电阻接到高电平,这样通信可以使用“线与”(Wired-AND)方式,方便多主多从架构。
-
SCL和SDA线分别传输时钟和数据,因此I2C通信是同步的。
架构
-
I2C采用主从(Master-Slave)结构。每次通信时只有一个主设 备,但可以有多个从设备。
-
主设备负责生成时钟信号和启动/停止信号。
-
从设备根据地址识别是否是目标通信对象。
通信流程
-
起始条件(Start Condition):主设备将SDA线从高拉到低,而SCL保持高电平,表示通信的开始。
-
地址传输:主设备发送从设备地址(7位或10位),并在末尾加入一个读/写位(0表示写,1表示读)。
-
应答(ACK):从设备接收到地址后,如果地址匹配,就会拉低SDA线应答。
-
数据传输:在数据传输过程中,每发送一个字节(8位)后,从设备都需要发送应答位。
-
停止条件(Stop Condition):主设备将SDA线从低拉到高,而SCL保持高电平,表示通信结束。
二、演示功能概述
本例程将使用 I2C 协议读取传感器数据并打印出来温湿度数值。
三、准备硬件环境
3.1 核心板
本文主要以 Air780EHV 核心板为例进行演示。
Air780EHV 核心板
参考:硬件环境清单第二章节内容,准备以及组装好硬件环境。
3.2 aht10 温湿度传感器一个
3.3 780EHV 与 aht10 接线图如下
3.3.1 780EHV核心板接线端
3.3.2 aht10接线端
3.3.3 注意
当您使用Air780EHV核心板,通过外扩插针的I2C1管脚,外接I2C接口的传感器时,请注意:
Air780EHV内部没有为I2C1/I2C0两路I2C接口加上拉电阻,如果不是使用Air780EHV核心板进行调试,请务必需要在自己的电路上加上拉电阻;
四、软件环境
在开始实践本示例之前,先筹备一下软件环境:
1. Luatools 工具;
2. 内核固件文件(底层core固件文件):LuatOS-SoC_V2007_Air780EHV;参考项目使用的内核固件(当前版本仅供测试使用);
3. luatos 需要的脚本和资源文件
lib 脚本文件:使用 Luatools 烧录时,勾选 添加默认 lib 选项,使用默认 lib 脚本文件;
准备好软件环境之后,接下来查看如何烧录项目文件到 Air780EHV 核心板,将本篇文章中演示使用的项目文件烧录到 Air780EHV 核心板中。
五、使用 I2C 读取 aht10 软硬件资料:
5.1 API接口介绍:
5.2 I2C硬件参考资料
Air780EHV 可支持 1 路 通用I2C1 和 1 路可复用I2C0。
I2C1 配置:
兼容 Philips I2C 标准协议。
支持 Fast mode (400Kbps)和 Slow mode(100Kbps)。
只支持 master 模式,不支持 slave 模式。
理论上最多可支持 127 个从设备。
管脚名 | 类型 | 模组管脚号 | 电压域 | 描述 |
---|---|---|---|---|
I2C_SCL | IO | 67 | VDD_EXT | I2C 时钟信号,用作 I2C 时需外加上拉 |
I2C_SDA | IO | 66 | VDD_EXT | I2C 数据信号,用作 I2C 时需外加上拉 |
I2C1 的参考电路如下:
Air780EHV 的 I2C1 接口电压是 1.8V/3.3V 可配置。
软件上: 可通过 pm.ioVol(pm.IOVOL_ALL_GPIO, 3300) 设置,该函数设置所有GPIO的电压域,参数为 3300 表示 3.3V,参数为 1800 表示 1.8V。
硬件上: 通过 780EHV的管脚100(IO_Volt_Set)设置,该管脚悬空是3.0v,接地下拉是1.8V。能够满足大部分外设的直接需求,但是如果要和 5V 或者以上电平的外设通信,那就必须要加电平转换电路。
5.3 aht10介绍
aht10特点:
- 完全校准
- 数字输出,I2C接口
- 低功耗
- 优异的长期稳定性
- DFN型封装 - 可回流焊接
- 工作电压范围是2.1~3.6V.
- I2C速率支持400k
六、代码示例介绍
6.1 ant10 温湿度传感器简介:
ant10 是使用 I2C 协议进行通信的温湿度传感器。 设备地址:0x38(7位地址) 通信速率:支持标准模式(100kHz)和快速模式(400kHz)
数据读取流程 首先我们可以发送 aht20 的 7 位从机地址 +1 位读写位(写 0 读 1),然后再发送测量命令(0xAC 0x33 0x00),等待测量完成(约80ms)读取6字节数据: 字节1:状态字 字节2-3:湿度数据(高16位) 字节4-5:温度数据(高16位) 字节6:CRC校验(可选)
6.2 demo 介绍
首先设置IO电平、初始化 i2c
--电平设置为3.3v
pm.ioVol(pm.IOVOL_ALL_GPIO, 3300)
--设置gpio2输出,给camera_sda、camera_scl引脚提供上拉
gpio.setup(2, 1)
i2cid = 1
i2c_speed = i2c.FAST
i2c.setup(i2cid,i2c_speed)
--初始化,传入i2c_id
aht10.init(i2cid)
然后每2秒读取一次温湿度数据。
while 1 do
local aht10_data = aht10.get_data()
log.info("aht10_data", "aht10_data.RH:"..(aht10_data.RH*100).."%","aht10_data.T"..(aht10_data.T).."℃")
sys.wait(2000)
end
七、功能验证:
7.1 传感器初始化成功
成功使用 I2C 协议读取到 aht10 传感器的温湿度数值。
7.2 读取温湿度数值
成功使用 I2C 协议读取到 aht10 传感器的温湿度数值。
八、总结
本例程使用 i2c 协议读取了 aht10 传感器传输的温湿度数值。
常见问题
1、i2c 每次读写数据前都需要 setup 一次吗?
不需要
正常的业务逻辑为:
i2c.setup
…此处可以多次读写数据
i2c.close
setup 之后,只要没有 close,就可以反复读写数据
一旦执行了 close,下次读写数据前,必须再次 setup
2、i2c 通信时模块可以做从设备吗?
注意:模块 I2C 只能做主设备,(虽然有内部上拉电阻,但是暂时还未实现软件配置)使用时需要外部上拉,在配置 FAST 速率时,上拉电阻阻值不要大于 4.7K。
3、i2c 设备 7 位的地址为 0x38 ,需要我手动转换到 8 位地址吗?
这里 i2c_addr 地址是 7bit 地址
如果 i2c 外设手册中给的是 8bit 地址,需要把 8bit 地址右移 1 位,赋值给 i2c_addr 变量
如果 i2c 外设手册中给的是 7bit 地址,直接把 7bit 地址赋值给 i2c_addr 变量即可