背景

I2C(Inter-Integrated Circuit BUS) 集成电路总线,该总线由NXP(原PHILIPS)公司设计,多用于主控制器和从器件间的主从通信,在小数据量场合使用,传输距离短,任意时刻只能有一个主机等特性。

经常IIC和SPI接口被认为指定是一种硬件设备,但其实这样的说法是不尽准确的,严格的说他们都是人们所定义的软硬结合体,分为物理层(四线结构)和协议层(主机,从机,时钟极性,时钟相位)。

IIC,SPI的区别不仅在与物理层,IIC比SPI有着一套更为复杂的协议层定义。下面来分别说明一下IIC的物理层和协议层。

基本的I2C总线规范于20年前发布,其数据传输速率最高为100Kbits/s,采用7位寻址。但是由于数据传输速率和应用功能的迅速增加,I2C总线也增强为快速模式(400Kbits/s)和10位寻址以满足更高速度和更大寻址空间的需求。

I2C总线始终和先进技术保持同步,但仍然保持其向下兼容性。并且最近还增加了高速模式,其速度可达3.4Mbits/s。它使得I2C总线能够支持现有以及将来的高速串行传输应用,例如EEPROM和Flash存储

在现代电子系统中,有为数众多的IC需要进行相互之间以及与外界的通信。为了提供硬件的效率和简化电路的设计,PHILIPS开发了一种用于内部IC控制的简单的双向两线串行总线I2C。I2C总线支持任何一种IC制造工艺,并且PHILIPS和其他厂商提供了种类非常丰富的I2C兼容芯片。作为一个专利的控制总线,I2C已经成为世界性的工业标准。

每个器件都有一个唯一的地址,而且可以是单接收的器件(例如:LCD驱动器)或者可以接收也可以发送的器件(例如:存储器)。发送器或接收器可以在主模式或从模式下操作,这取决于芯片是否必须启动数据的传输还是仅仅被寻址。

I2C是一个多主总线,即它可以由多个连接的器件控制。

I2C特点

IIC是半双工,而不是全双工

  • IIC是真正的多主机总线,(对比SPI在每次通信前都需要把主机定死,而IIC可以在通讯过程中,改变主机),如果两个或更多的主机同时请求总线,可以通过冲突检测和仲裁防止总线数据被破坏

  • 起始和终止信号都是由主机发出的,连接到I2C总线上的器件,若具有I2C总线的硬件接口,则很容易检测到起始和终止信号

  • 在起始信号后必须发送一个7位从机地址+1位方向位,用“0”表示主机发送数据,“1”表示主机接收数据。

  • 每当主机向从机发送完一个字节的数据,主机总是需要等待从机给出一个应答信号,以确认从机是否成功接收到了数据

  • 起始信号是必需的,结束信号和应答信号,都可以不要

注:实际使用中,一般是单片机作为主机,其它器件作为从机,单片机先向器件发送信息表示要读取数据,之后转变传输方向,器件发送数据到单片机。

IIC的物理层

a.只要求两条总线线路,一条是串行数据线SDA,一条是串行时钟线SCL。(IIC是半双工,而不是全双工)。

b.每个连接到总线的器件都可以通过唯一的地址和其它器件通信,主机/从机角色和地址可配置,主机可以作为主机发送器和主机接收器。

c.IIC是真正的多主机总线,(而这个SPI在每次通信前都需要把主机定死,而IIC可以在通讯过程中,改变主机),如果两个或更多的主机同时请求总线,可以通过冲突检测和仲裁防止总线数据被破坏。

d.传输速率在标准模式下可以达到100kb/s,快速模式下可以达到400kb/s。

e.连接到总线的IC数量只是受到总线的最大负载电容400pf限制。

一个典型的IIC接口如下图所示
在这里插入图片描述
在这里插入图片描述

IIC的协议层

IIC的协议层才是掌握IIC的关键。现在简单概括如下:

a.数据的有效性

在时钟的高电平周期内,SDA线上的数据必须保持稳定,数据线仅可以在时钟SCL为低电平时改变。
在这里插入图片描述

b.起始和结束条件

起始条件:当SCL为高电平的时候,SDA线上由高到低的跳变被定义为起始条件,结束条件:当SCL为高电平的时候,SDA线上由低到高的跳变被定义为停止条件,要注意起始和终止信号都是由主机发出的,连接到I2C总线上的器件,若具有I2C总线的硬件接口,则很容易检测到起始和终止信号。总线在起始条件之后,视为忙状态,在停止条件之后被视为空闲状态,对起始条件和结束条件的描述如下图所示。
在这里插入图片描述

