总线网站:https://www.i2c-bus.org/

官方协议文档:https://www.i2c-bus.org/specification/

转自:

1,I2C总线之(一)---概述     https://www.cnblogs.com/BitArt/archive/2013/05/27/3101037.html

2,I2C总线之(二)---时序   https://www.cnblogs.com/BitArt/archive/2013/05/28/3103917.html

3,  I2C总线之(三)---以C语言理解IIC  https://www.cnblogs.com/BitArt/archive/2013/06/01/3112042.html

  1. 概述:

    I²C 是Inter-Integrated Circuit的缩写,发音为"eye-squared cee" or "eye-two-cee" , 它是一种两线接口。

    I²C 只是用两条双向的线,一条 Serial Data Line (SDA) ,另一条Serial Clock (SCL)。

    SCL:上升沿将数据输入到每个EEPROM器件中;下降沿驱动EEPROM器件输出数据。(边沿触发)

    SDA:双向数据线,为OD门,与其它任意数量的OD与OC门成"线与"关系。

  2. 输出级

    每一个I2C总线器件内部的SDA、SCL引脚电路结构都是一样的,引脚的输出驱动与输入缓冲连在一起。其中输出为漏极开路的场效应管,输入缓冲为一只高输入阻抗的同相器,这种电路具有两个特点:

    1)由于SDA、SCL为漏极开路结构(OD),因此它们必须接有上拉电阻,阻值的大小常为 1k8, 4k7 and 10k ,但1k8 时性能最好;当总线空闲时,两根线均为高电平。连到总线上的任一器件输出的低电平,都将使总线的信号变低,即各器件的SDA及SCL都是线"与"关系。

    2)引脚在输出信号的同时还将引脚上的电平进行检测,检测是否与刚才输出一致,为"时钟同步"和"总线仲裁"提供了硬件基础。

  3. 主设备与从设备

    系统中的所有外围器件都具有一个7位的"从器件专用地址码",其中高4位为器件类型,由生产厂家制定,低3位为器件引脚定义地址,由使用者定义。主控器件通过地址码建立多机通信的机制,因此I2C总线省去了外围器件的片选线,这样无论总线上挂接多少个器件,其系统仍然为简约的二线结构。终端挂载在总线上,有主端和从端之分,主端必须是带有CPU的逻辑模块,在同一总线上同一时刻使能有一个主端,可以有多个从端,从端的数量受地址空间和总线的最大电容 400pF的限制。  

    • 主端主要用来驱动SCL line;
    • 从设备对主设备产生响应;

    二者都可以传输数据,但是从设备不能发起传输,且传输是受到主设备控制的。

  4.速率:

  普通模式:100kHz;

  快速模式:400kHz;

  高速模式:3.4MHz;

  没有任何必要使用高速SCL,将SCL保持在100k或以下,然后忘了它吧。

I2C总线之(二)---时序

一、协议 1.空闲状态 I2C总线总线的SDA和SCL两条信号线同时处于高电平时,规定为总线的空闲状态。此时各个器件的输出级场效应管均处在截止状态,即释放总线,由两条信号线各自的上拉电阻把电平拉高。 2.起始位与停止位的定义: 
  • 起始信号:当SCL为高期间,SDA由高到低的跳变;启动信号是一种电平跳变时序信号,而不是一个电平信号。
  • 停止信号:当SCL为高期间,SDA由低到高的跳变;停止信号也是一种电平跳变时序信号,而不是一个电平信号。

3.ACK

  发送器每发送一个字节,就在时钟脉冲9期间释放数据线,由接收器反馈一个应答信号。 应答信号为低电平时,规定为有效应答位(ACK简称应答位),表示接收器已经成功地接收了该字节;应答信号为高电平时,规定为非应答位(NACK),一般表示接收器接收该字节没有成功。 对于反馈有效应答位ACK的要求是,接收器在第9个时钟脉冲之前的低电平期间将SDA线拉低,并且确保在该时钟的高电平期间为稳定的低电平。 如果接收器是主控器,则在它收到最后一个字节后,发送一个NACK信号,以通知被控发送器结束数据发送,并释放SDA线,以便主控接收器发送一个停止信号P。

   如下图逻辑分析仪的采样结果:释放总线后,如果没有应答信号,sda应该一直持续为高电平,但是如图中蓝色虚线部分所示,它被拉低为低电平,证明收到了应答信号。这里面给我们的两个信息是:1)接收器在SCL的上升沿到来之前的低电平期间拉低SDA;2)应答信号一直保持到SCL的下降沿结束;正如前文红色标识所指出的那样。
