I2C 通信、AT24C02 EEPROM及LM75温度传感器的配置
一、基础概念
1. I2C协议
I2C(Inter-Integrated Circuit,集成电路间总线)是由飞利浦公司于 1982 年开发的一种同步、半双工串行通信协议,主要用于短距离内低速设备间的数据交互(如传感器、EEPROM、LCD 控制器等)。其核心优势在于仅需两根信号线即可实现多设备通信,简化了硬件布线,降低了系统成本。
2. 核心特征
特征 | 说明 |
---|---|
通信方式 | 同步通信(依赖时钟线同步)、半双工(数据双向传输但不同时) |
信号线数量 | 仅需 2 根:SDA(Serial Data,串行数据线)、SCL(Serial Clock,串行时钟线) |
设备寻址 | 采用 7 位或 10 位地址编码,7 位地址可支持 128 个设备(预留部分地址为通用地址) |
传输速率 | 标准模式(100kbps)、快速模式(400kbps)、高速模式(3.4Mbps)等 |
总线结构 | 多主从结构(可支持多个主设备,但同一时刻仅一个主设备占用总线) |
电平标准 | 通常为 TTL 电平,SDA 和 SCL 均需通过上拉电阻(一般 4.7kΩ)接电源,空闲时为高电平 |
3.线与特性
当总线上的引脚输出高电平时,总线上的电平高低,由通信新中的对方决定
二、I2C 总线物理层与时序
1. 物理层结构
- 信号线:
- SDA:双向数据线,用于传输数据字节(高位先传)。
- SCL:时钟线,由主设备控制,决定数据传输的速率和时序。
- 上拉电阻:SDA 和 SCL 必须外接上拉电阻至电源(如 VCC=3.3V 或 5V),确保总线在空闲状态下保持高电平;当设备输出低电平时,将总线拉低。
- 多设备连接:多个主设备和从设备可同时挂接在 SDA 和 SCL 总线上,每个从设备拥有唯一的地址,主设备通过地址选择通信对象。
2. 关键时序信号
注意:
(1)起始信号(start)
- 条件:当 SCL 为高电平时,SDA 由高电平跳变为低电平。
- 作用:标志着一次 I2C 通信的开始,所有挂接在总线上的设备都会检测到该信号并准备接收地址信息。
start信号:在时钟线为高电平时,数据线产生一个下降沿,即开始通信
(2)停止信号(stop)
- 条件:当 SCL 为高电平时,SDA 由低电平跳变为高电平。
- 作用:标志着一次 I2C 通信的结束,总线恢复空闲状态。
stop信号:在时钟线为高电平时,数据线产生一个上升沿,即通信结束
(3)应答信号(ACK/NACK)
- 应答(ACK):接收设备在收到 8 位数据后,在第 9 个时钟周期内将 SDA 拉低,表示数据已正确接收。
- 非应答(NACK):接收设备在第 9 个时钟周期内保持 SDA 为高电平,表示数据接收失败或无需继续接收(如主设备读数据时,最后一个字节用 NACK 结束)
(4)数据传输时序
- 每传输 1 个字节(8 位),跟随 1 个应答位(共 9 个时钟周期)
- 数据传输期间,SDA 的电平变化必须在 SCL 为低电平时进行;SCL 为高电平时,SDA 电平必须保持稳定(否则视为起始 / 停止信号)
三、I2C 通信核心流程
I2C 通信以 “主设备发起,从设备响应” 为核心,主要包括主写从读和主读从写两种基本流程。
1. 主写从读(主机向从机发送数据)
- 主设备发送起始信号(S);
- 主设备发送 7 位从设备地址 + 1 位写指令(0),共 8 位;
- 从设备接收到地址后,返回应答信号(ACK);
- 主设备逐字节发送数据,每发送 1 字节,从设备返回 1 个 ACK;
- 数据发送完成后,主设备发送停止信号(P),通信结束。
2. 主读从写(主机由从机读取数据)
- 主设备发送起始信号(S);
- 主设备发送 7 位从设备地址 + 1 位写指令(0),从设备返回 ACK;
- (可选)主设备发送要读取的寄存器地址(如传感器的某个数据寄存器),从设备返回 ACK;
- 主设备再次发送起始信号(S)(重复起始信号);
- 主设备发送 7 位从设备地址 + 1 位读指令(1),从设备返回 ACK;
- 从设备逐字节发送数据,每发送 1 字节,主设备返回 ACK(最后 1 字节返回 NACK);
- 数据读取完成后,主设备发送停止信号(P),通信结束。
四、I2C 设备地址
1. 地址编码
I2C 设备地址通常为 7 位(标准)或 10 位(扩展),7 位地址最常用:
- 7 位地址:高 7 位为设备地址,第 8 位为读写位(0 = 写,1 = 读)
- 10 位地址:兼容性较差,需特殊时序支持,一般用于设备数量超过 128 的场景
2. 地址类型
- 固定地址:由设备硬件决定,不可修改(如 EEPROM AT24C02 的固定地址高 4 位为 0101)。
- 可编程地址:设备通过引脚接高 / 低电平调整部分地址位(如某传感器的 A0、A1 引脚可配置 2 位地址,扩展为 4 个不同地址)。
3. 通用地址
I2C 协议预留了部分通用地址(如 0000000),用于广播通信或设备识别。
五、IMX6ULL 的 I2C 控制器
1. 核心特性
- 支持主模式和从模式操作;
- 传输速率最高可达 400kbps(快速模式);
- 内置 16 字节 FIFO,减少 CPU 干预;
- 支持中断触发(如发送 FIFO 空、接收 FIFO 满、应答错误等);
- 可配置 SCL 时钟频率和超时检测。
2. 关键寄存器
寄存器名称 | 地址偏移 | 核心功能 |
---|---|---|
I2Cx_IADR | 0x00 | 从模式地址寄存器,配置从设备地址 |
I2Cx_IFDR | 0x04 | 分频寄存器,通过配置分频系数设置 SCL 时钟频率 |
I2Cx_I2CR | 0x08 | 控制寄存器,配置 I2C 使能、主 / 从模式、发送 / 接收模式等 |
I2Cx_I2SR | 0x0C | 状态寄存器,指示总线状态(如应答、忙、FIFO 状态等) |
I2Cx_I2DR | 0x10 | 数据寄存器,发送时写入数据,接收时读取数据(与 FIFO 关联) |
I2Cx_IFCR | 0x14 | 中断标志清除寄存器,清除 I2SR 中的中断标志 |
I2Cx_I2FDR | 0x18 | FIFO 深度寄存器,配置 FIFO 的触发阈值(如接收 FIFO 满阈值、发送 FIFO 空阈值) |
六、I2C 配置程序(①AT24C02 EEPROM ②LM75)
1. 硬件引脚配置
IMX6ULL 的 I2C1 对应引脚为 UART4_TX(复用为 I2C1_SCL)和 UART4_RX(复用为 I2C1_SDA),需通过 IOMUXC 寄存器配置引脚复用功能和电气属性。
2. 配置流程
- 使能 I2C1 控制器时钟;
- 配置引脚复用为 I2C 功能;
- 配置 SCL 时钟频率(通过 IFDR 寄存器);
- 配置 FIFO(可选,轮询模式可不用);
- 使能 I2C 控制器,设置为主模式。
3. 代码实现
①i2c.c
写 write
读 read
main.c
②LM75
LM75温度传感器
引脚编号 | 名称 | 功能描述 |
---|---|---|
1 | SDA | I²C 数据线 |
2 | SCL | I²C 时钟线 |
3 | OS | 过热关断/报警输出(开漏输出),当温度超限时触发。 |
5-7 | A0, A1, A2 | I²C 地址选择引脚。接GND、VCC或悬空,用于设置器件从地址的低3位。 |
8 | VCC | 电源正极(2.8V ~ 5.5V) |
4 | GND | 电源地 |
I²C 地址:固定高4位为 1001
,低3位由A2, A1, A0引脚的电平决定。因此从地址范围为 0x48
到 0x4F
。
注意要在启动代码(start.s)中加入