再上一篇:5.6.5 寄存器
上一篇:5.7 串行口
主页
下一篇:5.7.3 UART
再下一篇:5.7.4 高速红外通讯接口 FICP
文章列表

5.7.2 I2C 总线接口单元

嵌入式系统(修订本)——Intel XScale 结构与开发 陈章龙 著

一、简介

I2C 总线由Philips 公司创建,是一种采用双线方式的串行总线。双向的SDA 数据/地址 线用于输入/输出功能,双向的SCL 时钟线用于控制和采样I2C 总线。I2C 单元允许应用处理 机用作I2C 总线的主机和从器件。

I2C 单元允许应用处理机与I2C 外设和微控制器通讯以实现系统管理功能。I2C 总线只需 很少的硬件可实现可靠的数据传送。

I2C 单元是应用处理机内部总线上的一个设备。数据通过缓冲器的接口从 I2C 总线发送

和接收。
二、功能

I2C 总线使用SDA 线和SCL 线在接于它上面的器件之间传送信息。I2C 总线上的每 一个器件有一个唯一的地址,可用作主机或从机方式的发送器或接收器。

发送器把数据发至I2C 总线。接收器从I2C 总线上接收数据。主机启动传送,产生 时钟信号,修正数据传送。从机为由主机寻址的器件。

I2C 总线允许多主机,即一条总线上可有多于一个主机。在多于一个主机同时试图 控制总线时,采用仲裁方式以允许只有一个主机控制总线,且不破环数据。该仲裁方式 依赖于所有I2C 器件采用“线与”方式连接至I2C 总线。两个主机可同时驱动总线。如 一个主机在另一个主机驱动 SDA 为低时,试图驱动 SDA 为高,它仲裁失败。SCL 线 为使用“线与”方式连接至SCL 线的主机产生的时钟的同步组合。

I2C 总线采用开漏线与总线接口,它允许多个器件驱动总线,通讯关于仲裁、等待: 错误等事件的信息。例如当一个主机在数据传送时驱动时钟(SCL)线,它在时钟为高 时输入一位。在从机无法按主机要求的请求接收或驱动数据时,从机可在时钟为高时拉 低时钟线以插入等待周期。主机时钟只能由第一个主机时钟仲裁期间或一个低速从机使 时钟为低时改变。

I2C 传送可由应用处理机作为主机所启动,或作为从机来接受。两个均可产生对I2C

总线的读、写或读/写操作。

1.功能模块

I2C 单元接于外围总线。CPU 可使用中断处理I2C 总线的活动,也可使用查询方法。 I2C 单元包括与I2C 总线的双线接口、一个向/从应用处理机传送数据的8 位缓冲器、一 套控制和状态寄存器和一个并行/串行转换得移位寄存器。

在缓冲器满、缓冲器空、I2C 单元从地址符合、仲裁丢失或发生总线错时,I2C 单元 产生至应用处理机的中断。所有中断条件必须由软件清零。

在接收数据时8 位I2C 数据缓冲器寄存器(IDBR)接收连至I2C 总线的移位寄存器 的一字节数据。在发送时,接收应用处理机内部总线上的写入数据。I2C 控制寄存器

(ICR)和I2C 状态寄存器(ISR)用于控制I2C 单元的操作。

I2C 单元支持400kbit/s 高速方式操作和100kbit/s 的标准方式。

2.I2C 总线接口方式

I2C 单元可实现多种操作方式,见表5-26

表 5-26 I2C 操作方式

方式

描述

主机-发送

I2C 单元作为主机

用于写操作

I2C 单元发送数据 I2C 单元响应时钟 从机设备在从机接收方式

主机-接收

I2C 单元作为主机

用于读操作

I2C 单元接收数据

I2C 单元响应时钟

从机设备在从机发送方式

从机-发送

I2C 单元作为从机

用于主机读操作 I2C 单元发送数据 主机设备在主机接收方式

从机-接收(缺省)