4.数据的有效性: 
I2C总线进行数据传送时,时钟信号为高电平期间,数据线上的数据必须保持稳定,只有在时钟线上的信号为低电平期间,数据线上的高电平或低电平状态才允许变化。 我的理解:虽然只要求在高电平期间保持稳定,但是要有一个提前量,也就是数据在SCL的上升沿到来之前就需准备好,因为在前面I2C总线之(一)---概述一文中已经指出,数据是在SCL的上升沿打入到器件(EEPROM)中的。

   

5.数据的传送:

  在I2C总线上传送的每一位数据都有一个时钟脉冲相对应(或同步控制),即在SCL串行时钟的配合下,在SDA上逐位地串行传送每一位数据。数据位的传输是边沿触发。

二、工作过程

  总线上的所有通信都是由主控器引发的。在一次通信中,主控器与被控器总是在扮演着两种不同的角色。

1.主设备向从设备发送数据

  主设备发送起始位,这会通知总线上的所有设备传输开始了,接下来主机发送设备地址,与这一地址匹配的slave将继续这一传输过程,而其它slave将会忽略接下来的传输并等待下一次传输的开始。主设备寻址到从设备后,发送它所要读取或写入的从设备的内部寄存器地址; 之后,发送数据。数据发送完毕后,发送停止位:

写入过程如下:

  发送起始位

  • 发送从设备的地址和读/写选择位;释放总线,等到EEPROM拉低总线进行应答;如果EEPROM接收成功,则进行应答;若没有握手成功或者发送的数据错误时EEPROM不产生应答,此时要求重发或者终止。
  • 发送想要写入的内部寄存器地址;EEPROM对其发出应答;
  • 发送数据
  • 发送停止位.
  • EEPROM收到停止信号后,进入到一个内部的写入周期,大概需要10ms,此间任何操作都不会被EEPROM响应;(因此以这种方式的两次写入之间要插入一个延时,否则会导致失败,博主曾在这里小坑了一下)

  详细:

  需要说明的是:①主控器通过发送地址码与对应的被控器建立了通信关系,而挂接在总线上的其它被控器虽然同时也收到了地址码,但因为与其自身的地址不相符合,因此提前退出与主控器的通信;

2.主控器读取数据的过程:

  读的过程比较复杂,在从slave读出数据前,你必须先要告诉它哪个内部寄存器是你想要读取的,因此必须先对其进行写入(dummy write):

  • 发送起始位;
  • 发送slave地址+write bit set;
  • 发送内部寄存器地址;
  • 重新发送起始位,即restart;
  • 重新发送slave地址+read bit set;
  • 读取数据
    主机接收器在接收到最后一个字节后,也不会发出ACK信号。于是,从机发送器释放SDA线,以允许主机发出P信号结束传输。 
  • 发送停止位   
详细: 

I2C总线之(三)---以C语言理解IIC

为了加深对I2C总线的理解,用C语言模拟IIC总线,边看源代码边读波形:

如下图所示的写操作的时序图:

读时序的理解同理。对于时序不理解的朋友请参考“I2C总线之(二)---时序”

完整的程序如下:

#include<reg51.h>
#define uchar unsigned char
#define uint unsigned int
#define write_ADD 0xa0
#define read_ADD 0xa1
uchar a;
sbit SDA=P2^0;
sbit SCL=P2^1;
void SomeNop();     //短延时
void init();    //初始化
void check_ACK(void);
void I2CStart(void);
void I2cStop(void);
void write_byte(uchar dat);//写字节
void delay(uint z);
uchar read_byte();     //读字节
void write(uchar addr,uchar dat);  //指定地址写
uchar read(uchar addr);       //指定地址读
bit flag;  //应答标志位
void main()
{init();write_add(5,0xaa); //向地址5写入0xaadelay(10);      //延时,否则被坑呀!!!P1=read_add(5);      //读取地址5的值while(1);
}//***************************************************************************
void delay()//简单延时函数
{ ;; }
//***************************************************************************
void start()  //开始信号 SCL在高电平期间,SDA一个下降沿则表示启动信号
{     sda=1; //释放SDA总线  delay();  scl=1;  delay();  sda=0;  delay();
}
//***************************************************************************
void stop()   //停止 SCL在高电平期间,SDA一个上升沿则表示停止信号
{  sda=0;  delay();  scl=1;  delay();  sda=1;  delay();
}
//***************************************************************************
void respons()  //应答 SCL在高电平期间,SDA被从设备拉为低电平表示应答
{  uchar i;  scl=1;  delay(); //至多等待250个CPU时钟周期 while((sda==1)&&(i<250))i++;  scl=0;  delay();
}
//***************************************************************************
void init()//总线初始化 将总线都拉高一释放总线  发送启动信号前,要先初始化总线。即总有检测到总线空闲才开始发送启动信号
{  sda=1;  delay();  scl=1;  delay();
}
//***************************************************************************
void write_byte(uchar date) //写一个字节
{  uchar i,temp;  temp=date;  for(i=0;i<8;i++)  {  temp=temp<<1;  scl=0;//拉低SCL,因为只有在时钟信号为低电平期间按数据线上的高低电平状态才允许变化;并在此时和上一个循环的scl=1一起形成一个上升沿  delay();  sda=CY;  delay();  scl=1;//拉高SCL,此时SDA上的数据稳定  delay();  }  scl=0;//拉低SCL,为下次数据传输做好准备  delay();  sda=1;//释放SDA总线,接下来由从设备控制,比如从设备接收完数据后,在SCL为高时,拉低SDA作为应答信号  delay();
}
//***************************************************************************
uchar read_byte()//读一个字节
{  uchar i,k;  scl=0;  delay();  sda=1;  delay();  for(i=0;i<8;i++)  {  scl=1;//上升沿时,IIC设备将数据放在sda线上,并在高电平期间数据已经稳定,可以接收啦  delay();      k=(k<<1)|sda;  scl=0;//拉低SCL,使发送端可以把数据放在SDA上  delay();      }  return k;
}
//***************************************************************************
void write_add(uchar address,uchar date)//任意地址写一个字节
{  start();//启动  write_byte(0xa0);//发送从设备地址  respons();//等待从设备的响应  write_byte(address);//发出芯片内地址  respons();//等待从设备的响应  write_byte(date);//发送数据  respons();//等待从设备的响应  stop();//停止
}
//***************************************************************************
uchar read_add(uchar address)//读取一个字节
{  uchar date;  start();//启动  write_byte(0xa0);//发送发送从设备地址 写操作  respons();//等待从设备的响应  write_byte(address);//发送芯片内地址  respons();//等待从设备的响应  start();//启动  write_byte(0xa1);//发送发送从设备地址 读操作  respons();//等待从设备的响应  date=read_byte();//获取数据  stop();//停止  return date;//返回数据
}

参考:https://blog.csdn.net/XieWinter/article/details/91903678

以下转自:

https://blog.csdn.net/XieWinter/article/details/91903678

1. 引言

I2C总线是事实上的世界标准,现在由超过50家公司制造的1000多种不同的IC实现。此外,多功能I2C总线用于各种控制架构,如系统管理总线(SMBus),电源管理总线(PMBus),智能平台管理接口(IPMI),显示数据通道(DDC)和高级电信计算架构(ATCA))。

在消费者电子电讯和工业电子中看上去不相关的设计里经常有很多相似的地方例如几乎每个系统都包括:

为了使这些相似之处对系统设计者和器件厂商都得益而且使硬件效益最大电路最简单Philips (现NXP)开发了一个简单的双向两线总线实现有效的IC 之间控制这个总线就称为Inter IC 或I2C 总线。所有符合I2C总线的器件组合了一个片上接口使器件之间直接通过I2C 总线通讯。

I2C总线是由飞利浦在80年代早期设计开发的,允许在同一电路板上的组件之间轻松通信,一种简单、双向二线制同步串行总线。它只需要两根线即可在连接于总线上的器件之间传送信息。飞利浦半导体于2006年迁移至恩智浦。

主器件用于启动总线传送数据,并产生时钟以开放传送的器件,此时任何被寻址的器件均被认为是从器件.在总线上主和从、发和收的关系不是恒定的,而取决于此时数据传送方向。如果主机要发送数据给从器件,则主机首先寻址从器件,然后主动发送数据至从器件,最后由主机终止数据传送;如果主机要接收从器件的数据,首先由主器件寻址从器件.然后主机接收从器件发送的数据,最后由主机终止接收过程。在这种情况下.主机负责产生定时时钟和终止数据传送。

总线网站:https://www.i2c-bus.org/

官方协议文档:https://www.i2c-bus.org/specification/

CSDN文档地址:https://download.csdn.net/download/xiewinter/11243770

2. 特征

只要求两条总线线路:一条串行数据线(serial data line ,SDA),一条串行时钟线(serial clock line , SCL)
    每个连接到总线的器件都可以通过唯一的地址和始终存在的简单的主/从机关系进行软件寻址; 主机可以作为主机发送器或主机接收器
    它是真正的多主总线,包括冲突检测和仲裁,以防止两个或多个主设备同时启动数据传输时数据损坏。
    串行,8位,双向数据传输在标准模式下最高可达100 kbit / s,在快速模式下最高可达400 kbit / s,在快速+模式下最高可达1 Mbit / s, 或高速模式下高达3.4 Mbit / s。
    串行,8位,单向数据传输在超快速模式下高达5 Mbit / s
    片上的滤波器,可以滤去总线数据线上的毛刺波保证数据完整
    可以连接到同一总线的IC数量仅受最大总线电容的限制。 在某些条件下可能允许更大的电容。详见官方参考手册。

3. 规范

I2C 总线是一个多主机的总线这就是说可以连接多于一个能控制总线的器件到总线。如果两个或多个主机尝试发送信息到总线在其他主机都产生0 的情况下首先产生一个1 的主机将丢失仲裁。仲裁时的时钟信号是用线与连接到SCL 线的主机产生的时钟的同步组合。

在I2C总线上生成时钟信号始终是主设备的责任; 在总线上传输数据时,每个主机都会生成自己的时钟信号。 来自主设备的总线时钟信号只有在被慢速从设备按下时钟线或由仲裁发生时由另一个主设备拉伸时才能被改变。

3.1 SDA 和 SCL 信号

SDA和SCL都是双向线路,通过电流源或上拉电阻连接到正电源电压(见图3)。 当总线空闲时,两条线都是HIGH。 连接到总线的器件的输出级必须具有漏极开路或开路集电极,以执行线与功能。 I2C总线上的数据可以在标准模式下以高达100 kbit / s的速率传输,在快速模式下最高可达400 kbit / s,在快速+模式下最高可达1 Mbit / s或以上 在高速模式下为3.4 Mbit / s。 总线电容限制了连接到总线的接口数量。

对于单个主应用,如果总线上没有可以延长时钟的器件,则主机的SCL输出可以是推挽式驱动器设计。

3.2 SDA 和 SCL 逻辑电平

由于可以连接到I2C总线的各种不同技术设备(CMOS,NMOS,双极),逻辑“0”(低)和“1”(高)的电平不固定,取决于 相关的VDD电平。 输入参考电平设置为VDD的30%和70%; VIL为0.3VDD,VIH为0.7VDD。 请参见图38,时序图。 一些传统器件输入电平固定为VIL = 1.5 V和VIH = 3.0 V,但所有新器件都需要30%/ 70%的规格。

3.3 数据的有效性

SDA 线上的数据必须在时钟的高电平周期保持稳定数据线的高或低电平状态只有在SCL 线的时钟信号是低电平时才能改变。为传输的每个数据位生成一个时钟脉冲。

3.4 START and STOP 条件

所有的传输都是所有事务都以START(S)开始,并由STOP(P)终止(见图5)。

SCL 线是高电平时,SDA 线从高电平向低电平切换,表示起始条件。

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

起始和停止条件一般由主机产生总线在起始条件后被认为处于忙的状态在停止条件的某段时间后总线被认为再次处于空闲状态。

如果产生重复起始Sr 条件而不产生停止条件总线会一直处于忙的状态此时的起始条件S和重复起始Sr 条件在功能上是一样的,因此在本文档的剩余部分符号S 将作为一个通用的术语既表示起始条件又表示重复起始条件除非有特别声明的Sr。

如果连接到总线的设备包含必要的接口硬件,则可以轻松检测START和STOP条件。 但是,没有这种接口的微控制器必须在每个时钟周期至少两次采样SDA线来检测是否发生电平转换。
3.5 字节格式

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

3.6 Acknowledge (ACK) and Not Acknowledge (NACK)

响应发生在每个字节之后。 应答位允许接收器向发送器发信号通知该字节已成功接收,并且可以发送另一个字节。 主机产生所有时钟脉冲,包括应答第9个时钟脉冲。

ACK 信号:在响应的时钟脉冲期间,接收器必须将SDA 线拉低,使它在这个时钟脉冲的高电平期间保持稳定的低电平(见图4) 。当然必须考虑建立和保持时间。

NACK信号:当在第9个时钟脉冲期间SDA保持高电平时,这被定义为非应答信号。主设备可以生成STOP条件以中止传输,或者生成重复的START条件以开始新的传输。 导致生成NACK的条件有五个:

1.总线上没有带有发送地址的接收器,因此没有设备响应确认。
    2.接收器无法接收或发送,因为它正在执行某些实时功能,并且尚未准备好开始与主站通信。
    3.在传输过程中,接收器获取它不理解的数据或命令。
    4.在传输过程中,接收器无法再接收数据字节。
    5.主接收器必须发信号通知从发送器的传输结束。

3.7 时钟同步

两个主设备可以同时开始在空闲总线上进行传输,并且必须有一种方法来决定哪个控制总线并完成其传输。 这是通过时钟同步和仲裁完成的。 在单主系统中,不需要时钟同步和仲裁。

时钟同步通过线与连接I2C 接口到SCL 线来执行。这就是说SCL 线的高到低切换会使器件开始数它们的低电平周期,而且一旦器件的时钟变低电平,它会使SCL线保持这种状态直到到达时钟的高电平。但是,如果另一个时钟仍处于低电平周期,这个时钟的低到高切换不会改变SCL线的状态。因此,SCL线被有最长低电平周期的器件保持低电平,此时,低电平周期短的器件会进入高电平的等待状态。

当所有有关的器件数完了它们的低电平周期后,时钟线被释放并变成高电平。之后器件时钟和SCL线的状态没有差别。而且所有器件会开始数它们的高电平周期。首先完成高电平周期的器件会再次将SCL线拉低。

这样,产生的同步SCL时钟的低电平周期由低电平时钟周期最长的器件决定,而高电平周期由高电平时钟周期最短的器件决定。
3.8 仲裁

仲裁与同步一样,只有在系统中使用多个主设备时才需要协议的一部分。主机只能在总线空闲的时侯启动传输。两个或多个主机可能在起始条件的最小持续时间(tHD;STA)内产生一个起始条件,结果在总线上产生一个规定的起始条件。

当SCL 线是高电平时,仲裁在SDA 线发生;这样,在其他主机发送低电平时,发送高电平的主机将断开它的数据输出级,因为总线上的电平与它自己的电平不相同。

仲裁是逐位进行的,在每个位期间,当SCL为高电平时,每个主器件都会检查SDA电平是否与它发送的电平相匹配。 此过程可能需要很多位。 只要传输完全相同,两个主设备实际上可以无错误地完成整个事务。 主设备第一次尝试发送HIGH,但检测到SDA电平为低电平,主机知道它已经丢失仲裁并关闭其SDA输出驱动器。

因为,I2C 总线的地址和数据信息由赢得仲裁的主机决定,在仲裁过程中不会丢失信息。丢失仲裁的主机,可以产生时钟脉冲直到丢失仲裁的该字节末尾。

如果主机也结合了从机功能,而且在寻址阶段丢失仲裁,它很可能就是赢得仲裁的主机在寻址的器件。因此,丢失仲裁的主机必须立即切换到它的从机模式。

由于I2C总线的控制仅取决于竞争主机发送的地址和数据,因此没有中央主机,也没有总线上的任何优先级顺序。

如果在一个主设备发送重复START或STOP条件而另一个主设备仍在发送数据时仲裁过程仍在进行中,则存在未定义的条件。 换句话说,仲裁在不能下面情况之间进行:

•重复起始条件和数据位:主设备1发送重复的START条件,主设备2发送数据位。

•停止条件和数据位:主设备1发送STOP条件,主设备2发送数据位。

•重复起始条件和停止条件:主站1发送重复的START条件,主站2发送STOP条件。
3.9 Clock stretching

时钟延长通过将SCL线保持为低电平来暂停事务。 在该行再次释放HIGH之前,该事务不能继续。 时钟延长是可选的,事实上,大多数从设备不包括SCL驱动程序,因此它们无法延长时钟。

在字节级,设备可能能够以快速速率接收数据字节,但需要更多时间来存储接收到的字节或准备另一个要传输的字节。 然后,从器件可以在接收和确认一个字节后将SCL线保持为低电平,以强制主器件进入等待状态,直到从器件准备好在一种握手过程中进行下一个字节传输。

在位级,诸如具有或不具有用于I2C总线的有限硬件的微控制器的设备可以通过延长每个时钟LOW周期来减慢总线时钟。 任何主站的速度都适合该设备的内部运行速率。
3.9 从机地址和R/W位

数据传输遵循图9中所示的格式。在START条件(S)之后,发送从地址。 该地址长7位,后跟第8位,即数据方向位(R / W) - “0”表示传输(WRITE),“1”表示数据请求(READ)(参见图)10)。数据传输总是由主机产生的STOP条件(P)终止。 但是,如果主设备仍希望在总线上进行通信,则它可以生成重复的START条件(Sr)并在不首先生成STOP条件的情况下寻址另一个从设备。在这种传输中,可以进行不同读/写格式的各种组合。

