协议类接口 - I2C

一、12c总线概述

I2C( Inter-Integrated Circuit,又称IIC)总线是一种串行总线,用 于连接微控制器及其外围设备,硬件图非常简单只有两条总线线路:一条串行数据线(SDA),一条串行时钟线(SCL )。

 它具有如下特点:

1)每个连接到总线的器件都可以使用软件根据它的惟一的地址来识别(具体地址需要查阅具体的I2C设备)。

2)传输数据的设备间是简单的主/从关系。

3)主机可以用作主机发送器(主机指的是发送/停止数据传输、提供时钟信号的器件;发送器指发送数据到总线的器件)或主机接收器(主机指被主机寻址的器件;接收器指从总线接收数据的器件)。

4)它是一个真正的多主机总线(多主机指可以由多个主机试图去控制总线,但是不会破坏数据),两个或多个主机同时发起数据传输时,可以通过冲突检测和仲裁来防止数据被破坏。

下是一条I2C总线上多个设备相连的例子:

扫描二维码关注公众号,回复: 5716371 查看本文章

二、12c总结的信号类型
I2C总统在传送数据过程中共有3种类型信号:开始信号、结束信号和响应信号。
1)开始信号(S):SCL为高电平时,SDA由高电平向低电平跳变,开始传送数据(数据按二进制传输,先传最高位)当对方检测到后就知道要开始传输数据了。
2)结束信号(P):SCL为高电平时,SDA由低电平向高电平跳变,结束传送数据。

3)响应信号(ACK):主机把设备发给从机后怎么知道对方是否收到了呢?接收器在接收到8位数据后,在第9个时钟周期(这个时间刚接收到1位),拉低SDA电平,这时主机就能检测到相应引脚变化了。响应信号由主机来检测

开始信号和结束信号的波形图如下:

应答信号电平波形图如下:

SDA上传输的数据必须在SCL为高电平期间保持稳定,因为外接设备要在SCL为高电平期间内采集数据,才能知道数据是低电平还是高电平;SDA上的数据只能在SCL为低电平期间变化,如下图所示便为I2C总线的位传输波形。

 三、I2C总线的数据传输格式

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

启动一个传输时,主机先发出S信号,然后发出8位数据。这8位数据中前7位为从机的地址(由此可见最多可接128个设备,从机地址需要看具体I2C设备的数据手册),第8位表示传输的方向(0表示写操作,1表示读操作)。被选中的从机发出响应信号。紧接着传输一系列字节(不同的I2C设备格式是不同的,需要查具体数据手册)及其响应位(将SDA拉低)。最后,主机发出P信号结束本次传输。

下图是几种I2c总线上数据传输的格式:

并非每传输8位数据之后,都会有ACK信号,有以下3种例外。

1 )当从机不能响应从机地址时(例如它正忙于其他事而无法响应I2c总线的操作,或 这个地址没有对应的从机),在第9个SCL周期内SDA线没有被拉低,即没有ACK信号。 这时,主机发出一个P信号终止传输或者重新发出一个S信号开始新的传输。

2)如果从机接收器在传输过程中不能接收更多的数据时,它也不会发出ACK信号。这样, 主机就可以意识到这点,从而发出一个P信号终止传输或者重新发出一个S信号开始新的传输。

3)主机接收器在接收到最后一个字节后,也不会发出ACK信号。于是,从机发送器释放SDA线,以允许主机发出P信号结束传输。

 

四、I2C控制器

只需要操作I2C控制器相应寄存器就可以完成上述过程。

猜你喜欢

转载自www.cnblogs.com/zhangshuaifeng/p/10628501.html