I2C 单元作为从机

用于主机写操作 I2C 单元接收数据 主机设备在主机发送方式

在I2C 单元为空闲时,它缺省为从机接收方式。这允许它监视总线,接收对应于应 用处理机的从机地址。

在I2C 单元接收到与I2C 从机地址寄存器(ISAR)的七位地址相符的地址或全部地 址时,它们处于从机接收方式或切换至从机发送方式。读/写位(R/nW)决定它进入那 一种方式。R/nW 位是包含从机地址的字节的最低位。如 R/nW 为低,启动传送的主机 打算写数据,I2C 单元仍处于从机接收方式。如 R/nW 为高,主机打算读数据,I2C 单 元转换至从机发送方式。

3.启动和停止总线状态

I2C 总线标准定义START 条件用于传送的开始,STOP 条件用于停止传送。在SCL 为高时SDA 线发生从高至低的跳变为START 条件。在SCL 为低时,SDA 线发生从低 至高的跳变为STOP 条件。

I2C 单元使用ICR 的START 和STOP 位来启动另一个字节传送、启动I2C 总线START

条件,允许数据链(重复START)、启动I2C 总线的STOP 条件。

(1) START 条件

START 条件(ICR 的START=1,STOP=0)启动主机传送或重复START。在置 位START 位前,软件必须向IDBR 装入目标从机地址至I2C 总线。对写请求,I2C 总线仍处于主机发送方式;对读请求,进入主机接收方式。对重复 START,改变 读或写,改变目标从机地址。IDBR 包含新的目标从机地址和R/nW 位。重复START 允许主机不放弃总线向不同从机传送数据。

(2) 无START 或STOP 条件

无START 或STOP 条件(ICR 的START=0,STOP=0),用于I2C 发送多重数据 字节的主机发送方式。软件写入数据字节,I2C 单元置位ISR 的ITE 位、清零ICR 的TB 位。软件然后向IDBR 写入新的字节,置位ICR 的TB 位,以启动新的一个 字节传送。处理进程持续至软件置位ICR 的START 或STOP 位。在进行START、 STOP 或重复START 发送后,I2C 单元不自动清0 ICR 的START 和STOP 位。

在每一次字节传送后,包括 ICR 的 ACKNAK 位,I2C 单元保持 SCL 线为低以 插入等待状态,直至 ICR 的 TB 置位。这使 I2C 单元释放 SCL 线,允许进行下一 次信息传送。

(3) STOP 条件

STOP 条件(ICR 的 START=0,STOP=1),用于终止数据传送。在主机发送方 式,必须置位ICR 的STOP 和TB 值以启动最后一个字节传送。在主机接收方式, I2C 单元必须置位ICR 的ACKNAK、STOP 和TB 位以启动最后一次传送。在发送 后,软件必须清0 STOP 位。

三、I2C 总线操作

I2C 单元以字节位单元进行数据传送,并按以下顺序进行:

1) START

2) 7 位从机地址

3) R/nW 位

4) 应答脉冲

5) 8 位数据

6) ACK/NAK 脉冲

7) 重复步骤5 和6 至完成所需传送的全部字节

8) 重复START(返回步骤1)或STOP

1. 串行时钟(SCL)产生

在I2C 单元处于主机发送或主机接收方式,它产生I2C 时钟输出。SCL 时钟可通过

ICR 的FM 位置为100kbs 或400Kbs。

2. 数据读写过程

I2C 数据缓冲器(IDBR)和I2C 从机地址寄存器(ISAR)管理数据和从机寻址。IDBR 包含一个字节数据或7 位从机地址和R/NW 位。ISAR 包含应用处理机可程控从机 地址。I2C 单元在接受完一个字节和应答后,把接收数据放入IDBR。为发送数据, CPU 写入IDBR,在ICR 的TB 置位时,I2C 单元把信息传送至传行总线。

(1) 主机或从机发送方式的操作