可能的数据传输格式是:

主发送器发送到从接收器。 传输方向没有改变(见图11)。 从接收器确认每个字节。
    主机在第一个字节后立即读取从机(参见图12)。 在第一次确认时,主发送器变为主接收器,从接收器变为从发送器。 第一次确认仍由从机生成。 主设备生成后续确认。 STOP条件由主机产生,它在STOP条件之前发送一个非应答(A)。
    组合格式(见图13)。 在传输改变方向时候,START条件和从地址都重复,但R / W位反转。 如果主接收器发送重复START条件,它会在重复START条件之前发送一个非应答(A)

注意:

复合格式可以用于例如控制一个串行存储器。在第一个数据字节期间,要写内部存储器的位置,在重复起始条件和从机地址后,数据可被传输。
    自动增加或减少之前访问的存储器位置等所有决定都由器件的设计者决定
    每个字节都跟着一个响应位,在序列中用A 或A 模块表示
    兼容I2C 总线的器件在接收到起始或重复起始条件时必须复位它们的总线逻辑,甚至在这些起始条件没有根据正确的格式放置,它们也都期望发送从机地址。
    起始条件后面立即跟着一个停止条件报文为空是一个不合法的格式
    连接到总线的每个设备都可以通过唯一的地址寻址。 通常存在简单的主/从关系,但是可以具有多个可以同时接收和响应的相同从属,例如在组广播中。

