《嵌入式linux应用程序开发完全手册》I2C总线接口学习笔记

时间:2023-02-12 18:47:18

 

I2C总线接口

一.   12C总线协议(来源于百度知道)

 I2C(InterIntegrated Circuit)总线是一种由PHILIPS公司开发的两线式串行总线,用于连接微控制器及其外围设备。I2C总线产生于在80年代,最初为音频和视频设备开发,如今主要在服务器管理中使用,其中包括单个组件状态的通信。例如管理员可对各个组件进行查询,以管理系统的配置或掌握组件的功能状态,如电源和系统风扇。可随时监控内存、硬盘、网络、系统温度等多个参数,增加了系统的安全性,方便了管理。

  1 I2C总线特点

  I2C总线最主要的优点是其简单性和有效性。由于接口直接在组件之上,因此I2C总线占用的空间非常小,减少了电路板的空间和芯片管脚的数量,降低了互联成本。总线的长度可高达25英尺,并且能够以10Kbps的最大传输速率支持40个组件。I2C总线的另一个优点是,它支持多主控(multimastering) 其中任何能够进行发送和接收的设备都可以成为主总线。一个主控能够控制信号的传输和时钟频率。当然,在任何时间点上只能有一个主控。

  2 I2C总线工作原理

  2.1 总线的构成及信号类型

  I2C总线是由数据线SDA和时钟SCL构成的串行总线,可发送和接收数据。在CPU与被控IC之间、ICIC之间进行双向传送,最高传送速率100kbps。各种被控制电路均并联在这条总线上,但就像电话机一样只有拨通各自的号码才能工作,所以每个电路和模块都有唯一的地址,在信息的传输过程中,I2C总线上并接的每一模块电路既是主控器(或被控器),又是发送器(或接收器),这取决于它所要完成的功能。CPU发出的控制信号分为地址码和控制量两部分,地址码用来选址,即接通需要控制的电路,确定控制的种类;控制量决定该调整的类别(如对比度、亮度等)及需要调整的量。这样,各控制电路虽然挂在同一条总线上,却彼此独立,互不相关。

  I2C总线在传送数据过程*有三种类型信号, 它们分别是:开始信号、结束信号和应答信号。

  开始信号:SCL为高电平时,SDA由高电平向低电平跳变,开始传送数据。

  结束信号:SCL为高电平时,SDA由低电平向高电平跳变,结束传送数据。

  应答信号:接收数据的IC在接收到8bit数据后,向发送数据的IC发出特定的低电平脉冲,表示已收到数据。CPU向受控单元发出一个信号后,等待受控单元发出一个应答信号,CPU接收到应答信号后,根据实际情况作出是否继续传递信号的判断。若未收到应答信号,由判断为受控单元出现故障。

  目前有很多半导体集成电路上都集成了I2C接口。带有I2C接口的单片机有:CYGNAL C8051F0XX系列,PHILIPSP87LPC7XX系列,MICROCHIPPIC16C6XX系列等。很多外围器件如存储器、监控芯片等也提供I2C接口。

  3 总线基本操作

  I2C规程运用主/从双向通讯。器件发送数据到总线上,则定义为发送器,器件接收数据则定义为接收器。主器件和从器件都可以工作于接收和发送状态。 总线必须由主器件(通常为微控制器)控制,主器件产生串行时钟(SCL)控制总线的传输方向,并产生起始和停止条件。SDA线上的数据状态仅在SCL为低电平的期间才能改变,SCL为高电平的期间,SDA状态的改变被用来表示起始和停止条件。

  3.1 控制字节

  在起始条件之后,必须是器件的控制字节,其中高四位为器件类型识别符(不同的芯片类型有不同的定义,EEPROM一般应为1010),接着三位为片选,最后一位为读写位,当为1时为读操作,为0时为写操作。

  3.2 写操作

  写操作分为字节写和页面写两种操作,对于页面写根据芯片的一次装载的字节不同有所不同。

  3.3 读操作

  读操作有三种基本操作:当前地址读、随机读和顺序读。图4给出的是顺序读的时序图。应当注意的是:最后一个读操作的第9个时钟周期不是不关心。为了结束读操作,主机必须在第9个周期间发出停止条件或者在第9个时钟周期内保持SDA为高电平、然后发出停止条件。

  在I2C总线的应用中应注意的事项总结为以下几点 :

  1 严格按照时序图的要求进行操作,

  2 若与口线上带内部上拉电阻的单片机接口连接,可以不外加上拉电阻。

  3 程序中为配合相应的传输速率,在对口线操作的指令后可用NOP指令加一定的延时。

  4 为了减少意外的干扰信号将EEPROM内的数据改写可用外部写保护引脚(如果有),或者在EEPROM内部没有用的空间写入标志字,每次上电时或复位时做一次检测,判断EEPROM是否被意外改写。

  添加:I2C 总线

  在现代电子系统中,有为数众多的IC 需要进行相互之间以及与外界的通信。为了提供

  硬件的效率和简化电路的设计,PHILIPS 开发了一种用于内部IC 控制的简单的双向两线串

  行总线I2C(inter IC 总线)I2C 总线支持任何一种IC 制造工艺,并且PHILIPS 和其他厂商

  提供了种类非常丰富的I2C 兼容芯片。作为一个专利的控制总线,I2C 已经成为世界性的工

  业标准。

  每个I2C 器件都有一个唯一的地址,而且可以是单接收的器件(例如:LCD 驱动

  器)或者可以接收也可以发送的器件(例如:存储器)。发送器或接收器可以在主模式

  或从模式下操作,这取决于芯片是否必须启动数据的传输还是仅仅被寻址。I2C 是一个

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

  早期的I2C 总线数据传输速率最高为100Kbits/s,采用7 位寻址。但是由于数据传

  输速率和应用功能的迅速增加,I2C 总线也增强为快速模式(400Kbits/s)和10 位寻址

  以满足更高速度和更大寻址空间的需求。

  I2C 总线始终和先进技术保持同步,但仍然保持其向下兼容性。并且最近还增加了

  高速模式,其速度可达3.4Mbits/s。它使得I2C 总线能够支持现有以及将来的高速串行

  传输应用,例如EEPROM Flash 存储器。

 

