Menu Close

I2C接口基础知识一

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

一、I2C 接口特点:

  1. I2C接口是两线制接口总线:即通信接口只有两根线SCL(Serial Clock line)与SDA(Serial Data line)。其中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,

图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 的状态

  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如图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接口基础知识二

I2C 接口及协议 规范(中文版)

Posted in FPGA, FPGA 教材教案, Verilog, 教材与教案, 文章, 编程语言

发表回复

相关链接