3.10 10位地址

10位寻址扩展了可能的地址数量。 具有7位和10位地址的器件可以连接到同一个I2C总线,7位和10位寻址都可以用于所有总线速度模式。 目前,10位寻址没有被广泛使用。

10位从地址由START条件(S)或重复START条件(Sr)之后的前两个字节构成。

第一个字节的前七位是组合1111 0XX,其中最后两位(XX)是10位地址的两个最高有效位(MSB); 第一个字节的第八位是决定消息方向的R / W位。

尽管保留地址位1111XXX有八种可能的组合,但只有四种组合1111 0XX用于10位寻址。 其余四种组合1111 1XX保留用于未来的I2C总线增强。

之前针对7位寻址描述的读/写格式的所有组合都可以通过10位寻址实现。 这里有两个详细说明:

主机发送器传输10位从地址发送到从接收器。
    主接收器使用10位从地址读取从发送器。


3.11 保留地址

3.12 广播呼叫地址

广播呼叫地址是用来寻址连接到I2C 总线上的每个器件。但是,如果器件在广播呼叫结构中不需要任何数据,它可以通过不发出响应来忽略这个地址。如果器件要求从广播呼叫地址得到数据,它会响应这个地址并作为从机接收器运转。第二个和接下来的字节会被能处理这些数据的每个从机接收器响应。广播呼叫地址的含意通常在第二个字节说明(图16)

