I2C
I2C
参考链接:
- UM10204 I2C-bus specification and user manual Rev. 7.0
- 一文看懂I2C协议 - 王超的文章 - 知乎
- I²C(IIC)总线协议详解—完整版 - 曾小庆的文章 - 知乎
- 单片机I2C通信入门(上):硬件部分有哪些注意点?
- 单片机I2C通信入门(下):三份文件搞清楚I2C通信协议
1. I2C是什么?
I2C的全称是Inter-Integrated Circuit,意思是芯片与芯片之间的通讯。它是由Philips(飞利浦)公司,现NXP(恩智浦)半导体开发的一种简单的双向两线制总线协议标准。
2. I2C总线的特点
翻译自UM10204 I2C-bus features
- 只需要两线:一个串行数据线(SDA),一个串行时钟线(SCL)
- 连接到总线的每一个设备都可以通过唯一的地址进行软件寻址,并且始终存在简单的控制器/目标关系;控制器可以作为控制器-发送器或者控制器-接收器运行。
- 是真正的多控制总线,包括冲突检测和仲裁,以防止在两个或更多个控制器同时启动数据传输时损坏数据。
- 串行、8位、双向数据传输在标准模式下最高可达100 kbit/s,在快速模式下最高可达400 kbit/s,在快速模式+下最高可达1 Mbit/s,在高速模式下最高可达3.4 Mbit/s。
- 串行、面向 8 位的单向数据传输,在超快模式下传输速度高达 5 Mbit/s。
- 片内滤波可抑制总线数据线上的尖峰,以保持数据完整性。
- 可连接到同一总线的IC数量仅受最大总线电容的限制。在某些情况下,可能允许更大的电容。
3. 5种速率模式
速率模式-ch | 速率模式-en | 速率 | 备注 |
---|---|---|---|
标准模式 | Standard-mode | 100 kbit/s | |
快速模式 | Fast-mode | 400 kbit/s | |
快速模式+ | Fast-mode Plus | 1 Mbit/s | |
高速模式 | High-speed mode | 3.4 Mbit/s | |
超快模式 | Ultra Fast-mode | 5Mbps | 单向传输 |
3. I2C总线的硬件设计
I2C总线对于设备上的IO口进行了一些阉割,总线在默认状态下是高电平,MOS管导通时变为低电平。
I2C总线为了解决多设备共用总线而不烧毁电路的问题,采用了开漏输出的方案,配合上拉电阻,可以输出完整的高低电平。上拉电阻值,在总线设备多,速度要求高的时候可以设置相对小一些。
4. I2C总线协议
4.1. I2C总线术语的定义
Term | 术语 | Description 描述 |
---|---|---|
Transmitter | 发射机 | 向总线发送数据的设备 |
Receiver | 接收机 | 从总线接收数据的设备 |
Controller | 控制器 | 启动传输、生成时钟信号并终止传输的设备 |
Target | 目标 | 控制器寻址的设备 |
Multi-controller | 多控制器 | 多个控制器可以尝试同时控制总线,而不会损坏消息 |
Arbitration | 仲裁 | 程序以确保如果多个控制器同时尝试控制总线,则只允许一个控制器这样做,并且获胜消息不会损坏 |
Synchronization | 同步 | 同步两个或多个设备的时钟信号的过程 |
获胜消息:在多个控制器争夺总线控制权的过程中,最终成功获得控制权的控制器所发送的信息
4.2. 数据传输方式
- 假设微控制器 A 想要向微控制器 B 发送信息:
- A(控制器)寻址 B(目标)
- A(控制器-发送器),将数据发送到B(目标接收器)
- A 终止传输。
- 如果 A 想要从 B 接收信息:
- A(控制器)寻址 B(目标)
- A(控制器-接收器)从 B(目标发送器)接收数据
- A 终止传输。
4.3. 4种信号
- 起始信号
- SCL处于高电平时,SDA由高到低变化,这种信号是起始信号。
- 停止信号
- SCL处于高电平时,SDA由低到高变化,这种信号是停止信号。
- 应答信号
- I2C最大的一个特点就是有完善的应答机制,从机接收到主机的数据时,会回复一个应答信号来通知主机表示“我收到了”。
- 应答信号出现在1个字节传输完成之后,即第9个SCL时钟周期内,此时主机需要释放SDA总线,把总线控制权交给从机,由于上拉电阻的作用,此时总线为高电平,如果从机正确的收到了主机发来的数据,会把SDA拉低,表示应答响应。
- 非应答信号
- 当第9个SCL时钟周期时,SDA保持高电平,表示非应答信号。
5. 总结
- I2C 4种信号的分别是什么形式?
others
只能说自己对于I2C的了解程度还是不够的。之前使用I2C,无非是驱动OLED屏幕、读取传感器的值这样的任务,没有使用I2C总线连接多个设备使用。以后一定要做个小项目切身体验一下,加深理解。