1) 软件通过内部总线向IDBR 写入数据,这启动一次主机传送或在ISR

的ITE 置位后发送下一个数据字节。

2) 在ICR 的TB 置位时,I2C 单元从IDBR 发送数据。

3) 允许时,在一字节在I2C 总线上传送完且完成应答周期,将产生IDBR

发送完中断。

4) 在CPU 写入IDBR 和发送STOP 条件前,I2C 单元准备发送下一字节 时,I2C 单元插入等待状态,直至CPU 向IDBR 写入新的值和置位ICR 的TB 位。

(2) 主机或从机接收方式的操作

1)在产生 IDBR 接收满中断后,应用处理机从内部总线读出 IDBR

数据。

2)在完成应答周期后,I2C 单元从移位寄存器向IDBR 传送数据。

3)I2C 单元插入等待状态,直至读出IDBR。

4)在CPU 读出IDBR 后,I2C 单元写入ICR 的ACKNAK 和TB 位, 以允许下一字节传送的进行。

3. 从器件寻址方式

作为主器件,I2C 单元必须组织并发送第一个传送字节,它包含打算寻址的器 件地址和一个传送方向控制位(R/nW)。从机地址和R/nW 位均写入IDBR。

被寻址的从机收到第一字节后,发 ACK 应答。如传送为写,则 I2C 单元仍处 于主机发送方式,被寻址的从器件仍为从机接收方式。如传送为读,则I2C 单元在 收到 ACK 后转为主机接收方式,被寻址的从器件则转为从机发送方式。在收到 NAK 时,I2C 自动发出STOP 中止传送,并置位ISR 的BED 位。

在允许的I2C 单元处于空闲状态,它为从机接收方式,监视I2C 总线的START 信号。如发现START 脉冲,I2C 读出前7 位,把它与ISAR 或全局传呼地址(0X00) 进行比较,如符合 ISAR, I2C 单元读出第 8 位(R/nW)或转为从机发送方式

(R/nW=1)。

4. I2C 应答

对每一次 I2C 字节传送,必须有应答脉冲。发送器释放 SDA 线以允许接收者 发应答脉冲。

在主机发送发式,如被寻址的器件不能产生应答脉冲时,SDA 线仍为高

(NAK)。这使I2C 单元置位ISR 的BED 位,并在允许时产生相应的中断。I2C 单 元自动产生STOP 条件,中止传送。

在主机接收方式,I2C 单元可发送非应答(NAK)以使从机发送者停止发送数 据。ICR 的 ACKNAK 位控制驱动 I2C 总线的 ACK/NCK 位。这时 ISR 的 BED 并 不置位。在从串行总线上接收到每一个字节后,I2C 单元可自动发 ACK 脉冲。在 单元接收最后一个字节前,软件必须置位ICR 的ACKNAK 位。这时在最后一个字 节将发出NAK 脉冲,以指出已传送完最后一个字节。

在从机方式,I2C 单元自动应答它的从机地址。与 ICR 的 ACKNAK 位无关。 在从机接收方式,每一字节后自动发出ACK 响应,与ICR 的ACKNAK 位无关。 在从机发送方式,I2C 单元可从主机收到已发送完最后字节的 NAK。主机然后发 STOP 或重复START。在收到STOP 或重复START 前,ISR 的UB 位仍保持置位。

5. 仲裁

I2C 总线的多主机能力需要 I2C 总线仲裁。在两个或更多主机在一个最小的保 持时间同时产生START 条件时进行仲裁。

如地址和R/nW 位相同,仲裁机构认为是正常数据。由于I2C 总线为“线与” 方式,多主机发送相同数据,不会影响数据。在发生不同时,发出高电平的主机失 去仲裁,并关闭它的数据驱动器,并置位ISR 的ACD 位,返回从机接收方式。

6. 全局传送地址

