Menu Close

I2C接口基础知识一

I2C接口基础知识一

I2C(Inter-Integrated Circuit)总线是集成电路间的数据交换总线,由PHILIPS公司开发的两线式串行总线,用于连接微控制器及其外围设备。I2C总线产生于在80年代,最初为音频和视频设备开发,如VGA设备的配置,HDMI设备的配置等。当前I2C应用已变的极为广泛,除了做配置接口,再低速的存储器,AD/DA等方面也有较为广泛的应用。

一、I2C 接口特点:

  1. I2C接口是两线制接口总线:即通信接口只有两根线SCL与SDA。其中SCL是时钟线,SDA为数据线。因此I2C 总线是非常简洁的设备总线。
  2. 同步通信方式:由于数据线SDA在时钟线SCL的驱动下的输出或读入,因此是同步通信的一种。
  3. 主从模式:I2C 总线分为主从模式,主模式(Master)一般为主控制器或FPGA等智能器件,从模式一般为E2PROM 或AD/DA的器件。通信一般由主器件发起,从器件响应,最后由主器件结束。每个从设备都有一个惟一的ID号,该ID号一般是7位的2进制数,也称为从设备的地址。
  4. 多主多从的总线结构:I2C 总线是多主多从的总线结构,挂在总线的器件或设备都可以为主模式,也可以为从模式,甚至可以在通信期间完成主从角色转换。
  5. 器件或设备的总线输出是高阻状态:无论SDA还是SCL在输出时都遵循如下规律,在低电平输出时是灌电流的方式,这与数字系统中的TTL,CMOS,LVTTL,LVCMOS等的电平一致,但在高电平输出时,SDA与SCL都是漏极开路的方式输出,也就是高阻太输出。这主要是为了满足多器件共享总线所决定的。因此在I2C的功能与总线接口时应注意高电平到高阻的转换。具体参考例1的描述。
  6. 从设备可以通过拉低SCL从而可以暂停通信过程(SCL stretch),实现主从读写速度匹配。例如主设备读数据,从设备在数据准备阶段可以拉低SCL从而使总线处于等待状态。因此主从设备的SCL都可以做输入、输出。
  7. 如果总线只有一个Master,而且Slave设备又没有SCL stretch的功能(多数从设备没有SCL的输出功能),这种情况下SCL可以采用推拉结构。
  8. SDA的数据分为稳定区域与可变区域,在SCL为低电平区间,SDA数据可以根据通信内容变化;在SCL为高电平期间,SDA保持数据不变。也可以理解为SCL为低电平区间准备数据,SCl上升沿锁存。如图1,

%title插图%num

图1

  1. 总线需要上拉电阻:由于SDA与SDL都是高阻输出,因此在总线上需要接上拉电阻,该上拉电阻是总线共享的。如图2,

%title插图%num

图2 单主单从

%title插图%num

图3 单主多从

%title插图%num 图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’bZ: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 的状态

  1. 空闲(IDLE)状态:在启动通信之前I2C处在空闲状态,在空闲状态时SCL,SDA都为高电平状态(所有器件都为高阻,由上拉电阻将总线设为高阻)。
  2. 启动(START)状态:I2C在SCL为高,SDA由高到低的转换,启动了I2C的通信过程。
  3. 设备地址选择状态:由于I2C 是总线型的连接方式,所有设备共享这一对总线,而且同一时刻只有一对设备(一主,一从)能够通信,因此主设备在与从设备交换数据之前,必须确定与那个设备通信,因此在与该从设备交换数据前,先发送该设备的地址(7位ID)以及读写标志,等待从设备应答后,读/写才能正常运行。
  4. 数据读/写阶段:完成以上前三个阶段就可以进行数据读写了。
  5. 停止(STOP)状态:I2C在SCL为高,SDA由低到高的转换,停止I2C的通信过程。此后I2C总线将回到空闲状态。状态1-5如图4,

%title插图%num

图5

  1. 设备地址及读写选择

I2C总线设备地址有两种格式,一种为7位二进制格式,如EEPROM的地址为0x50-0x57。另一种为10位格式,目前10位格式使用很少。在7位地址中,主设备发起启动(start)后,紧跟的是设备地址,其后是一位读/写(R/W#)标志位,该位为0,标识其后的过程为写数据过程,如果为1,标识其后为读过程。读/写控制位之后是从设备的应答(acknowledge)如图6,

%title插图%num

图6

应答(acknowledge)是从设备回应主设备地址的过程,由于I2C总线上可以挂120个设备,因此从设备收到地址后都与自己本身的地址比较,如果某个从设备的地址与捕获地址比较相符,则该设备发出应答信号,表明地址匹配,可以进行随后的读写过程。从设备应答是在应答位置将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:

%title插图%num

图7

从图7可以看出,10位地址被分成了两个部分,11110XX中的XX是10位地址中的高两位地址,SLAVE ADDRESS 2nd BYTE 是10位地址中的低8位。从图中可以看出读/写标志是紧跟第一个7位地址(其中只有XX是有效地址),而且从设备有两次应答A1,A2。

 

Posted in FPGA, FPGA, 教材与教案, 文章

2 Comments

    • tzhuang

      没有直接关系,高频时钟可以通过分频实现,而且I2c的速率也不是固定的,比如100K,对I2C 允许0-100K 之间. 后面的课程专门有该专题讨论.

发表评论

相关链接