d.数据帧格式

I2C总线上传送的数据信号是广义的,既包括地址信号,又包括真正的数据信号。

在起始信号后必须传送一个从机的地址(7位),第8位是数据的传送方向位(R/T),用“0”表示主机发送数据(T),“1”表示主机接收数据(R)。

这里小编在驱动MPU6050模块的时候,就犯过这样的错误,它写的MPU6050从机地址是0x68,
因为发送从机地址的时候,要加一位读写方向位,因为刚开始应该是向这个MPU6050里写从机里某个寄存器的地址,
所以应该是7位地址   0x68(1101000)+二进制位0=11010000)也就是0xD0,表示要向该IIC设备里写东西,
然后再紧接着写入IIC设备里的寄存器地址,而我直接写入了0x68,导致出错

每次数据传送总是由主机产生的终止信号结束

但是,若主机希望继续占用总线进行新的数据传送,则可以不产生终止信号,马上再次发出起始信号对另一从机进行寻址。

在总线的一次数据传输过程中,可以有以下几种组合方式:

[1] 主机向从机发送数据,数据传送方向在整个传送过程中不变:
在这里插入图片描述
注:有阴影部分表示数据由主机向从机传送,无阴影部分则表示 数据由从机向主机传送。
A 表示应答(低电平), A 非表示非应答(高电平)。 S 表示起始信号, P 表示终止信号。

[2]主机在第一个字节后,立即从从机读数据:
在这里插入图片描述

[3]在传送过程中,当需要改变传送方向时,起始信号和从机地址都被重复产生一次,但两次读/写方向位正好反相:
在这里插入图片描述

地址格式(重点!!!)

第一个字节(为slave address)由7位地址和一位R/W读写位组成的,这字节是个器件地址。

首先:常用IIC接口通用器件的器件地址是由种类型号,及寻址码组成的,共7位

细心的朋友可以发现虽然是7位,但是好多地方实际都是8位,这是因为对于IIC总线来说,确实只有7位表示地址,一个字节是8位,所以预留出来最低位作为读写(R / W)的控制操作

也就是对于地址就是D7-D1,但是发送时要加上D0位,也就是8位

如格式如下:

D7 D6 D5 D4 D3 D2 D1 (D0)
0  0  0  0  0  0  0  (0 )
  1. 器件类型由:D7-D4 共4位决定的。这是由半导公司生产时就已固定此类型的了,也就是说这4位已是固定的。
  2. 用户自定义地址码:D3-D1共3位。这是由用户自己设置的,通常的作法如EEPROM这些器件是由外部IC的3个引脚所组合电平决定的(用常用的名字如A0,A1,A2)。这也就是寻址码。
    所以为什么同一IIC总线上同一型号的IC只能最多共挂8片同种类芯片的原因了。
  3. 最低一位D0就是R/W位。这一位是来说明操作是读还是写的,不是器件的地址位!一定要注意

实战寻址

对于I2C的简单介绍就到这里了,要使用I2C第一步就是我们如何才能知道器件的地址,这里就需要看数据手册来查找

E2PROM

首先介绍一个最常用的I2C器件,就是E2PROM存储器芯片,这里选择一个具体的型号24LC256

对于一个器件,第一步先去找芯片的数据手册,手册里不仅写了使用说明,还有PCB的封装格式

为了方便,先去立创商城查看有没有芯片的供应
在这里插入图片描述
点击数据手册,可以看到原理图还有PCB
在这里插入图片描述
PCB的封装可以直接导出
在这里插入图片描述
然后就是点击数据手册查看,通过目录就可以看到地址的部分
在这里插入图片描述
这里就找到了控制器的默认部分的地址1010

在这里插入图片描述
通过在电路上配置A2-A0,也就是I2C的后三位全部拉低,即1010 000 = 50h

所以24LC256的I2C地址就是50h

注意

如果要对其进行写的操作,不能直接向地址50h来进行写入,必须要在最低位加上一个二进制0,代表写操作,也就是变成了 1010 000 0 = A0,所以实际操作过程I2C传输的头字节应该是A0,.而不是单纯的50h!

CH455G地址

CH455G芯片是一款键盘扫描芯片
在这里插入图片描述
查看数据手册发现没有向之前的EEPROM有单独的地址章节介绍,而是一个实例
在这里插入图片描述
结合我们之前说到的I2C方向的问题,器件的地址应该是 0100100 = 24h

注意

跟EEPROM的操作一样,实例是一个写入的操作,所以 0100100 + 0 = 0100100 0 = 48h

Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