常用接口及外设之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仲裁

典型场景:多个主设备几乎同时向从设备发送数据。如果没有仲裁机制,会造成数据混乱或总线冲突。
仲裁原理:仲裁发生在地址阶段(发送地址期间),

  1. 所有主设备同步发送数据(地址位),并边发送边监听 SDA 线的电平
  2. 如果某个主设备发送高电平但 SDA 实际为低电平(说明另一个主机拉低了SDA),则说明发生冲突;
  3. 检测到冲突的一方自动停止传输,放弃控制总线
  4. 胜出的主设备继续传输。
    示例:
    假设两个主设备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/2301_79475128/article/details/145404621?spm=1001.2101.3001.6650.4&utm_medium=distribute.pc_relevant.none-task-blog-2~default~YuanLiJiHua~Position-4-145404621-blog-131834694.235^v43^pc_blog_bottom_relevance_base2&depth_1-utm_source=distribute.pc_relevant.none-task-blog-2~default~YuanLiJiHua~Position-4-145404621-blog-131834694.235^v43^pc_blog_bottom_relevance_base2&utm_relevant_index=9

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

posted @ 2025-03-27 11:20  chivalrySun  阅读(557)  评论(0)    收藏  举报