I2C(Inter-Integrated Circuit)由飞利浦公司在20世纪80年代初开发,是一种用于集成电路间通信的串行总线。它支持多主从、双向、半双工通信,广泛应用于嵌入式系统中,如传感器接口、显示控制等。
基础知识
1. 总线结构
两条线:SDA(数据线)和SCL(时钟线)。
上拉电阻:通常在1kΩ到10kΩ之间,确保总线在空闲时保持高电平。
2. 数据传输
同步通信:SCL线提供时钟信号,数据在SDA线上传输。
位和字节传输:数据以8位字节为单位传输,每个字节后跟一个ACK位。
3. 操作时序
START条件:SDA在SCL为高电平时从高变低。
STOP条件:SDA在SCL为高电平时从低变高。
ACK/NACK:用于确认字节传输成功或结束。
模式和速度
标准模式:100 kbps
快速模式:400 kbps
快速模式+:1 Mbps
高速模式:3.4 Mbps
超高速模式:5 Mbps(部分设备支持)
读写操作
写操作
比如:向0x20设备的0x1234寄存器写入0x5678:
- 设备地址和写命令:0100 0000(发送)
- 寄存器地址(高字节0x12,低字节0x34):0001 0010,0011 0100
- 数据(高字节0x56,低字节0x78):0101 0110,0111 1000
- 信号序列:[START] 0100 0000 [ACK] 0001 0010 [ACK] 0011 0100 [ACK] 0101 0110 [ACK] 0111 1000 [ACK] [STOP]
读操作
从0x20设备的0x0E寄存器读取数据:
- 设置寄存器地址:[START] 0100 0000 [ACK] 0000 0000 [ACK] 0000 1110 [ACK]
- 重复START和读命令:[RESTART] 0100 0001 (接收)[ACK]
- 接收数据:[DATA] [ACK] [DATA] [NACK] [STOP]
- 信号序列就是:[START] 0100 0000 [ACK] 0000 0000 [ACK] 0000 1110 [ACK][RESTART] 0100 0001 [ACK][DATA] [ACK] [DATA] [NACK] [STOP]
特殊功能
时钟拉伸:从设备可将SCL拉低以请求更多处理时间。
广播地址:0x00,所有设备均会响应。
重复START条件:无需释放总线即可进行新的传输。