常用接口及外设之I2C
i2c
| 协议 | 线数 | 组成 | 结构 | 传输模式 | 传输速率 | 传输距离 | 典型应用 |
|---|---|---|---|---|---|---|---|
| I2C | 2 | SDA(数据)、SCL(时钟) | 主从(一主多从) | 同步半双工,有时钟 | 100kbps~3.4Mbps | <1m | 低功耗、适用于短距离多设备通信(传感器、EEPROM)。 |
| SPI | 4+ | MOSI(主→从)、MISO(从→主)、SCK(时钟)、CS(片选) | 主从(一主多从) | 同步全双工,有时钟 | 1Mbps~100Mbps | <1m | 最快速,适用于高数据吞吐(Flash、LCD) |
| UART | 2 | TX(发送)、RX(接收) | 点对点 | 异步,无需时钟 | 9600bps~1Mbps(部分 MCU 可达 12Mbps) | <15m | 串口调试和低速数据通信 |
| CAN | 2 | CAN_H(高电平)、CAN_L(低电平) | 多对多 | 同步半双工,有时钟 | 10kbps~1Mbps | 40m~1km | 最可靠,适用于远距离多设备(汽车、工业总线)。 |
定义
I²C(Inter-Integrated Circuit)是一种 同步、半双工、串行通信协议,由 飞利浦(现NXP) 开发,主要用于短距离、低速设备通信,例如传感器、EEPROM、RTC(Real-Time Clock) 等。
特点
| 线数 | 2(SCL/SDA) |
|---|---|
| 数据帧大小 | 8bit数据包 |
| 标准模式(Standard Mode) | 100 kbps |
| 快速模式(Fast Mode) | 400 kbps |
| 高速模式(High-Speed Mode) | 3.4 Mbps |
| 超高速模式(Ultra-Fast Mode) | 5 Mbps |
| 严格的波特率 | 否 |
| master数量 | 不限 |
| slave数量 | 7-bit 地址模式:最多支持128个从设备 |
通讯协议
① I²C 采用 主从(Master-Slave) 通信架构:
主设备(Master):控制总线,产生时钟信号,启动和终止数据传输。
从设备(Slave):等待主机访问,被动接收或发送数据。
② I²C 设备地址:
7-bit 地址模式:最常用,每个从机有一个 7-bit 地址,最多支持 128 个设备。
10-bit 地址模式:支持更多设备,但较少使用。
7-bit 地址模式
| 起始位(S) | A6 | A5 | ... | A0 | R/W | ACK | 数据 Byte | ACK | 数据 Byte | ACK | 停止位(P) |
|---|
start --> slave地址 --> master读写 --> slave确认 -->数据传输--> slave确认 -->数据传输 --> stop
R/W 为0时,表示写操作,主设备向从设备写数据;为1时,表示读操作,主设备从从设备读取数据;
③ 数据传输格式
I²C 数据传输采用 字节(Byte)传输,每次传输 8-bit 数据,并使用 ACK(应答信号) 确认。
④完整传输流程

- 起始信号(S):SCL高电平时,主设备将SDA由高电平拉到低电平,表示数据开始传输;
- 开始信号之后7bit是slave 地址帧;master设备控制SDA的高低发送salve地址;指定主机通讯的对象;
- 7bit地址帧之后是R/W,确认数据传输方向;
- salve设备发送ACK信号,将SDA拉低,之后开始传输数据;
- 接下来8个时钟周期内,如果是写操作,则主设备控制SDA的高低,向从设备写入数据,如果是读操作则从设备控制SDA的高低,主设备从从设备读取数据;
- 数据采用 字节(Byte)传输,每次传输 8-bit 数据,并使用 ACK(应答信号) 确认;
- 在SCL每个时钟脉冲期间传输一个数据位,SCL为高电平时,SDA数据有效,SDA高电平时表示 “1”,SDA低电平时表示 “0”;
- SCL为低电平时,SDA数据为无效数据,此时SDA可以进行电平切换;
- 停止信号(P):SCL高电平时,主设备将SDA由低电平向高电平转换,表示数据结束传输。
i2c多master仲裁
典型场景:多个主设备几乎同时向从设备发送数据。如果没有仲裁机制,会造成数据混乱或总线冲突。
仲裁原理:仲裁发生在地址阶段(发送地址期间),
- 所有主设备同步发送数据(地址位),并边发送边监听 SDA 线的电平;
- 如果某个主设备发送高电平但 SDA 实际为低电平(说明另一个主机拉低了SDA),则说明发生冲突;
- 检测到冲突的一方自动停止传输,放弃控制总线;
- 胜出的主设备继续传输。
示例:
假设两个主设备A和B尝试发送不同的地址:
主A发送:1010000
主B发送:1010011
前4位一致,第5位开始分歧:
| Bit Index | 主A发送 | 主B发送 | 实际SDA | 结果 |
|---|---|---|---|---|
| 1-4 | 1 0 1 0 | 1 0 1 0 | 1 0 1 0 | 都继续 |
| 5 | 0 | 0 | 0 | 都继续 |
| 6 | 0 | 1 | 0 | B败出 |
在第6位,主B发送1,但实际SDA为0(A在拉低),B检测到冲突,退出。谁在发0谁赢;
参考链接:
https://blog.csdn.net/weixin_49259827/article/details/133638704?utm_medium=distribute.pc_relevant.none-task-blog-2defaultbaidujs_baidulandingword~default-1-133638704-blog-145404621.235v43pc_blog_bottom_relevance_base2&spm=1001.2101.3001.4242.2&utm_relevant_index=4
https://blog.csdn.net/caiji0169/article/details/142891513?utm_medium=distribute.pc_relevant.none-task-blog-2defaultbaidujs_baidulandingword~default-0-142891513-blog-133638704.235v43pc_blog_bottom_relevance_base2&spm=1001.2101.3001.4242.1&utm_relevant_index=3
浙公网安备 33010602011771号