在主机发出的寻址地址为0X00 时,为全局传呼地址。在从器件需要从全局传 呼地址接收数据时,它应答该传送,并仍处于从机接收方式。否则它不理睬全局传 呼地址,不发送 ACK。全局传呼地址后的一个字节定义全局传呼标准,它的最低 位称为 B,B 一般等于 0。如该字节为 0X06,复位从机,并把该值写入地址的可 编程部分;如为0X04,则不复位,仅把该值写入地址的可编程部分。

I2C 单元支持 I2C 总线的发送和接收全局传送地址。软件从 I2C 单元发全局传 呼地址时,它必须置位ICR 的GCD 位。

在 I2C 单元为从机并在 ICR 的 GCD 为 0 时,收到全局传呼命令,它置位 ISR

的GCAD 和SAD 位,允许可产生中断。
四、寄存器

I2C 单元有五个寄存器,且表5-27。

表5-27 I2C 寄存器

寄存器地址

名称

章节

0x4030 1680

IBMR

第9.9.1 节, “I2C 总线监视寄存器 IBMR”

0x4030 1688

IDBR

第9.9.2 节, “I2C 数据缓冲寄存器- IDBR”

0x4030 1690

ICR

第9.9.3 节, “I2C 控制寄存器- ICR”

0x4030 1698

ISR

第9.9.4 节, “I2C 状态寄存器”

0x4030 16A0

ISAR

第9.9.5 节, “I2C 从机地址寄存器- ISAR”

1. I2C 总线监视寄存器 IBMR

它仅有两位,只能读出,反映SCL 和SDA 线的状态。 位31~2:保留。
位1:SCLS——SCL 状态,反映SCL 脚的状态。 位0:SDAS——SDA 状态,反映SDA 脚的状态。

2. I2C 数据缓冲寄存器 IDBR

IDBR 仅有8 位(位7~0),可读/写。复位后为全0。应用处理机使用它来向I2C 总 线发送和接收数据。在一个字节接收和应答完,IDBR 接收来自 I2C 单元的输入数据。 应用处理机写入IDBR 的数据传至I2C 单元发送到串行总线上。

在发送方式,在启动一次主机传送时或产生 IDBR 发送完中断时,应用处理机向 IDBR 写入数据。在 TB 置位时,数据从 IDBR 传送至移位寄存器,并产生 IDBR 发送 完中断。如 I2C 总线准备发送下一字节时,应用处理机没写入 IDBR,或没发出 STOP 条件,I2C 单元插入等待状态,直至应用处理机写入IDBR 并置位TB 位。

在接收方式,在产生IDBR 接收满中断时,应用处理机从IDBR 读出数据。在ACK 周期完成时,数据从移位寄存器传送至 IDBR。在读出 IDBR 前,I2C 单元插入等待周 期。在应用处理机读出 IDBR 后,应写入 ACKNAK 和 TB 位以允许下一次 I2C 数据的 传送。

3. I2C 控制寄存器 ICR


位31~16:保留。
位15:FM——快速方式

0=100KB/S 操作

1=400KB/S 操作

位14:UR——单位复位。

0=无复位

1=仅复位I2C 单元

位13:SADIE——从机地址检测中断允许

0=禁止中断

1=允许I2C 单元在检测到从机地址符合或全局传呼地址时产生中断 位12:ALDIE——仲裁丢失检测中断允许

0=禁止中断

1=允许I2C 单元在检测到发生仲裁丢失时产生中断

位11:SSDIE——从机STOP 检测中断允许

0=禁止中断

1=允许在从机方式检测到STOP 条件时产生中断 位10:BEIE——总线错误中断允许

0=禁止中断

1=允许在发生总线出错时产生中断 位9:IRFIE——IDBR 接收满中断允许

0=禁止中断

1=允许在IDBR 从I2C 总线接收到一个数据字节时产生中断。 位8:ITEIE——IDBR 发送完中断允许

0=禁止中断

1=允许在发送已字节至I2C 总线时产生中断 位7:GCD——全局传呼禁止

