视频1 视频21 视频41 视频61 视频文章1 视频文章21 视频文章41 视频文章61 推荐1 推荐3 推荐5 推荐7 推荐9 推荐11 推荐13 推荐15 推荐17 推荐19 推荐21 推荐23 推荐25 推荐27 推荐29 推荐31 推荐33 推荐35 推荐37 推荐39 推荐41 推荐43 推荐45 推荐47 推荐49 关键词1 关键词101 关键词201 关键词301 关键词401 关键词501 关键词601 关键词701 关键词801 关键词901 关键词1001 关键词1101 关键词1201 关键词1301 关键词1401 关键词1501 关键词1601 关键词1701 关键词1801 关键词1901 视频扩展1 视频扩展6 视频扩展11 视频扩展16 文章1 文章201 文章401 文章601 文章801 文章1001 资讯1 资讯501 资讯1001 资讯1501 标签1 标签501 标签1001 关键词1 关键词501 关键词1001 关键词1501 专题2001
I2C总线时序详解
2025-10-03 05:22:59 责编:小OO
文档
I2C总线时序详解

I2C总线位传输

  由于连接到I2C 总线的器件有不同种类的工艺(CMOS、NMOS、双极性),逻辑0(低)和逻辑1(高)的电平不是固定的,它由电源VCC的相关电平决定,每传输一个数据位就产生一个时钟脉冲。 

数据的有效性

  SDA 线上的数据必须在时钟的高电平周期保持稳定。数据线的高或低电平状态只 有在SCL 线的时钟信号是低电平时才能改变 。

I2C位传输数据有效性

起始和停止条件

  SCL 线是高电平时,SDA 线从高电平向低电平切换,这个情况表示起始条件; 

  SCL 线是高电平时,SDA 线由低电平向高电平切换,这个情况表示停止条件。 

  起始和停止条件一般由主机产生,总线在起始条件后被认为处于忙的状态 

起始和停止条件

,在停止条件的某段时间后总线被认为再次处于空闲状态。 

如果产生重复起始条件而不产生停止条件,总线会一直处于忙的状态,此时的起始条件(S)和重复起始条件(Sr) 在功能上是一样的。

I2C总线数据传输

字节格式

  发送到SDA 线上的每个字节必须为8 位,每次传输可以发送的字节数量不受。每个字节后必须跟一个响应位。首先传输的是数据的最高位(MSB),如果从机要完成一些其他功能后(例如一个内部中断服务程序)才能接收或发送下一个完整的数据字节,可以使时钟线SCL 保持低电平,迫使主机进入等待状态,当从机准备好接收下一个数据字节并释放时钟线SCL 后数据传输继续。 

应答响应

  数据传输必须带响应,相关的响应时钟脉冲由主机产生。在响应的时钟脉冲期间发送器释放SDA 线(高)。 

  在响应的时钟脉冲期间,接收器必须将SDA 线拉低,使它在这个时钟脉冲的高电平期间保持稳定的低电平。 

通常被寻址的接收器在接收到的每个字节后,除了用CBUS 地址开头的数 。

 I2C总线数据传输和应答

据,必须产生一个响应。当从机不能响应从机地址时(例如它正在执行一些实时函数不能接收或发送),从机必须使数据线保持高电平,主机然后产生一个停止条件终止传输或者产生重复起始条件开始新的传输。 

  如果从机接收器响应了从机地址,但是在传输了一段时间后不能接收更多数据字节,主机必须再一次终止传输。这个情况用从机在第一个字节后没有产生响应来表示。从机使数据线保持高电平,主机产生一个停止或重复起始条件。 

  如果传输中有主机接收器,它必须通过在从机不产生时钟的最后一个字节不产生一个响应,向从机发送器通知数据结束。从机发送器必须释放数据线,允许主机产生一个停止或重复起始条件。

寻址方式

7位寻址

  第一个字节的头7 位组成了从机地址,最低位(LSB)是第8 位,它决定了传输的 

 普通的和带重复开始条件的7位地址格式

方向。第一个字节的最低位是“0”,表示主机会写信息到被选中的从机;“1”表示主机会向从机读信息,当发送了一个地址后,系统中的每个器件都在起始条件后将头7 位与它自己的地址比较,如果一样,器件会判定它被主机寻址,至于是从机接收器还是从机发送器,都由R/W 位决定。 

10位寻址

  10位寻址和7 位寻址兼容,而且可以结合使用。 

  10位寻址采用了保留的1111XXX 作为起始条件(S),或重复起始条件(Sr )的后第一个字节的头7 位。 

  10 位寻址不会影响已有的7 位寻址,有7 位和10 位地址的器件可以连接 

 I2C总线10位地址格式

