一. I2C总线简介
I2C是Philips设计的一套总线规范,其中包括了硬件上的设计参考和软件的总线上的数据传输的时序。I2C总线上一个主机可以连接多个从机,主机通过从机的地址和从机交互。
I2C总线现在的应用可以说是不胜枚举,非常多的传感器,EEPROM,LCD驱动芯片等都是通过I2C总线控制。
本文主要讲解7位地址格式的I2C总线的时序部分。
二. I2C总线的一些基本概念
1. 发送器
发送数据到总线的器件。所以I2C总线上的所有器件都可以是发送器,由器件功能决定,例如,LCD驱动芯片就只需要接收,而不需要发送。
2. 接收器
从总线上接收数据的器件。
3. 主机
初始化发送,产生时钟信号和停止发送的器件,通常指CPU。
4. 从机
被主机寻址的器件。
5. 多主机
同时有多个主机尝试控制总线,但是不破坏报文。
6. 仲裁
在一个有多个主机尝试控制总线,但只允许其中一个主机控制总线但是不破坏报文的过程。
7. 同步
两个或多个器件同步时钟信号的过程。
总结:
1. 主机或从机都可能是发送器和接收器,视器件的功能而定。
2. 发送信号,终止信号,时钟信号都是由主机发出的。
3. 从机是通过被主机寻址,从而与主机交互数据。
4. 当一个总线上出现多个主机时,主机间需要通过仲裁产生一个允许控制总线的主机。
三. 7位地址格式的I2C总线的时序
1. I2C数据传输
I2C数据传输时序:
在SDA线上的每个字节必须为8位,每次传输可以发送的字节数量没有限制,但是每个字节后必须跟一个响应位。首先传输的是数据的最高位(MSB),如果从机要完成一些其他功能后才能接收下一个字节,从机可以将SCL保持低电平,进入等待状态。当从机准备好接收下一个字节并释放时钟线,数据会继续传输。
2. 7位地址传输格式
7位的地址格式:
7位地址格式表示start信号后的第一个字节表示地址,地址由bit1-7和bit8 R(1)/W(0)组合而成。地址的范围由下表所示。
从机地址 | R/W 位 | 描述 |
0000 000 | 0 | 广播呼叫地址 |
0000 000 | 1 | 起始字节 |
0000 001 | X | CBUS地址 |
0000 010 | X | 保留给不同的总线格式 |
0000 011 | X | 保留到将来使用 |
0000 1XX | X | Hs模式主机码 |
1111 1XX | X | 保留到将来使用 |
1111 0XX | X | 10位从机地址 |
3. 起始和停止信号
从上图可以看出,当时钟线(SCL)为高电平时,数据线(SDA)由高电平向低电平切换,这种情况表示起始信号。当时钟线(SCL)为高电平时,数据线(SDA)由低电平向高电平切换,这种情况表示停止信号。总线在起始信号后,停止信号前都被认为是忙状态,在停止信号一段时间后,总线被认为是空闲状态。
总结:
当时钟线(SCL)为高电平时,数据线(SDA)电平变化会产生起始或停止信号。所以在传输实际数据时,数据线(SDA)电平变化时,时钟线(SCL)必须为低电平。
4. 响应
数据传输必须带响应。响应的时钟(SCL)脉冲由主机输出,在响应时,发送器不控制数据线(SDA)电平信号,由接收器控制。并且在响应期间,接收器必须将SDA拉低,使在这个时钟的高电平期间保持稳定低电平。
四. 总结
本文介绍了7位地址格式的I2C协议和时序特点,为后面分析Linux内核I2C打基础。