这里要考虑两种情况

• 当最低位B 是0

• 当最低位B 是1

当位B 是0 时,第二个字节的定义如下

0000 0110 (06h): 通过硬件写入和复位从机地址的可编程部分。接收到这个两字节序列时所有打算响应这个广播呼叫地址的器件将复位并接受它们地址的可编程部分。要采取预防措施确保器件不会在加上电源电压后将SDA 或SCL 线拉低因为这些低电平会阻塞总线。
    0000 0100 (04h): 通过硬件写从机地址的可编程部分。所有通过硬件定义地址可编程部分和响应广播呼叫地址的器件会在接收这两个字节序列时锁存可编程的部分。器件不会复位。
    0000 0000 (00h): 这个代码不允许在第二个字节使用

3.13 软件复位

在广播呼叫(0000 0000)之后,发送0000 0110(06h)作为第二个字节会导致软件复位。 此功能是可选的,并非所有设备都响应此命令。 在接收到这个2字节序列时,所有设计用于响应广播呼叫地址的设备都会复位并接收其地址的可编程部分。 必须采取预防措施以确保器件在施加电源电压后不会下拉SDA或SCL线路,因为这些低电平会阻塞总线。
3.14 起始字节

微控制器可以通过两种方式连接到I2C总线。 具有片上硬件I2C总线接口的微控制器可以编程为仅被来自总线的请求中断。 当设备没有这样的接口时,它必须通过软件持续监控总线。 显然,微控制器监控或轮询总线的次数越多,执行其预期功能所花费的时间就越少。

因此,快速硬件设备和依赖软件轮询的相对较慢的微控制器之间存在速度差异。