到相同的I2C 总线。它们都能用于标准模式(F/S)和高速模式(Hs)系统。 

  保留地址位1111XXX 有8 个组合,但是只有4 个组合11110XX 用于10 位寻址,剩下的4个组合11111XX 保留给后续增强的I2C 总线。 

  10 位从机地址是由在起始条件(S) 或重复起始条件(Sr )后的头两个字节组成。 

  第一个字节的头7 位是11110XX 的组合,其中最后两位(XX) 是10 位地址的两个最高位(MSB)。 

  第一个字节的第8 位是R/W 位,决定了传输的方向,第一个字节的最低位是“0”表示主机将写信息到选中的从机,“1 ”表示主机将向从机读信息。 

  如果R/W 位是“0 ”,则第二个字节是10 位从机地址剩下的8 位;如果R/W 位是“1” 则下一个字节是从机发送给主机的数据。 

编辑本段快速和高速模式

快速模式

  快速模式器件可以在400kbit/s 下接收和发送。最小要求是:它们可以和400kbit/s 传输同步,可以延长SCL 信号的低电平周期来减慢传输。快速模式器件都向下兼容,可以和标准模式器件在0~100kbit/s 的I2C 总线系统通讯。但是,由于标准模式器件不向上兼容,所以不能在快速模式I2C 总线系统中工作。快速模式I2C 总线规范与标准模式相比有以下额外的特征: 

  1、最大位速率增加到400kbit/s; 

  2、调整了串行数据(SDA) 和串行时钟(SCL )信号的时序; 

  3、快速模式器件的输入有抑制毛刺的功能,SDA 和SCL输入有施密特触发器; 

  4、快速模式器件的输出缓冲器对SDA 和SCL 信号的下降沿有斜率控制功能; 

  5、如果快速模式器件的电源电压被关断,SDA 和SCL 的I/O 管脚必须悬空,不能阻塞总线; 

  6、连接到总线的外部上拉器件必须调整以适应快速模式I2C 总线更短的最大允许上升时间。对于负载最大是200pF 的总线,每条总线的上拉器件可以是一个电阻,对于负载在200pF~400pF 之间的总线,上拉器件可以是一个电流源(最大值3mA )或者是一个开关电阻电路。 

高速模式

  高速模式(Hs 模式)器件对I2C 总线的传输速度有具大的突破。Hs 模式器件可以在高达3.4Mbit/s 的位速率下传输信息,而且保持完全向下兼容快速模式或标准模式(F/S 模式)器件,它们可以在一个速度混合的总线系统中双向通讯。 

  Hs 模式传输除了不执行仲裁和时钟同步外,与F/S 模式系统有相同的串行总线协议和数据格式。 

  高速模式下I2C 总线规范如下: 

  1、Hs 模式主机器件有一个SDAH 信号的开漏输出缓冲器和一个在SCLH 输出的开漏极下拉和电流源上拉电路。这个电流源电路缩短了SCLH 信号的上升时间,任何时侯在Hs 模式,只有一个主机的电流源有效; 

  2、在多主机系统的Hs 模式中,不执行仲裁和时钟同步,以加速位处理能力。仲裁过程一般在前面用F/S 模式传输主机码后结束; 

  3、Hs 模式主机器件以高电平和低电平是1:2 的比率产生一个串行时钟信号。解除了建立和保持时间的时序要求; 

  4、可以选择Hs 模式器件有内建的电桥。在Hs 模式传输中,Hs 模式器件的高速数据(SDAH)和高速串行时钟(SCLH )线通过这个电桥与F/S 模式器件的SDA 和SCL 线分隔开来。减轻了SDAH 和SCLH 线的电容负载,使上升和下降时间更快; 

  5、Hs 模式从机器件与F/S 从机器件的唯一差别是它们工作的速度。Hs 模式从机在SCLH 和SDAH输出有开漏输出的缓冲器。SCLH 管脚可选的下拉晶体管可以用于拉长SCLH 信号的低电平,但只允许在Hs 模式传输的响应位后进行; 

  6、Hs 模式器件的输出可以抑制毛刺,而且SDAH 和SCLH 输出有一个施密特触发器; 

  7、Hs 模式器件的输出缓冲器对SDAH 和SCLH 信号的下降沿有斜率控制功能。[1]

1/**********************************************************

** 函数名  :读一个字节数据

** 入口参数: 无

** 注意    :

** 说明    :

***********************************************************/

uchar I2cReadByte( void )

{

    uchar rbyte = 0;

    uchar i = 0;

for(i = 0; i < 8; i++ )

    {

        rbyte = rbyte << 1; //非常注意...此语句不放在循环体内最后.

        SDA = 1;   //SDA为输入

        SCL = 1;

        NOP_5;

        if( SDA == 1 )

            rbyte = rbyte | 0x01;

        SCL = 0;

    }

    return rbyte;

}

2从地址读数据

第249行为什么还要加一个I2Cstart()?

3为什么循环变量定义为uchar类型?

4写字节子程序

void I2c_Write_n( uchar DeviceAddress, uchar ByteAddress, uchar *Wdata, uchar n)

第273行,为什么不和读子程序(第250行)一样,将最后一位变成零呢?

5程序454行——456行,十位之后就加小数点,好像不对!!

6 uchar I2cReadDataFromAddr( uchar DeviceAddress, uint ByteAddress )

程序第下载本文

显示全文
专题