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