在这种情况下,数据传输之前可以有一个比正常情况长得多的启动程序(参见图19)。 启动程序包括:

• A START condition (S)

• A START byte (0000 0001)

• An acknowledge clock pulse (ACK)

• A repeated START condition (Sr).

在要求总线访问的主机发送起始条件S 后,发送起始字节(00000001), 因此另一个微控制器可以采样以低采样速率采样SDA 线,直到在启动字节检测到7 个0 。在SDA 线检测到这个低电平后,微控制器切换到一个更高的采样速率寻找用于同步的重复起始条件Sr。

接收到重复起始条件Sr 后硬件接收器会复位,从而忽略了起始字节。
3.15 总线清除

在极少数情况下,时钟(SCL)被置为低电平,如果您的I2C器件具有硬件复位输入,则优先过程是使用HW复位信号复位总线。 如果I2C器件没有硬件复位输入,则重启器件电源以激活强制内部上电复位(POR)电路。

如果数据线(SDA)保持低电平,主机应发送9个时钟脉冲。 保持总线为低电平的器件应该在这九个时钟内的某个时间释放它。 如果没有,则使用硬件复位或循环电源清除总线。
4. 超快速模式I2C总线协议


5. I2C总线通信协议的其他用途

I2C总线用作多个系统架构的通信协议。 除基本I2C规范外,这些体系结构还添加了命令集和特定于应用程序的扩展。 通常,由于协议和物理接口相同,因此可以在这些架构中的任何一个中使用简单的I2C总线设备,例如I / O扩展器。
5.1 CBUS 兼容性

CBUS接收器可以连接到标准模式I2C总线。 但是,必须连接称为DLEN的第三条总线,并省略应答位。 通常,I2C传输是8位字节的序列; 兼容CBUS设备具有不同的格式。

在混合总线结构中,I2C总线设备不得响应CBUS消息。 因此,保留了没有I2C总线兼容设备响应的特殊CBUS地址(0000 001X)。 在传输CBUS地址之后,可以激活DLEN线路并发送CBUS格式传输。 在STOP条件之后,所有设备都准备好接受数据。

主发送器可以在发送CBUS地址后发送CBUS格式。 传输以STOP条件结束,由所有设备识别。

备注:如果CBUS配置已知,并且未预见到与CBUS兼容设备的扩展,则允许设计人员根据所用设备的特定要求调整保持时间。

5.2 SMBus  - 系统管理总线

SMBus使用I2C硬件和I2C硬件寻址,但增加了用于构建特殊系统的二级软件。 特别是,其规范包括可以进行动态地址分配的地址解析协议。

硬件和软件的动态重新配置允许总线设备“热插拔”并立即使用,无需重新启动系统。 设备会自动识别并分配唯一的地址。 这种优势导致即插即用的用户界面。 在这两种协议中,系统主机和系统中可以具有主设备或从设备的名称和功能的所有其他设备之间存在非常有用的区别。

SMBus现在在大多数PC中用作系统管理总线。 它由英特尔和其他公司于1995年开发,它修改了一些I2C电气和软件特性,以便与便携式设备快速降低的电源预算更好地兼容。 SMBus还具有“高功率”版本2.0,包括4 mA吸收电流,除非上拉电阻的大小符合I2C总线电平,否则不能由I2C芯片驱动。

未完待续。。。
6. 总线速度

最初,I2C总线限制为100 kbit / s操作。 随着时间的推移,规范已经增加了几个,因此现在有五种运行速度类别。 标准模式,快速模式(Fm),快速模式加(Fm +)和高速模式(Hs模式)设备向下兼容 - 任何设备都可以在降低总线速度。

超快速模式设备与以前的版本不兼容,因为总线是单向的。

双向总线:

- 标准模式(Sm),比特率高达100 kbit / s

- 快速模式(Fm),比特率高达400 kbit / s

- 快速模式加(Fm +),比特率高达1 Mbit / s

- 高速模式(Hs模式),比特率高达3.4 Mbit / s。

单向总线:

- 超快速模式(UFm),比特率高达5 Mbit / s

原文链接:https://blog.csdn.net/XieWinter/article/details/91903678