0=允许I2C 单元响应全局传呼信息

1=禁止I2C 单元响应全局传呼信息 位6:IUE——I2C 单元允许

0=禁止I2C 单元

1=允许I2C 单元(缺省为从机接收方式) 位5:SCLE——SCC 允许

0=禁止I2C 单元驱动SCL 线

1=允许主机操作时输出I2C 时钟 位4:MA——主机终止

0=主机方式I2C 单元仅使用ICR 的STOP 位发送STOP

1=主机方式I2C 单元在数据无传送时发送STOP

位3:TB——发送字节。用于在I2C 总线上发送/接收一个字节

0=在发送或接收完一个字节时由I2C 清0

1=发送/接收一个字节 应用处理机可监视该位以决定何时字节传送完成。在每字节传送完,I2C 单元保持 SCL 线为低(插入等待状态)直至TB 位置位。

位 2:ACKNAK——ACK/NAK 控制。决定在主机接收方式时 I2C 单元的 ACK 脉冲类 型。

0=I2C 单元在接受一个数据字节后发出ACK 脉冲

1= I2C 单元在接受一个数据字节后发出NAK 脉冲 在响应从机地址或从机接收方式,I2C 自动发出ACK 脉冲,与ACKNAK 位无关。

位1:STOP——在主机方式的下一个I2C 总线数据传送后产生STOP 条件。在主机接收 方式,必须同时设置ACKNAK 位。

0=不发送STOP

1=发送STOP

位0:START——在主机方式,启动START 条件

0=不发送START

1=发送START

4. I2C 状态寄存器 ISR

ISR 包含I2C 单元的各种中断标志位。在I2C 总线的ACK 周期后更新ISR 的位9~5。


位31~11:保留
位10:BED——总线出错检测标志(写入1 清0)

0=无错误发生

1=I2C 单元检测到以下出错条件时置位BED: z 主机发送时,在发完一字节没检测到ACK z 从机接收时,I2C 单元产生NAK 脉冲

位9:SAD——从机地址检测标志(写入1 清0)

0=无从机地址检测

1=I2C 单元检测到7 位地址与全局传呼地址或ISAR 相符合时置位,在SADIE 置位 时可产生中断。

位8:GCAD——全局传呼地址检测标志。

0=没接收到全局传呼地址

1=I2C 单元接收到全局传呼地址

位7:IRF——IDBR 接收满(写入1 清0)

0=IDBR 没接收到新数据或I2C 单元位空闲

1=IDBR 从I2C 总线上收到新数据。在IRFIE 置位时可产生中断 位6:ITE——IDBR 发送完(写入1 清0)

0=正在发送数据字节

1=I2C 单元已完成一次数据字节发送。在IFEIE 置位时可产生中断。 位5:ALD——仲裁丢失检测标志(写入1 清0)。用于多主机操作

0=赢得仲裁或没发生仲裁

1=I2C 单元丢失仲裁

位4:SSD——从机STOP 检测标志(写入1 清0)

0=没检测到STOP

1=I2C 在从机方式检测到STOP

位3:IBB——I2C 从线忙

0=I2C 总线空闲或I2C 单元在使用总线

1=在I2C 单元没使用总线时I2C 总线为忙 位2:UB——单元忙

0=I2C 单元不忙

1=I2C 单元忙

位1:ACKNAK——ACK/NAK 状态

0=I2C 单元在接收到或向总线发送ACK

1=I2C 单元接收到或向总线发送NAK

位0:RWM——读/写方式,它为从机方式地址的R/nW 位。

0=I2C 单元在主机发送或从机接收方式

1=I2C 单元在主机接收或从机发送方式 在STOP 状态后,由硬件自动清0。

5. I2C 从机地址寄存器 ISAR

ISAR 存放 I2C 单元的 7 位从机地址(位 6~0,位 31~7 位保留位)。应用处理机复 位不影响ISAR。它的缺省值(上电复位)为0x00。