I2C(Inter-Integrated Circuit)总线是集成电路间的数据交换总线,由PHILIPS公司开发的两线式串行总线,用于连接微控制器及其外围设备。I2C总线产生于在80年代,最初为音频和视频设备开发,如VGA设备的配置,HDMI设备的配置等。当前I2C应用已变的极为广泛,除了做配置接口,在低速的存储器,AD/DA等方面也有较为广泛的应用。
一、I2C 接口特点:
- I2C接口是两线制接口总线:即通信接口只有两根线SCL(Serial Clock line)与SDA(Serial Data line)。其中SCL是时钟线,SDA为数据线。因此I2C 总线是非常简洁的设备总线。
- 同步通信方式:由于数据线SDA在时钟线SCL的驱动下的输出或读入,因此是同步通信的一种。
- 主从模式:I2C 总线分为主从模式,主模式(Master)一般为主控制器或FPGA等智能器件,从模式一般为E2PROM 或AD/DA的器件。通信由主器件发起,从器件响应,最后由主器件结束。每个从设备都有一个惟一的ID号,该ID号一般是7位的2进制数,也称为从设备的地址。
- 多主多从的总线结构:I2C 总线是多主多从的总线结构,挂在总线的器件或设备都可以为主模式,也可以为从模式,甚至可以在通信期间完成主从角色转换。
- 器件或设备的总线输出是高阻状态:无论SDA还是SCL在输出时都遵循如下规律,在低电平输出时是灌电流的方式,这与数字系统中的TTL,CMOS,LVTTL,LVCMOS等的电平一致,但在高电平输出时,SDA与SCL都是漏极开路的方式输出,也就是高阻态输出。这主要是为了满足多器件共享总线所决定的。因此在I2C的功能与总线接口时应注意高电平到高阻的转换。具体参考例1的描述。
- 从设备可以通过拉低SCL从而可以暂停通信过程(SCL stretch),实现主从读写速度匹配。例如主设备读数据,从设备在数据准备阶段可以拉低SCL从而使总线处于等待状态。因此主从设备的SCL都可以做输入、输出。
- 如果总线只有一个Master,而且Slave设备又没有SCL stretch的功能(多数从设备没有SCL的输出功能),这种情况下SCL可以采用推拉结构。
- SDA的数据分为稳定区域与可变区域,在SCL为低电平区间,SDA数据可以根据通信内容变化;在SCL为高电平期间,SDA保持数据不变。也可以理解为SCL为低电平区间准备数据,SCL上升沿锁存。如图1,
图1
9.总线需要上拉电阻:由于SDA与SCL都是高阻输出,因此在总线上需要接上拉电阻,该上拉电阻是总线共享的。如图2,
图2 单主单从
图3 单主多从
图4 多主多从
例1:利用Verilog描述I2C的MASTER总线状态
module I2C_M ( input rst, input clk, inout scl, inout sda, input [ 7: 0 ] data_in, output [ 7: 0 ] data_out ); wire scl_in; wire sda_in; wire scl_out; wire sda_out; assign scl_in = scl; assign sda_in = sda; //从内部scl_out到总线端口scl,高电平到高阻的转换, //从内部sda_out到总线端口scl,高电平到高阻的转换 assign scl = scl_out ? 1'bZ : 1'b0; assign sda = sda_out ? 1'bZ : 1'b0; //如果只有一个MASTER,而且SLAVE的SCL没有拉伸功能(stretch),也可以采用推 //拉方式,此时总线的上拉电阻也可以移除。此时的scl可以直接赋值,但SDA仍然需 //要高阻设置 //assign scl = scl_out ? 1'b1 : 1'b0; //assign sda = sda_out ? 1'bZ : 1'b0; I2C_RD I2C_RD_inst ( .rst ( rst ), .clk ( clk ), .scl_in ( scl_in ), .scl_out ( scl_out ), .sda_in ( sda_in ), .sda_out ( sda_out ), .data_out( data_out ) ); I2C_wr I2C_wr_inst ( .rst ( rst ), .clk ( clk ), .scl_in ( scl_in ), .scl_out ( scl_out ), .sda_in ( sda_in ), .sda_out ( sda_out ), .data_in ( data_in ) ); endmodule
二、I2C的速度
I2C从最初的100K的通信速度,后来经过几次版本修订,目前支持4种不同等级的速度,分别为低速(standard mode 标准模式),快速(fast mode),高速(fast mode plus),超速(high-speed mode)4种,可见这四种模式的命名有点混乱,总之可以以规范的命名为准。如表1
表1
I2C总线速度类型 | 速度 | 备注 |
低速(standard mode) | 100K | low speed,小于等于100Kbps |
快速(fast mode) | 400K | fast speed ,小于等于400Kbps |
高速(fast mode plus) | 1M | high speed , 小于等于1Mbps |
超速(high-speed mode) | 3.4M | super speed,小于等于3.4Mbps |
当各种不同速度等级器件挂在总线上时,一般按照速度最低的器件速度运行,如在总线上有100K,400K两种从模式的器件,主模式也支持两种速度,为了能更好的访问到每个器件,主器件要使用100K的速度模式兼容两种器件,也就是说I2C 的速度是向下兼容的。而且对于某种速度只规定了最高值,比如400K速度等级的器件,最高能运行在400K可以保证可靠的读写,并不是说只能运行在400K, 在200K,100K甚至20K都能运行。也就是说对于某个器件只规定最高速度,低于这个速度,理论上都能运行。
三、I2C 的状态
- 空闲(IDLE)状态:在启动通信之前,I2C处在空闲状态,在空闲状态时SCL,SDA都为高电平状态(所有器件都为高阻,由上拉电阻将总线设为高阻)。
- 启动(START)状态:I2C在SCL为高电平期间,SDA由高到低的转换,启动了I2C的通信过程。
- 设备地址选择状态:由于I2C 是总线型的连接方式,所有设备共享这一对总线,而且同一时刻只有一对设备(一主,一从)能够通信,因此主设备在与从设备交换数据之前,必须确定与那个设备通信,因此在与该从设备交换数据前,先发送该设备的地址(7位ID)以及读写标志,等待从设备应答后,读/写才能正常运行。
- 数据读/写阶段:完成以上前三个阶段就可以进行数据读写了。
- 停止(STOP)状态:I2C在SCL为高电平期间,SDA由低到高的转换,停止I2C的通信过程。此后I2C总线将回到空闲状态。状态1-5如图5,
图5
6.设备地址及读写选择
I2C总线设备地址有两种格式,一种为7位二进制格式,如EEPROM的地址为0x50 — 0x57 。另一种为10位格式,目前10位格式使用很少。在7位地址中,主设备发起启动(start)后,紧跟的是设备地址(7bit),其后是一位读/写(R/W#)标志位 。该位为0,标识其后的过程为写数据过程;如果为1,标识其后为读过程。读/写控制位之后是从设备的应答位(acknowledge, 1bit)如图6,
图6
应答(acknowledge)是从设备回应主设备地址的过程,由于I2C总线上可以挂多个设备,因此从设备收到地址后都与自己本身的地址比较,如果某个从设备的地址与捕获到的地址比较相符,则该设备发出应答信号,表明地址匹配,可以进行随后的读写过程。从设备应答是在应答位置将SDA拉低,主设备检测到该低电平,表示得到某个从设备的应答。为了能准确检测到低电平应答,主设备SDA在应答位期间应为高阻状态(总线由上拉电阻拉高),从设备应答将总线拉低, 否则没法确定总线低电平是由主设备拉低还是从设备应答拉低。
7位地址的保留码,为了将来扩展,7位地址没有全部使用,为后来发展预留了空间。其中11110xx就留给了10位地址扩展使用。
表2
从机地址+R/W | 描述 |
0000 0000 | 呼叫地址 |
0000 0001 | 起始字节 |
0000 001x | CBUS地址 |
0000 010x | 保留供不同的总线格式 |
0000 011x | 保留将来用 |
0000 1xxx | HS模式主机码 |
1111 0xxx | 10位从机地址 |
1111 1xxx | 保留将来用 |
10位地址的匹配过程,由于7位地址预留11110xx作为10位扩展使用,因此10位的地址格式如图7:
图7
从图7可以看出,10位地址被分成了两个部分,11110xx中的xx是10位地址中的高两位地址,SLAVE ADDRESS 2nd BYTE 是10位地址中的低8位。从图中可以看出读/写标志是紧跟第一个7位地址(其中只有xx是有效地址),而且从设备有两次应答A1,A2。
更多知识见文章I2C接口基础知识二。