二.    I2C接口操作

1.       I2C总线术语

发送器:发送数据到总线的器件

接收器:从总线接收数据的器件

主机:发起/停止数据传输,提供时钟信号的器件。

从机:被主机寻址的器件。

多主机:可以有多个主机试图去控制总线,但是不会破坏数据。

仲裁:当多个主机试图控制总线时,通过仲裁可以使得只有一个主机获得总线控制权,并且它传输的信息不被破坏。

同步:多个器件同步时钟信号的过程。

 

2.       I2C总线信号类型

(1)       开始信号(S)SCL为高电平时,SDA由高电平向低电平跳变,开始传送数据。

(2)       结束信号 (p)SCL为高电平时,SDA由低电平向高电平跳变,结束传送数据。

(3)       响应信号(ACK)  :接收器在接收到8位数据后,在第9个时钟周期,拉低SDA电平。

SDA上传输的数据必须在SCL为高电平期间保持稳定,SDA上的数据只能在SCL为低电平时期间可以变化。

 

3.       I2C总线的数据传输格式与传输流程

发送到SDA上的每个字必须是8位的,每次传输可以发送的字节数量不受限制。每个字节后面必须跟一个响应位。首先传输的是数据的最高位(MSB)。如果从机要完成一些其它功能后才能继续接收或发送一个字节,从机则可以将SCL拉低,迫使主机进入等待状态,当完成操作后就可以释放SCL,数据传输继续,如果主机在传输数据期间,也需要完成一些其它操作,也可以拉低SCL以占住总线。

 启动一个传输后,主机先发出S信号,然后发出8位数据,这8位数据中前7位为从机地址,第8位表示传输的方向(0表示写,1表示读),被选中的从机发出响应信号后,紧接着传输一系列字节及响应位,最后主机发出P信号,结束本次传输。

4.       I2C传输过程中无ACK响应信号可能的情况

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

(2)        如果从机在传输过程中不能接收更多数据时,它也不会发出ACK信号,这样,主机在没有收到ACK时,主机就可以发P或者S信号。

(3)       主机接收器在接收最后一个字节后,也不会发ACK信号,所以在这种情况下,从机发送器就需要释放SDA线,以允许主机发P信号。

 

三.    S3C2440 I2C总线控制器

根据S3C2440Datasheet可得到I2C控制器的结构图,S3C2440提供4个寄存器来完成所有I2C操作,SDA线上的数据从IICDS寄存器发出,或者传入IICDS寄存器中;IICADD寄存器中保存S3C2440当作从机时的地址;IICCONIICSTAT两个寄存器用来控制或者标识各种状态,比如选择工作模式,发出S信号,P信号,决定是否发出ACK信号,检测是否收到ACK信号。

各个寄存器的详细使用方法请参考数据手册,这里就不累述了。

 

 

 

 

 

四.   S3C2440 I2C总线操作方法与流程

1.       启动或者恢复I2C传输有以下两种方法:

