1. IIC总线概述
IIC(Inter-Integrated Circuit)是一种由 Philips 公司(现为 NXP 半导体)开发的双向二线制同步串行总线,专为短距离通信而设计,广泛应用于连接微控制器及其外围设备。
1.1 总线物理层
IIC 总线仅需两根信号线:
- SCL(Serial Clock):串行时钟线,由主设备产生
- SDA(Serial Data):串行数据线,双向传输数据
1.2 总线特性
- 多主从架构:支持多个主设备和多个从设备
- 线与逻辑:SCL 和 SDA 线均通过上拉电阻连接到电源
- 寻址机制:每个从设备拥有唯一的 7 位或 10 位地址
- 仲裁机制:当多个主设备同时竞争总线时,确保数据完整性
2. IIC时序图基本组成
2.1 起始条件(Start Condition)
时序要求:当 SCL 为高电平期间,SDA 由高电平向低电平的跳变表示起始信号。
示意图:
SCL: ____/\____/\____
SDA: _______/\_______
|
起始条件
2.2 停止条件(Stop Condition)
时序要求:当 SCL 为高电平期间,SDA 由低电平向高电平的跳变表示停止信号。
示意图:
SCL: ____/\____/\____
SDA: ____/\_______
|
停止条件
2.3 数据传输
基本规则:
- 数据传输以字节(8位)为单位
- 每个字节传输后,接收方需要发送一个确认位(ACK)
- 数据位在 SCL 低电平期间准备
- 在 SCL 高电平期间,SDA 上的数据必须保持稳定
- 每个字节的最高位(MSB)先传输
时序示意图:
SCL: __/\__/\__/\__/\__/\__/\__/\__/
SDA: __X__X__X__X__X__X__X__X__X__
位7 位6 位5 位4 位3 位2 位1 位0 ACK
2.4 确认位(ACK)
工作原理:
- 发送方在发送完 8 位数据后,释放 SDA 线(由上拉电阻拉高)
- 接收方在第 9 个时钟周期将 SDA 拉低,表示确认
- 如果接收方不发送 ACK,则 SDA 保持高电平(NACK)
意义:
- ACK:表示数据已成功接收,准备接收下一字节
- NACK:表示数据接收失败或已完成数据传输
3. IIC时序图详细分析
3.1 起始和停止条件时序
起始条件:
- SCL 保持高电平
- SDA 从高电平切换到低电平
- 起始条件后,总线被认为处于忙状态
停止条件:
- SCL 保持高电平
- SDA 从低电平切换到高电平
- 停止条件后,总线被认为处于空闲状态
3.2 数据传输时序
详细步骤:
- 发送方在 SCL 低电平期间设置 SDA 数据(输出数据)
- 发送方将 SCL 拉高
- 接收方在 SCL 高电平期间采样 SDA 数据(输入数据)
- 发送方将 SCL 拉低
- 重复步骤 1-4,直到 8 位数据传输完成
- 发送方释放 SDA,准备接收确认位
- 接收方在第 9 个时钟周期发送 ACK 或 NACK
- 发送方检测确认位状态
3.3 时钟拉伸(Clock Stretching)
概念:从设备可以通过拉低 SCL 线来延长时钟周期,以请求主设备等待。
应用场景:
- 从设备需要更多时间处理接收到的数据
- 从设备需要时间准备要发送的数据
- 从设备内部处理速度较慢
时序示意图:
SCL: __/\_________/\__
| |
|_________| 从设备拉伸时钟
4. IIC总线速率
IIC 总线支持多种速率模式,适应不同的应用场景:
|------------------------|----------|---------|
| 模式 | 最大数据速率 | 适用场景 |
| 标准模式(Standard Mode) | 100 kbps | 一般嵌入式系统 |
| 快速模式(Fast Mode) | 400 kbps | 高速外设通信 |
| 快速模式+(Fast Mode Plus) | 1 Mbps | 高速数据传输 |
| 高速模式(High-Speed Mode) | 3.4 Mbps | 超高带宽需求 |
| 超快速模式(Ultra-Fast Mode) | 5 Mbps | 极限性能应用 |
5. 高级时序特性
5.1 总线仲裁
工作原理:当多个主设备同时尝试控制总线时,通过位仲裁机制决定哪个设备获得控制权。
仲裁过程:
- 多个主设备同时发送起始信号
- 每个主设备在发送数据位的同时监测 SDA 线
- 如果发现自己发送的位与 SDA 线上的实际位不符(自己发送 1,而 SDA 为 0),则退出仲裁
- 最后 remaining 的主设备获得总线控制权
特点:仲裁过程中不会丢失数据,确保通信的完整性。
5.2 时钟同步
同步机制:多个主设备的时钟信号通过线与逻辑同步。
原理:
- 每个主设备在 SCL 低电平期间将自己的时钟拉低
- 当所有主设备都释放 SCL 后,SCL 由上拉电阻拉高
- 最终的 SCL 时钟由最慢的设备决定
5.3 重复起始条件(Repeated Start)
概念:在一次通信中,主设备发送起始信号后,不发送停止信号,而是发送另一个起始信号。
应用场景:
- 主设备需要在同一次通信中切换读写操作
- 主设备需要与不同从设备通信,而不释放总线
时序:
SCL: ____/\____/\____/\____/\____
SDA: _______/\_______/\_______
| |
起始条件 重复起始条件
6. IIC通信时序示例
6.1 主设备向从设备写入数据
完整时序:
- 主设备发送起始信号
- 主设备发送从设备地址(7位)+ 写入位(0)
- 从设备发送确认位(ACK)
- 主设备发送数据字节
- 从设备发送确认位(ACK)
- 重复步骤 4-5,发送更多数据
- 主设备发送停止信号
6.2 主设备从从设备读取数据
完整时序:
- 主设备发送起始信号
- 主设备发送从设备地址(7位)+ 读取位(1)
- 从设备发送确认位(ACK)
- 从设备发送数据字节
- 主设备发送确认位(ACK)(表示继续读取)
- 重复步骤 4-5,读取更多数据
- 主设备发送非确认位(NACK)(表示停止读取)
- 主设备发送停止信号
6.3 复合操作(写后读)
应用场景:读取从设备特定寄存器的数据
完整时序:
- 主设备发送起始信号
- 主设备发送从设备地址 + 写入位
- 从设备发送ACK
- 主设备发送寄存器地址
- 从设备发送ACK
- 主设备发送重复起始信号
- 主设备发送从设备地址 + 读取位
- 从设备发送ACK
- 从设备发送数据
- 主设备发送NACK
- 主设备发送停止信号
7. 时序设计注意事项
7.1 硬件设计考量
- 上拉电阻选择:根据总线速率和负载电容选择合适的上拉电阻值
-
- 标准模式:1kΩ - 10kΩ
- 快速模式:1kΩ - 4.7kΩ
- 高速模式:需使用特定的上拉电路
- 总线电容限制:
-
- 标准模式/快速模式:最大 400pF
- 高速模式:最大 200pF
7.2 软件实现要点
- 时序精度:确保 SCL 和 SDA 的时序符合 IIC 规范
- 超时处理:添加总线超时检测,防止死锁
- 错误处理:妥善处理 NACK、仲裁失败等异常情况
- 时钟拉伸:支持从设备的时钟拉伸请求
7.3 常见时序问题及解决方案
|--------|-----------|-------------------------------|
| 问题 | 症状 | 解决方案 |
| 数据采样错误 | 通信失败,数据错误 | 确保 SCL 高电平时间足够长,满足接收设备的建立时间要求 |
| 时钟不同步 | 通信中断 | 实现正确的时钟同步逻辑,处理时钟拉伸 |
| 总线仲裁失败 | 数据冲突 | 确保主设备正确实现仲裁逻辑,在检测到冲突时立即退出 |
| ACK 丢失 | 通信异常终止 | 检查从设备地址是否正确,确保从设备正常响应 |
8. 总结
IIC 时序图是理解和实现 IIC 通信协议的核心。通过掌握 IIC 时序的各个组成部分和时序要求,开发者可以:
- 正确设计 IIC 硬件接口电路
- 编写可靠的 IIC 通信驱动程序
- 调试和解决 IIC 通信问题
- 优化通信性能,适应不同的应用场景
IIC 协议的简洁性和灵活性使其成为嵌入式系统中最常用的串行通信协议之一,广泛应用于传感器、存储器、显示设备等外围器件的接口设计。
8.1 关键技术点回顾
- 起始/停止条件:总线控制的核心
- 数据传输时序:确保数据正确采样
- 确认机制:保证数据传输的可靠性
- 仲裁和同步:支持多主设备系统
- 时钟拉伸:提高系统兼容性
- 重复起始:优化复合操作
通过深入理解这些时序细节,开发者可以构建更加可靠、高效的 IIC 通信系统。