AN-895: ADuC702x MicroConverter® I2C® 接口 (Rev. 0) PDF

AN-895
应用笔记
One Technology Way • P.O. Box 9106 • Norwood, MA 02062-9106, U.S.A. • Tel: 781.329.4700 • Fax: 781.461.3113 • www.analog.com
ADuC702x MicroConverter® I2C® 接口
作者 :Michael Looney
简介
本应用笔记介绍如何利用 ADI 公司的 ADuC702x 系列精密
微控制器实现 I2C(内部集成电路)接口的硬件主机和从机。
本笔记还包含示例代码,显示主机和从机如何利用 I2C 接
口相互通信(参见“串行 EEPROM 协议的实现”部分)。
• 一个 I2C 主机可以与多个从机通信。每个从机都有一个
唯一的 7 位地址,因此即使在多从机环境中也始终存在
一对一的主机 / 从机关系。
• 主机和从机的发送与接收速度可高达 400 kbps。
• 片内滤波可抑制 SDA 和 SCL 线上的 50 ns 以下尖峰,保
.
护数据完整性。
2
I C 接口的典型框图如图 1 所示。
I2C 总线的主要特性如下 :
• 只需要两条总线线路 :串行数据线 (SDA) 和串行时钟线
(SCL)。两条线路均为双向,即主机和从机均可以用作
发射器或接收器。
3.3V
ADuC702x
(MASTER)
PULL-UP
RESISTOR
SCL
SCL
SDA
SDA
SCL
SDA
ADuC702x
(SLAVE 1)
ADuC702x
(SLAVE 2)
Figure 1. Single Master Multislave2 I2C Block Diagram
图 1. 单主机、多从机 I C 框图
Rev. 0 | Page 1 of 16
06549-001
PULL-UP
RESISTOR
AN-895
目录
简介 ................................................................................................... 1
ADuC702x 系列微转换器的 I2C 实现 ........................................ 7
I2C 接口概述 .................................................................................... 3
I2C 寄存器定义 .............................................................................. 13
I2C 基本原理 .................................................................................... 3
串行 EEPROM 协议的实现 ........................................................ 16
串行 EEPROM 协议........................................................................ 6
Rev. 0 | Page 2 of 16
AN-895
I2C 接口概述
从机地址
I2C 是由 Philips 开发的一种双线串行通信系统,允许多个
主机和多个从机通过两条线(SCL 和 SDA)相连。在 I2C
接口中,至少有一个主机和一个从机。SCL 信号控制主机
与从机之间的数据传输。
发生起始条件之后,主机以最高有效位 (MSB) 优先方式在
SDA 线上发送一个字节,同时发送 8 个 SCL 脉冲。此字节
的前 7 位为 7 位从机地址。只有当此 7 位地址与从机的地
址(或四个从机地址中的一个)匹配时,从机才会响应主机。
第 8 位(最低有效位 LSB)为 R/W 状态位,决定消息的方向。
如果此位为 0,则主机对选定的从机写入数据。如果此位
为 1,则主机期待接收来自从机的数据。两种情况下主机
都会产生时钟。
SCL 信号始终是从主机传送到从机。不过,如果从机尚未
准备好开始下一次传输,则从机能够将此线拉低。这称为
时钟延展功能。每传输一个数据位,就必须产生一个时钟
脉冲。
SDA 信号用于发送或接收数据。SDA 输入在 SCL 高电平周
期中必须保持稳定。当 SCL 为高电平时,SDA 线的跃迁被
视为起始或停止条件(参见图 2 和图 3)。
I2C 基本原理
如果从机接收到正确的地址,即来自主机的 7 个 MSB 与
I2C0ADR 存储器映射寄存器 (MMR) 的 7 个 MSB 匹配,则
从机返回一个有效 ACK,将 SCL 线拉低,并设置 I2C0STA
中的标志位。
从机通过硬件自动完成 I2C 从机寻址的上述所有处理,而
主机则负责输出适当的从机地址。
起始条件
I2C 接口的典型数据传输序列从起始条件开始。起始条件是
指在 SCL 线为高电平时,SDA 线上发生的高电平至低电平
跃迁(见图 2)。起始条件的产生始终由主机负责。在 SCL
线的高电平周期中,SDA 线只应在发生起始(和停止)条
件时改变。在正常数据传输期间(包括从机寻址),SDA
线上的数据在 SCL 线的高电平周期中必须保持稳定。
SDA
应答 (ACK)/ 非应答 (NACK)
如果从机地址与主机发送的地址匹配,从机会自动发送一
个应答 (ACK) 信号,否则会发送一个非应答 (NACK) 信号。
ACK 指 SDA 线在第 9 个时钟脉冲时为低电平。NACK 指
SDA 线在第 9 个时钟脉冲时为高电平(见图 4)。
在数据传输期间,ACK 或 NACK 始终由接收器产生。然而,
ACK 所需的时钟脉冲始终由主机产生。在 ACK 时钟脉冲
期间,发射器必须释放 SDA 线(高电平)。为产生有效的
ACK,接收器必须将 SDA 线拉低。
对于 ADuC702x 微转换器,ACK 和 NACK 均通过硬件在各
字节接收结束时自动产生。
06549-002
SCL
START
2
Figure
Condition for I2C
图 2.2.IStart
C 的起始条件
如果主机从一个从机接收器接收到 NACK(从机不响应从
机地址或所传输的数据),主机应产生停止条件,中止传输
(参见“数据传输”部分)。
如果从机为发射器,则在从机发送完最后一个字节之后,
主机接收器应产生一个非应答 (NACK) 信号,向从机表明
数据序列已结束。从机一旦接收到 NACK,就会释放 SDA 线,
以便主机能够产生停止条件。
SDA
STOP
06549-022
SCL
2
Figure
Condition for I2C
图 3.3.IStop
C 的停止条件
Rev. 0 | Page 3 of 16
AN-895
数据传输
停止条件
在 I2C 中断服务程序 (ISR) 中,或者在轮询实现中,从机根
据主机发送的 R/W 位的状态决定是否发送或接收。然后,
从机在主机发送的每个时钟脉冲上发送或接收一位。主机
负责提供 9 个时钟脉冲(8 个用于数据,1 个用于 ACK),
以便从机与主机之间收发数据。从机每发送或接收一个有
效数据字节时,I2C 中断位就会置 1。
数据传输序列由停止条件终止。停止条件是指在 SCL 为高
电平时,SDA 线上发生的低电平至高电平跃迁(见图 3)。
停止条件始终由主机产生。主机一旦认为数据序列已结束,
或者接收到来自从机的 NACK,就会发送停止条件。接收
到停止条件后,从机复位到再次等待从机地址的状态。
ADuC702x 器件的 I2C 接口可以配置为在发生停止条件时
产生中断。通过 I2CxCFG MMR 的位 14 可以使能这一特性。
同 样 要 注 意, 在 从 机 为 发 射 器、 主 机 为 接 收 器 的 系 统
中,当从机发送完最后一个字节之后,主机接收器应发
送 NACK,向从机表明数据序列已结束。从机一旦接收到
NACK,就会释放 SDA 线,以便主机能够产生停止条件。
图 5 所示为典型的传输序列。
如果一个主机想要中止数据传输,或者中断总线上另一个
主机的数据传输,它可以先发送一个起始条件,再发送一
个停止条件。
SDA FLOATS (HIGH) FOR NACK
DATA OUTPUT BY
RECEIVER
MASTER CLOCK
RECEIVER PULLS SDA LOW FOR ACK
DATA
LSB
TRANSMITTER RELEASES SDA
7
9
8
CLOCK PULSE FOR ACKNOWLEDGE
06549-003
DATA OUTPUT BY
TRANSMITTER
Figure 4. Acknowledge
(ACK) and No (ACK)
Acknowledge
(NACK)
on the I2C Bus
和非应答
图 4. I 2C 总线上的应答
(NACK)
SDA
LSB
SLAVE ADDRESS
SCL
1
START
BIT
2
3 TO 6
MSB
LSB
DATA
R/W
7
8
9
ACK
BIT
5. 典型
C 传输序列
Figure 5.图
Typical
I2CI 2Transfer
Sequence
Rev. 0 | Page 4 of 16
1
2 TO 7
8
9
ACK
BIT
STOP
BIT
06549-004
MSB
AN-895
注意,ADuC702x 器件在主机模式下无法直接产生 I2C 重
复起始序列。
重复起始条件
重复起始条件是指向从机发送第二个起始条件,且第一个
和第二个起始条件之间没有发送停止条件。它允许主机通
过改变 R/W 位逆转传输方向,但不必放弃对总线的控制权。
如果用户拥有对整个 I2C 总线的完全控制权,则可以使用
一个变通办法,即在所需的第二个起始条件之前禁止产生
停止条件。具体步骤如下 :
图 6 所示为一个传输序列示例。当发送至器件的第一个数
据用于设置要读取的寄存器地址时,通常可以使用该传输
序列。
1. 在 SDA 线上放置一个阻值较低的上拉电阻。例如,让
SDA 通过一个 4.7 kΩ 电阻连接到 VCC,让 SCL 通过一
个 20 kΩ 电阻连接到 VCC。
当接收到(重复起始条件 + 从机地址)时,会产生一个中断。
使用 I2CxSSTA MMR 的状态位可以区分是(重复起始条件
+ 从机地址)时还是(起始条件 + 从机地址)。
2. 添加下列代码序列 :
I2C0CCNT = 0x0;
// Sets Start/Stop condition counter value to 0 - minimum value.
I2C0MTX = 0x7;
// Load the Tx FIFO
I2C0CNT = 0x1;
// Read 2 bytes from the slave
I2C0CCNT = 0x80;
// Set the Start/Stop counter to a nonzero value to re-enable the Stop
Condition
// Write sequence
while ((I2C0FSTA & 0x30) != 0x00) {}
I2C0ADR = 0xA1;
// Send out the Read condition
MSB
SDA
LSB
SLAVE ADDRESS
SCL
1
START
BIT
2
3 TO 6
// Wait for the Tx FIFO to empty
MSB
LSB
R/W
7
8
SLAVE ADDRESS
DATA
9
ACK
BIT
1
2 TO 7
LSB
MSB
8
1
9
ACK
BIT
2
START
BIT
2 2
Figure图
6. I6.
CIRepeated
Start Sequence
C 重复起始序列
Rev. 0 | Page 5 of 16
3 TO 6
MSB
LSB
R/W
7
8
DATA
9
ACK
BIT
1
2 TO 7
8
9
ACK STOP
BIT
BIT
06549-005
I2C0ADR = 0xA0;
AN-895
串行 EEPROM 协议
时钟延展
在 I C 通信中,主机决定时钟速度。与 RS232 不同,I C 总
线提供明确的时钟信号,因此主机和从机无需精确同步到
预定的波特率。
2
2
ATMEL AT24C 系列串行 EEPROM 支持下列五个命令 :
•
•
•
•
•
但在某些情况下,I2C 从机无法以主机给出的时钟速度工作,
需要放慢速度。这是通过一种称为“时钟延展”的机制来
实现的。
如果 I2C 从机需要降低总线速度,它可以限制时钟速度。
另一方面,主机在释放时钟线以使其回到高电平状态后,
需要回读时钟信号,直到时钟线确实已变为高电平。
随机写入
顺序写入
当前地址读取
随机读取
顺序读取
图 7 至图 11 说明了这五个命令。
DEVICE
ADDRESS
WORD ADDRESS
STOP
WRITE
START
时钟延展功能通过 I2CxCFG MMR 的位 11 使能。
DATA
06549-006
ACK
LSB
ACK
MSB
R/W
ACK
MSB
LSB
SDA LINE
WORD ADDRESS (n)
DATA (n)
DATA (n + 1)
STOP
DEVICE
ADDRESS
DATA (n + x)
ACK
ACK
ACK
ACK
MSB
R/W
ACK
MSB
LSB
SDA LINE
06549-007
WRITE
START
图 7.
随机写入Write
7. Random
Figure
NO ACK
R/W
DATA
ACK
MSB
LSB
SDA LINE
06549-008
DEVICE
ADDRESS
STOP
READ
START
图8.8.Sequential
顺序写入Write
Figure
DEVICE
ADDRESS
STOP
WORD ADDRESS (n)
READ
DEVICE
ADDRESS
START
WRITE
START
Figure
9. Current Read
图 9. 当前地址读取
06549-009
DUMMY WRITE
NO ACK
DATA (n)
ACK
LSB
MSB
ACK
LSB
MSB
R/W
ACK
MSB
LSB
SDA LINE
DATA (n)
DATA (n + 1)
图11.
顺序读取Read
11.Sequential
Figure
Rev. 0 | Page 6 of 16
DATA (n + 2)
DATA (n + x)
NO ACK
R/W
ACK
SDA LINE
06549-010
STOP
ACK
ACK
ACK
DEVICE
ADDRESS
READ
图 10.
随机读取Read
Figure
10. Random
AN-895
ADuC702x 系列微转换器的 I2C 实现
FIFO 的使用
ADuC702x 系列器件内置 2 个全硬件主机和从机 I2C 端口。
各端口最多支持 4 个地址,并具有可配置的中断,可实现
串行 EEPROM 命令。
每个 I2C 模块都有四个 2 字节 FIFO :
在基本层面上,I2C 硬件接口类似于标准 UART。它含有接
收和发送缓冲器,各缓冲器均包含 2 字节 FIFO。本应用
笔记将详细说明四类通信(主机 / 从机接收 / 发送)以及
FIFO 的使用。
•
•
•
•
主机接收
主机发送
从机接收
从机发送
以下部分介绍发送 FIFO 和接收 FIFO。
表 1. I2CxFSTA MMR 位功能描述
位号
描述
31 至 10
保留。
9
主机发送 FIFO 清空位。
置 1 ,清空主机发送 FIFO ;该位也可以清空从机接收 FIFO。
一旦主机发送 FIFO 被清空 ,则该位会自动清 0。
8
从机发送 FIFO 清空位。
置 1 ,清空从机发送 FIFO ;
当从机发送 FIFO 已经被清空 ,该位自动清 0。
7至6
5至4
3至2
1至0
主发送 FIFO 状态位。
00
FIFO 空
01
向 FIFO 写字节数据
10
FIFO 中有 1 字节数据
11
FIFO 满
主机发送 FIFO 状态位。
00
FIFO 空
01
向 FIFO 写字节数据
10
FIFO 中有 1 字节数据
11
FIFO 满
从机接收 FIFO 状态位。
00
FIFO 空
01
向 FIFO 写字节数据
10
FIFO 中有 1 字节数据
11
FIFO 满
从机接收 FIFO 状态位。
00
FIFO 空
01
向 FIFO 写字节数据
10
FIFO 中有 1 字节数据
11
FIFO 满
Rev. 0 | Page 7 of 16
AN-895
发送 FIFO
接收 FIFO
要发送数据,必须加载 I2C0STX/I2C0MTX 寄存器。写入
一个字节到发送寄存器相当于写入 FIFO 的字节 1(见图
12)。
接收数据时,数据到达字节 0。
• 如果字节 0 为空,字节 1 中的字节将被自动推入字节 0。
这可以通过状态机来说明(见图 13)。注意,I2C0FSTA
寄存器中的状态对用户是可见的。
• 如果字节 0 已满,该字节将留在字节 1 中。再次写入发
送寄存器将覆盖字节 1。
I2CFSTA 寄存器中的发送清空位置 1 将清空 FIFO。
• 如果字节 1 为空,字节 0 中的数据将自动移入字节 1。
• 如果字节 1 已满,该数据将留在字节 0 中,直到读取
I2C0SRX(相当于读取字节 1)。
• 如果在 FIFO 已满时有其它数据到达,从机将针对该数
据发送一个 NACK,并且 I2C0SSTA 的位 4 置 1。
当发生传输时,传输字节 0,字节 1 移入字节 0,FIFO 处
于状态 2。
OUT
BYTE 1
Figure
FIFO
图12.
发送 FIFO
12.Transmit
STATE 0
FIFO EMPTY
WRITE Tx
Tx FIFO
FLUSH
RECEIVE
TRANSMIT/
Tx FIFO
FLUSH
STATE 1
BYTE 0 FULL
READ Rx
AUTOMATIC
AUTOMATIC
STATE 2
BYTE 0 FULL
IN
Figure
FIFO
图14.
接收 FIFO
14.Receive
STATE 0
FIFO EMPTY
STATE 1
BYTE 1 FULL
BYTE 0
STATE 2
BYTE 1 FULL
TRANSMIT
STATE 3
FIFO FULL
RECEIVE
06549-011
WRITE Tx
READ Rx
STATE 3
FIFO FULL
06549-012
BYTE 0
06549-020
BYTE 1
Figure 15.
State
Machine
图Receive
状态机
15. 接收FIFO
FIFO
Figure 13.
Machine
图Transmit
状态机
13. 发送 FIFO
FIFOState
Rev. 0 | Page 8 of 16
06549-021
IC0SRX
I2C0STX
AN-895
主机发送
在发送字节前,必须首先将数据载入发送 FIFO。I2C0ADR
寄存器中必须指定从机的地址。对于数据写入,地址寄存
器中的写操作 (W) 位必须置 0。写入 I2C0ADR 寄存器会自
动产生一个起始条件。
每个发送字节的第一个时钟脉冲上会产生一个 I2C 中断。
I2C0MSTA 的位 2 和位 1 置 1,表示主机刚刚发送一个字节,
并且 FIFO 下溢。因此,用户可以向 FIFO 添加一个字节。
如果启动传输时 FIFO 中只有一个字节,则第一个 I2C 中断
发生在所发送地址的第一个时钟脉冲上。如果 FIFO 中有
两个字节,则中断发生在所发送的第一个字节的第一个时
钟脉冲上。
当 FIFO 为空时,传输结束。停止条件在发送完最后一个
字节后再过 5.1 μs 时自动产生。
图 16 的流程图显示了这种操作的一个简单示例。
//ENABLE I2C on GPIO P1.0 AND P1.1
GP1CON = 0x22;
VECTOR TO
INTERRUPT SERVICE ROUTINE
//SET UP I2C MASTER MODE, 100kHz
I2C0CFG = 0x82;
I2C0DIV = 0xCFCF;
//CHECK FOR TX INTERRUPT
if ((I2C0MSTA AND 0x4) == 0x4)
//SPECIFY INTERRUPT SERVICE ROUTINE
AND ENABLE MASTER I2C INTERRUPT
IRQ = MY_IRQ_FUNCTION;
IRQEN = 0x400;
MORE
DATA?
Y
//PLACE DATA IN TX FIFO
I2C0MTX = DATA;
N
//RETURN FROM ISR
06549-013
//PLACE FIRST TWO BYTES IN TX FIFO
I2C0MTX = 0x11;
I2C0MTX = 0x22;
//SET UP ADDRESS WITH W BIT SET TO 0
I2C0ADR = 0xA0;
Figure
Transmit Flowchart
图16.
主机发送流程图
16.Master
Rev. 0 | Page 9 of 16
AN-895
要从 FIFO 读取数据,应使用 I2C0RX 寄存器。I2C0SSTA
寄存器的位 3 表示从机已接收到数据。只有读取 I2C0SRX
才能使此位清零。清空 FIFO 并不能使位 3 清零。
从机接收
在 I2C 从机接收数据的过程中,当每个字节数据被置于接
收 FIFO 中时,即在接收到每个字节的第 9 个时钟脉冲之后,
就会产生一个中断。如果在接收第三个字节之前没有读取
发送完最后一个数据之后,主机自动发送一个停止条件。
FIFO,则该接口针对所发送的最后一个数据自动提供一个
NACK,并且 I2CSSTA 寄存器的位 4 置 1,表示接收 FIFO
溢出。
VECTOR TO
TO
VECTOR
INTERRUPT SERVICE
SERVICE ROUTINE
ROUTINE
INTERRUPT
//SET UP
UP I2C
I2C SLAVE
SLAVE MODE
MODE
//SET
I2C0CFG
I2C0CFG =
= 0x1;
0x1;
//CHECK FOR
FOR R
RX
INTERRUPT
//CHECK
X INTERRUPT
if
if ((I2C0SSTA
((I2C0SSTA AND
AND 0x08)
0x08) ==
== 0x08)
0x08)
//SPECIFY
//SPECIFY INTERRUPT
INTERRUPT SERVICE
SERVICE ROUTINE
ROUTINE
AND
AND ENABLE
ENABLE SLAVE
SLAVE I2C
I2C INTERRUPT
INTERRUPT
IRQ
IRQ =
= MY_IRQ_FUNCTION;
MY_IRQ_FUNCTION;
IRQEN
IRQEN =
= 0x200;
0x200;
//READ
//READ DATA
DATA FROM
FROM FIFO
FIFO
dat[i]
dat[i] =
= I2C0SRX
I2C0SRX
WAIT
WAIT FOR
FOR MASTER
MASTER
//RETURN FROM
FROM ISR
ISR
//RETURN
06549-014
06549-014
//ENABLE I2C
I2C on
on GPIO
GPIO P1.0
P1.0 AND
AND P1.1
P1.1
//ENABLE
GP1CON =
= 0x22;
0x22;
GP1CON
WORD ADDRESS
ADDRESS (n)
(n)
WORD
DATA (n)
(n)
DATA
DATA (n
(n +
+ 1)
1)
DATA
STOP
STOP
DEVICE
DEVICE
ADDRESS
ADDRESS
DATA (n
(n +
+ x)
x)
DATA
RECEIVE
RECEIVE
INTERRUPT
INTERRUPT
RECEIVE
RECEIVE
INTERRUPT
INTERRUPT
Figure 18.
of a Slave Receive
图 Example
18. 从机接收示例
Rev. 0 | Page 10 of 16
RECEIVE
RECEIVE
INTERRUPT
INTERRUPT
ACK
ACK
ACK
ACK
ACK
ACK
LSB
LSB
ACK
ACK
MSB
MSB
R/W
R/W
ACK
ACK
LSB
LSB
MSB
MSB
SDA LINE
LINE
SDA
06549-015
06549-015
WRITE
WRITE
START
START
Figure
Receive Flowchart
图17.
从机接收流程图
17.Slave
RECEIVE
RECEIVE
INTERRUPT
INTERRUPT
AN-895
主机接收
在主机模式下,要从从机读取数据,可以使用类似的方法。
首先,通过 I2C0CNT 寄存器配置要读取的字节数。其值表
示要从从机读取的字节数加 1。它可以是 0 至 7 范围内的值,
但在代码执行期间可以复位,以便读取大量数据。
为了开始接收数据,I2C0ADR 寄存器中的读操作 (R) 位
应置 1。这将启动传输,并利用 I2C0ADR 寄存器所设置
的地址和 R/W 位产生起始条件。接收到每个字节后(第
9 个 时 钟 脉 冲 ACK 或 NACK 之 后 ), 会 产 生 一 个 中 断。
I2C0MSTA 的位 3 置 1,表示刚刚接收到一个字节。只有读
取 I2C0MRX 才能使此位清零。
当主机不需要接收更多数据时,它针对最后接收到的字节
自动产生 NACK。这相当于通知从机停止传输字节,以便
主机能够产生停止条件。
如果没有及时读取所接收到的数据,并且 FIFO 已满,则
主机将针对所接收到的额外数据提供一个 NACK。
图 19 显示了从从机接收四个字节的流程图。
I2C0CNT 是一个内置计数器的加载寄存器,用户无法访
问该计数器。它是一个 3 位计数器,意味着主机只能被
配置为一次发送 8 个字节。但是,在发送序列期间写入
I2C0ADR 可以重载该内部计数器。
//ENABLE I2C on GPIO P1.0 AND P1.1
GP1CON = 0x22;
VECTOR TO
INTERRUPT SERVICE ROUTINE
//SET UP I2C MASTER MODE, 100kHz
I20CFG = 0x82;
I20DIV = 0xCFCF;
//CHECK FOR RX INTERRUPT
if ((I2COMSTA AND 0x8) == 0x8)
//SPECIFY INTERRUPT SERVICE ROUTINE
AND ENABLE MASTER I2C INTERRUPT
IRQ = MY_IRQ_FUNCTION;
IRQEN = 0x400;
//READ DATA FROM FIFO
dat[i] = I2C0MRX
Figure
Receive Flowchart
图 19.
主机接收流程图
19. Master
Rev. 0 | Page 11 of 16
06549-016
//RETURN FROM ISR
//SET NUMBER OF BYTES TO BE RECEIVED
I2C0CNT = 0x04;
//SET UP ADDRESS WITH R BIT SET TO 1
I2C0ADR = 0xA1;
//WAIT FOR FIRST BYTE TO BE RECEIVED
AN-895
每次请求发送数据时,从机就会产生一个中断,第一个中
断发生于对地址作出应答 (ACK) 之后,即在发送 FIFO 的
字节 0 时。数据需要预载到从机发送 FIFO 中,否则主机
的第一个读取请求将产生 NACK。如果 FIFO 预载有两组
数据,则在对地址作出应答 (ACK) 后产生一个中断,然后
在对所发送的每个字节作出应答 (ACK) 后产生一个中断。
如果 FIFO 仅预载一组数据,则在对地址作出应答 (ACK)
后产生两个中断,发送第一个数据后 FIFO 清空。
发送完一个字节后,只要主机继续请求数据,就会产生一
个中断。每次向主机发送一个字节时,I2C0MSTA 的位 2
就会置 1。
图 21 所示为从机响应主机数据请求的示例。
//ENABLE I2C on GPIO P1.0 AND P1.1
GP1CON = 0x22;
VECTOR TO
INTERRUPT SERVICE ROUTINE
//SET UP I2C SLAVE MODE
I2C0CFG = 0x1;
//CHECK FOR TX INTERRUPT
if (I2C0SSTA AND 0x04)
//SPECIFY INTERRUPT SERVICE ROUTINE
AND ENABLE SLAVE I2C INTERRUPT
IRQ = MY_IRQ_FUNCTION;
IRQEN = 0x200;
//LOAD NEXT BYTE INTO TX FIFO
I2C0STX = DATA;
//PLACE FIRST TWO BYTES IN TX FIFO
I2C0STX = 0x11;
I2C0STX = 0x22;
//WAIT FOR MASTER
//RETURN FROM ISR
06549-017
从机发送
TRANSMIT
INTERRUPT
DATA (n)
DATA (n + 1)
TRANSMIT
INTERRUPT
DATA (n + 2)
TRANSMIT
INTERRUPT
Figure 21. Example of a Slave Transmit
图 21. 从机发送示例
Rev. 0 | Page 12 of 16
STOP
DATA (n + x)
TRANSMIT
INTERRUPT
NO ACK
R/W
ACK
SDA LINE
06549-018
ACK
ACK
ACK
DEVICE
ADDRESS
READ
从机发送流程图
Figure图
20.20.
Slave
Transmit Flowchart
AN-895
I2C 寄存器定义
I2C 外设接口由 15 个寄存器组成 :
I2CxDIV,时钟分频寄存器
• 4 个寄存器,包括发送 / 接收主机 / 从机 MMR(I2CxSRX、
I2CxSTX、I2CxMRX、I2CxMTX)。
• 3 个状态寄存器,包括主机 / 从机 /FIFO(I2CxMSTA、
I2CxSSTA、I2CxFSTA)。
• 8 个配置寄存器,包括 4 个从机地址、1 个主机地址字节、
1 个主机时钟分频器、1 个主机接收数据计数和 1 个 I2C
配 置 寄 存 器(I2CxID0、I2CxID1、I2CxID2、I2CxID3、
I2CxADR、I2CxDIV、I2CxCNT、I2CxCFG)。
• 用于广播的其它寄存器不在本应用笔记的讨论范围之内。
这是一个 16 位寄存器,包含两个 8 位值 :DIVH 和 DIVL。
此寄存器中的值可设置 I2C 总线的速度。设置公式如下 :
fUCLK
f serialclock
(2 DIVH ) (2 DIVL)
其中 :
以下部分将详细介绍其中的 4 个寄存器 :
I2CxDIV,时钟分频寄存器。
I2CxMSTA,主机状态寄存器,见表 2。
I2CxCFG,I2C 配置寄存器,见表 3。
I2CxSSTA,从机状态寄存器,见表 4。
•
•
•
•
fUCLK 是分频之前的时钟。
DIVH 是时钟高电平周期。
DIVL 是时钟低电平周期。
因而,如果希望串行时钟为 100 kHz,那么
DIVH = DIVL =0xCF (I2C0DIV = 0xCFCF)
DIVH = DIVL =0xCF (I2C0DIV = 0xCFCF)
如果希望串行时钟为 400 kHz,那么
DIVH = 0x28 DIVL = 0x3C (I2C0DIV = 0x283C)
DIVH = 0x28 DIVL = 0x3C (I2C0DIV = 0x283C)
I2CxMSTA :主机状态寄存器
表 2. I2CxMSTA MMR 位功能描述
位号
描述
7
主机发送 FIFO 清空位。
置 1 ,清空主机发送 FIFO ;该位也可以清空从机接收 FIFO。
一旦主机发送 FIFO 被清空 ,则该位会自动清 0。
6
主机忙。
如果主机忙,该位自动置 1 。
该位自动清 0 。
5
仲裁失效。
在多主机模式下,如果另一个主机占用总线,该位置 1 。
如果总线空闲,则自动清 0 。
4
非应答 NACK。
如果从机没有地址应答,该位自动置 1 。
读 I2C0MSTA 寄存器后,自动清 0 。
3
主机接收中断请求。
从机接收数据后,该位置 1 。
读 I2C0MRX 寄存器后,自动清 0 。
2
主机发送中断请求。
在一次发送结束时,该位置 1 。
向 I2C0MTX 寄存器写入数据后,自动清 0 。
1
主机发送 FIFO 下溢。
如果主机发送 FIFO 下溢,该位自动置 1 。
向 I2C0MTX 寄存器写入数据后,自动清 0 。
0
主机发送 FIFO 空。
如果主机发送 FIFO 为空,该位自动置 1 。
向 I2C0MTX 寄存器写入数据后,自动清 0 。
Rev. 0 | Page 13 of 16
AN-895
I2CxCFG :I 2C 配置寄存器
表 3. I2CxCFG MMR 位功能描述
位号
31 至 15
14
描述
保留。这些位应该由用户写入 0。
停止中断使能位。
置 1 ,若在接收到一个有效的起始条件以及地址匹配之后接收到一个停止条件,则产生中断。
13 至 12
11
清 0 ,在接收到一个停止条件时不产生中断。
保留。这些位应该由用户写入 0。
时钟延展使能位 (SCL 保持低速率 )。
置 1 ,使能 SCL 线时钟延展。如果 SCL 已经处于低速率或者即将进入低速率,此位指示 I2C 接口使 SCL 保持低速率。
10
9
清 0 则禁用 SCL 线时钟延展。
保留。此位应该由用户写入 0。
从机发送 FIFO 中断请求使能位。
置 1 ,禁用从机发送 FIFO 中断请求。
清 0 ,在 R/W 位的时钟负脉冲后产生一个中断请求。如果从机发送 FIFO 空时,用户可以向其中写入数据。在时钟
8
速率为 400 kbps 并且内核时钟频率为 41.78 MHz 时,将中断延迟时间计算在内,用户有 45 个时钟周期的时间操作。
广播状态位清 0。
置 1 ,清 0 广播状态位。
7
在广播状态位清 0 后由硬件自动清 0。
主机串行时钟使能位。
置 1 ,在主机模式使能串行时钟。
6
清 0 ,在主机模式禁用串行时钟。
回送使能位。
置 1 ,内部发送端连接到内部接收端,用于测试用户软件。
5
清 0 ,正常工作。
启动延时取消位。
置 1 ,在多主机模式下,如果仲裁失效,主机立即尝试再次发送 ;
4
清 0 ,启动延时。在仲裁失效后,主机在尝试再次发送数据前等待。
硬件广播使能位。
当该位和广播使能位置 1 时,如果已接收到一个广播信号(地址为 0x00)和 1 字节数据,器件将对接收寄存器中的
数据和 I2C0ALT 中的数据进行比较。如果数据匹配,表明器件接收到一个硬件广播。当器件需要紧急呼叫一个主机
而又不知道呼叫哪一个时,可使用该功能。ADuC702x 可监视这些地址。要求主机注意的器件会将自己的地址嵌入
到消息中。所有的主机都会侦听这些消息,知道如何处理该器件要求的主机会与其从机通信并进行相应操作。根据
3
2000 年 1 月的 I 2C 总线规范 2.1 版,I2C0ALT 寄存器的 LSB 应该始终写入 1。
广播使能位。
通过将该位置 1 ,可以让从机为 I2C 广播发送 ACK,写地址 0x00。然后器件将识别一个数据位。如果器件接收到的
数据是 0x06,即由硬件复位和对从机地址的可编程部分进行写操作,那么根据 I 2C 总线规范 ,此时 I2C 接口复位。
这个命令可用于复位整个 I2C 系统。当产生任一广播时,广播中断状态位置 1。在复位后用户必须通过设置 I2C 接口
进行合适的操作。如果接收到的数据为 0x04,即由硬件对从机地址可编程部分进行写操作,则当产生任一广播时,
2
1
广播中断状态位置 1。用户必须通过重新编程器件地址来进行合适的操作。
保留。
主机使能位。
该位置 1 ,使能主机 I2C 通道。
0
该位清 0 ,禁用主机 I2C 通道。
从机使能位。
该位置 1 ,使能从机 I2C 通道。此时会监视从机传输序列中的数据以寻找存放在 I2C0ID0、I2C0ID1、I2C0ID2 和
I2C0ID3 中的器件地址。如果识别了器件地址,就会加入从机传输序列中。
该位清 0 ,禁用从机 I2C 通道。
Rev. 0 | Page 14 of 16
AN-895
I2CxSSTA :从机状态寄存器
注意 :读取状态寄存器会更改其内容。只能在 ISR 期间读取一次并将其值保存在一个变量中。
表 4. I2CxSSTA MMR 位功能描述
位号
31 至 15
14
描述
保留。这些位应该由用户写入 0。
起始解码位。
如果器件接收到一个有效的起始条件 + 地址匹配,则由硬件对该位置 1 。
13
当产生一个 I2C 停止条件或 I2C 广播复位时,该位清 0 。
重复起始解码位。
如果器件接收到一个有效的重复起始条件 + 地址匹配,则由硬件对该位置 1 。
12 至 11
10
当产生一个 I2C 停止条件、读取 I2CxSSTA 寄存器或者 I2C 广播复位时,该位清 0 。
ID 解码位。
00
接收到的地址匹配 ID 寄存器 0。
01
接收到的地址匹配 ID 寄存器 1。
10
接收到的地址匹配 ID 寄存器 2。
11 接收到的地址匹配 ID 寄存器 3。
起始和地址匹配中断后停止。
在上一个 I2C 起始条件 + 地址匹配后,如果从机接收到一个 I2C 停止条件,则由硬件对该位置 1 。
9至8
7
6
读取 I2CxSSTA 寄存器后该位清 0 。
广播 ID。
00
无广播
01
广播复位和程序地址
10
广播程序地址
11 广播匹配可供选择的 ID
广播中断。
从机忙。
如果从机忙,该位置 1 。
5
该位自动清 0 。
非应答 NACK。
主机需要数据却无法获得数据时,该位置 1 。
4
该位自动清 0 。
从机接收 FIFO 溢出。
如果从机接收 FIFO 溢出,该位置 1 。
3
读取 I2C0SRX 后,该位自动清 0 。
从机接收中断请求。
从机接收数据后该位置 1 。
2
读取 I2C0SRX 寄存器后自动清 0 。
从机发送中断请求。
在一次发送结束时该位置 1 。
1
向 I2C0STX 寄存器写入数据后,该位自动清 0 。
从机发送 FIFO 下溢。
如果从机发送 FIFO 下溢该位置 1 。
0
向 I2C0STX 寄存器写入数据后,该位自动清 0 。
从机发送 FIFO 空。
如果从机发送 FIFO 为空,该位置 1 。
向 I2C0STX 寄存器写入数据后,该位自动清 0 。
Rev. 0 | Page 15 of 16
AN-895
串行 EEPROM 协议的实现
本节说明对于单一 I2C 地址,如何实现串行 EEPROM 规范
所支持的五个命令 :
当前地址读取
随机读取
随机写入
顺序读取
顺序写入
BIT 2 SET
READ
STATUS
BIT 2 SET
READ
STATUS
BIT 10 SET
STOP
BIT 3 SET
WRITE
BIT 3 SET
WRITE
FIRST
TRUE
FIRST
FALSE
BIT 10 SET
STOP
I2C0STX=
DAT[++BYTE ADDR]
FIRST = TRUE
I2C0STX=
DAT[++BYTE ADDR]
FIRST = TRUE
TRUE
FALSE
GET DATA
GET DATA
FLUSH TX FIFO
FLUSH TX FIFO
I2C0STX=
DAT[++BYTE_ADDR]
I2C0STX=
DAT[++BYTE_ADDR]
RETURN
Figure
22.
Slave
Interrupt Service Routine
图 22.
从机中断服务程序
RETURN
随附代码参见 AN-895 Companion Code.zip。
BYTE_ADDR=
I2C0SRX
BYTE_ADDR=
I2C0SRX
FLUSH TX FIFO
FLUSH TX FIFO
I2C0STX=
DAT[BYTE_ADDR]
I2C0STX=
DAT[BYTE_ADDR]
FIRST = FALSE
FIRST = FALSE
06549-019
06549-019
•
•
•
•
•
在中断服务程序中,必须读取一次状态寄存器并保存其值。
中断服务程序的流程图如图 22 所示。
Figure 22. Slave Interrupt Service Routine
命令代码
I2C 配置
I2CCFG = 0x4001;
// Enable slave, enable STOP detect
Variable
变量初始化
I2C0STXInitialization
= dat[0];
// Set initial data
I2C0ID0 = 0xA0;
I2CCFG = 0x4001;
I2C0STX = dat[0];
I2C0ID0 = 0xA0;
Byte_addr
= 0
Variable Initialization
//
//
//
//
Slave ID
Enable slave, enable STOP detect
Set initial data
Slave ID
First = 1
Byte_addr = 0
使能
Enable
C1
Slave Interrupt
I2CI2=从机中断
First
IRQEN
Enable I=2C 0x200;
Slave Interrupt// I2C0 Slave Interrupt
while (1)
// Wait for interrupt
IRQEN = 0x200;
// I2C0 Slave Interrupt
while (1)
// WaitI2Cfor
interrupt ADI 公司或其下属机构拥有 Philips 公司许可的 I2C 器件时,可以获得 Philips 公司 I2C 专利权之下
如果系统符合
标准规范,则用户在购买
Philips 公司定义的
的许可,以便在 I2C 系统中使用这些器件。
©2007 Analog Devices, Inc. All rights reserved. Trademarks and
registered trademarks are the property of their respective owners.
AN06549-0-1/07(0)
©2007 Analog Devices, Inc. All rights reserved. Trademarks and
registered trademarks are the property of their respective owners.
AN06549-0-1/07(0)
Rev. 0 | Page 16 of 16
Rev.
Rev. 00 || Page
Page 16
16 of
of 16
16