(1)      IICCON[4]即中断状态标志位为0时,通过写IICSTAT寄存器启动I2C操作,有两种情况:

A.在主机模式,令IICSTAT[54]等于0b11,将发出S信号和IICDS寄存器的数据(寻址),令IICSTAT[54]等于0b01将发出P信号。

B.在从机模式,令IICSTAT[4]等于1将等待其它主机发出S信号及地址信息。

(2)       IICCON[4]即中断状态标志位为1时,表示I2C被暂停,在这期间,设置好其它寄存器后,向IICCON[4]写入0即可恢复I2C操作。所谓“设置其它寄存器”有以下几种情况:

A.      对于主机模式,可以按照上面的方法写IICSTAT寄存器,恢复I2C操作后即可发出S信号和IICDS寄存器的值,或者发出P信号。

B.      对于发送器,可以将下一个要发送的数据写入到IICDS寄存器中,恢复I2C操作后即可发出这个数据

C.      对于接收器,可以从IICDS寄存器中读取接收到的数据,最后响IICCON[4]写入0(清中断)的同时,设置IICCON[7]以决定在接收下一个数据后是否发出ACK信号。

2.       通过中断服务程序来驱动I2C传输

(1)       当仲裁失败时发生中断,即是本次传输没有抢到总线 ,则需要稍候继续。

(2)       对于主机模式,当发出S信号,地址信息并经过一个SCL周期(对应ACK信号)后,发生中断,主机可在此时判断是否成功寻址到从机。

(3)       对于从机模式,当接收到的址与IICADD寄存器相吻合时,发生出ACK信号,然后发生中断,从机可在此时准备后面的传输。

(4)       对于发送器,当发送完一个数据并经过珍上SCL周期(对应ACK信号)后,发生中断,这时可以准备下一个将要发送的数据,或者发出P信号以停止传输。

(5)       对于接收器,当接收到一个数据时,先根据IICCON[7]以决定是否发出ACK信号,然后发生中断。这里可以读取IICDS寄存器得到数据,并设置IICCON[7]以决定接收到下一个数据后是否发出ACK

对于以上的几中工作模式,数据手册中都有操作流程图,现以主机发送器为例说明一下它的工作流程。

 《嵌入式linux应用程序开发完全手册》I2C总线接口学习笔记

1)配置主机发送器各类参数,设置GPE14,GPE15引脚用于SCL,SDA,设置IICCON寄存器选择I2C发送时钟,最后,设置IICSTAT[4]1,这样,后面才能写IICDS寄存器。

Note:初始化时,IICCON[4]0,不能将IICSTAT设置为主机模式,否则就会立刻发送S信号,发送IICDS寄存器的值

2)将要寻址的从机地址写入到IICDS寄存器。

3)将0XF011110000)写入到IICSTAT寄存器,即设为主机发送器,全能串行输出功能,发出S信号。

4)发出S信号后,步骤2中设置的IICDS寄存器的值也将会被发出去,它用来寻址从机。

5)在响应周期后,发生中断,此时IICCON[4]1I2C传输暂停。

6)如果没有数据要发送,则跳到步骤10准备结束传输,否则就执行步骤7继续传输。

7)将下一个要发送的数据写入到IICDS寄存器中。

8)往IICCON[4]中写入0,恢复I2C传输。

9)这时IICDS寄存器中的值将被一位一位的发送出去,当8位数据发送完毕,再经过另一个SCL周期(对应ACK信号)后,中断再次发生,跳到步骤5.

10)将0xD0写入IISTAT寄存器,即:设为主机发送器,全能串行输出功能,发出P信号。

11)清除IICCON[]P信号得以发出。

12)等待一段时间,使得P信号完全发出。

 

五.   I2C总线操作实例

选择M41t11或者 LM75等常见I2C芯片作为I2C从机,这里选择M41T11,从机地址为0XD0M41T11中有8个寄存器,分别对应秒,分,时,天(星期几),日,月,年,控制寄存器,其中数据都以BCD格式保存,读写M41t11的步骤:

1.       主机向M41t11发出要操作的寄存器地址(0~7)

2.       要设置M41t11时,主机连续发出数据,要读取M41t11时,主机连续读取数据。

实例将可以设置时间,也可以读取时间,用于验证I2C主机发送,接收等操作方法。

1.       S3C2440 IC2控制器初始化

2.       I2C主机发送函数

3.       I2C主机接收函数 

4.       I2C中断服务程序 

5.       M41t11的特性相关操作----设置时间函数 

6.       M41t11的特性相关操作----读取时间函数 

7.        实例的连接脚本