I2C 总线详解-转相关推荐

  1. Linux I2C总线详解

    概述: 1.I2C概念 2.I2C硬件结构图 3.I2C总线初始化 4.I2C控制器device 节点添加及driver注册 5.I2C设备节点添加及driver注册 5.adapter设备及驱动添加 ...

  2. AUTOSAR从入门到精通100讲(一)-SPI、UART、I2C总线详解

    当您将微控制器连接到传感器,显示器或其他模块时,您是否考虑过这两种设备是如何相互通信的?他们到底在说什么? 事实上电子设备之间的通信就像人类之间的交流,双方都需要说相同的语言.在电子产品中,这些语言称 ...

  3. SPI、I2C、UART(即串口)三种串行总线详解

    以下内容均来源于网络资源的学习与整理,如有侵权请告知删除. 参考博客 几个串口协议学习整理 UART IIC SPI_mainn的博客-CSDN博客 SPI.I2C.UART三种串行总线的原理.区别及 ...

  4. FPGA学习之路—接口(2)—I2C协议详解+Verilog源码分析

    FPGA学习之路--I2C协议详解+Verilog源码分析 定义 I2C Bus(Inter-Integrated Circuit Bus) 最早是由Philips半导体(现被NXP收购)开发的两线时 ...

  5. linux驱动之总线详解

    linux驱动 第一章 linux驱动之设备与驱动 第二章 linux驱动之设备树与GPIO子系统 linux驱动之总线详解 linux驱动 一.总线bus 1.bus在linux中文件结构 2.bu ...

  6. RS485通信总线详解

    RS485 总线详解 RS-485 是美国电子工业协会(EIA)在 1983 年批准了一个新的平衡传输标准(Balanced Transmission Standard)也称作差分,EIA 刚开始将 ...

  7. [I2C]I2C通信协议详解(一) --- 什么是I2C

    [I2C]I2C通信协议详解(一) --- 什么是I2C 摘要:内部集成电路()I2C(Inter-Integrated Circuit)总线是一种两线串行接口,最初由菲利普斯公司开发,用于消费产品. ...

  8. linux内核I2C子系统详解

    1.I2C通信协议 参考博客:<I2C通信协议详解和通信流程分析>:https://csdnimg.cn/release/blogv2/dist/pc/themesSkin/skin3-t ...

  9. AXI总线详解完结篇

    经过几个月的整理和发文,AXI总线详解系列正式迎来最终篇,内容基本涵盖了上一篇文章的全部内容. 所有文章的链接如下: 1. AXI总线详解 2.AXI总线详解-总线和接口以及协议 3.AXI协议中的通 ...

  10. CAN总线详解 整车的控制只需要一条线(怪不得那些汽车厂商的嵌入式岗位基本都是要求会CAN的)

    怪不得那些汽车厂商的嵌入式岗位基本都是要求会CAN的 转载自:https://mp.weixin.qq.com/s/qbN0-BtQ_q2GYEV7V_o5WA 干货分享:CAN总线详解 整车的控制只 ...

最新文章

  1. 时间序列、时间序列分析、时间序列效应分解、平稳时间序列、AIC和BIC
  2. “还完花呗,再也不用吃土!”是真的吗?(附代码)
  3. java 反射 慢在那里_Java 反射到底慢在哪?
  4. 浅谈分布式计算的开发与实现
  5. highcharts 动态生成x轴和折线图
  6. PHP加速 eAccelerator配置和使用指南
  7. 人列计算机 (节选自《三体》作者:刘慈欣)
  8. hscan扫描mysql代码_HScan 扫描器
  9. Unity通过压缩字体减小包体大小
  10. jquery图片懒加载函数
  11. 免费网站采集程序怎么规避百度飓风算法
  12. 【高数-2】多元函数最值
  13. 图卷积网络 GCN Graph Convolutional Network(谱域GCN)的理解和详细推导
  14. Java并发之魂——synchronized深度解析
  15. VS 制作自定义安装程序
  16. 福晟集团用创新理念引领发展新趋势
  17. 2015年校园招聘12家IT公司面试体验
  18. [Swift]LeetCode825. 适龄的朋友 | Friends Of Appropriate Ages
  19. 一文说清“链上”和“链下”
  20. pd快充线无法连接计算机,一种PD快充高清连接线的制作方法

热门文章

  1. 一张浓缩大学生活的顶级报(转载)
  2. java jdk 64 1.8_JDK1.8 64位官方下载
  3. 【VScode】优雅地将代码打印为 PDF
  4. java 将ofd转为pdf(代码简单)
  5. 音视频 H.264格式介绍
  6. java课程设计报告_JAVA课程设计报告_完整版.doc
  7. 【电力电子技术AC-DC】单相桥式晶闸管整流电路(阻性/阻感性负载)simulink仿真
  8. vb.net 教程 1-20 例
  9. Apollo进阶课程 ⑤ | Apollo硬件开发平台介绍
  10. 计算机模拟在材料加工研究中的应用,计算机在材料科学中的应用