Top Banner
项项项I 2 C 项项项项
56

项目七、 I 2 C 总线扩展

Mar 19, 2016

Download

Documents

lynsey

项目七、 I 2 C 总线扩展. 项目七、 I 2 C 总线扩展 任务. AT24C 系列存储器读写操作. 能力目标 1、了解 I 2 C 总线原理 2、能采用 I 2 C 技术对 AT24C 系列存储器读写操作 学习内容 1、 I 2 C 总线原理 2、 AT24C 系列存储器读写操作. 一、任务要求 - PowerPoint PPT Presentation
Welcome message from author
This document is posted to help you gain knowledge. Please leave a comment to let me know what you think about it! Share it to your friends and learn new things together.
Transcript
Page 1: 项目七、 I 2 C 总线扩展

项目七、 I2C 总线扩展

Page 2: 项目七、 I 2 C 总线扩展

项目七、 I2C 总线扩展 任务 . AT24C系列存储器读写操作能力目标1 、了解 I2C 总线原理2 、能采用 I2C 技术对 AT24C系列存储器读写操作学习内容1 、 I2C 总线原理2 、 AT24C系列存储器读写操作

Page 3: 项目七、 I 2 C 总线扩展

一、任务要求 要 求 先 对 2401C 执 行 写 操 作 , 将AT89C51内部数据存储器中 30H ~ 3FH中的数据写入 2401C 中从 30H 开始的 16 个连续存储单元中,再执行读操作,读取 2401C 中30H ~ 3FH 中的数据,并将数据存储到AT89C51 内部存储器中从 40H 开始的 16 个连续存储单元中。 KEY1充当外部中断 0源,当按下 KEY1时,单片机完成用 I2C 总线写 AT2402,KEY2充当外部中断 1源,当按下 KEY2时,单片机完成用 I2C 总线读 AT2402 。

Page 4: 项目七、 I 2 C 总线扩展

二、任务分析1 、根据要求整个程序由主程序和中断 0 和中断 1三段程序组成。2 、 AT2401 是一个带有总线结构的存储器,要对 AT2401 进行读或写,必须按照AT2402的读写时序编写开始信号子程序、停止信号子程序、发送一个字节子程序、接收一个应答位子程序、发送一个接收应答位子程序、发送一个非接收应答位子程序。

Page 5: 项目七、 I 2 C 总线扩展

三、学习知识 1 、 I2C 总线结构I2C 串行总线只有二根信号线,一根是双向的数据线 SDA,另一根是双向的时钟线 SCL。

图 7-1 I2C 主 /从系统结构图

Page 6: 项目七、 I 2 C 总线扩展

在信息的传输过程中, I2C 总线上发送数据的设备称为发送器,而接收数据的设备称为接收器。能够初始发送、产生时钟、起始信号、停止信号的设备称为主机或主控制器;而被主机寻址的设备称为从机。

I2C 总线上的每个芯片(例如微控制器、 LCD驱动器、存储器或键盘接口)都有唯一的地址,就像电话机一样都有各自唯一的号码,只有被选址的芯片即从机才和主机(例如单片机)通信,就像电话机只有在被拨通各自的号码时才能通话。

Page 7: 项目七、 I 2 C 总线扩展

2 、 I2C 总线协议( 1)主机—从机和接收器—发送器主机—从机、接收器—发送器这些关系不是持久的,只由当时数据传输的方向决定。例如在如下的传输数据的过程中:1)微控制器 A 要发送信息到微控制器 B微控制器 A(主机)寻址微控制器 B(从机)微控制器 A (主机—发送器)发送数据到微控制器 B(从机—接收器) 微控制器 A 终止传输

Page 8: 项目七、 I 2 C 总线扩展

2) 如果微控制器 A 想从微控制器 B 接收信息微控制器 A(主机)寻址微控制器 B(从机)微控制器 A(主机—接收器)从微控制器 B(从机—发送器)接收数据微控制器 A 终止传输

Page 9: 项目七、 I 2 C 总线扩展

( 2 ) I2C 总线位的传输 I2C 总线为同步传输总线,总线数据与时钟完全同步。 I2C 总线规定时钟线 SCL上一个时钟周期只能传送一位数据。当时钟 SCL线为高电平时,对应数据线 SDA线上的电平即为有效数据位(高电平为 1,低电平为 0);在数据传送开始后, SCL为高电平的时候, SDA的数据必须保持稳定,只有当 SCL为低电平的时候,才允许 SDA上的数据改变。当 SCL发出重复的时钟脉冲时,每次为高电平时, SDA线上对应的电平就是一位一位传送的数据,其中最先传输的是字节的最高位数据,其时序如图 7-2所示。

Page 10: 项目七、 I 2 C 总线扩展

SDA

SCL数据线数据有效

允许数据变化

图 7-2 I2C 总线上 SDA和 SCL的时序关系

Page 11: 项目七、 I 2 C 总线扩展

( 3)起始条件和停止条件 起始条件:当 SCL线为高电平时, SDA线由高到低的转换。出现起始信号以后,总线被认为“忙”。 停止条件:当 SCL为线高电平时, SDA线由低到高的转换。出现停止信号后,总线被认为“空闲”。 也就是 SCL 和 SDA都保持高电平,总线就是空闲的。 在连续读写时,如收到— - 个“停止条件”。则所有读写操作将终止,芯片将进入等待模式。起始条件和停止条件—般由主机产生。

Page 12: 项目七、 I 2 C 总线扩展

(4) 应答信号 接收数据的芯片在接收到 8位数据后,向发送数据的芯片发出特定的低电平脉冲,表示已收到数据。应答位的时钟脉冲也由主机产生。发送器在应答时钟脉冲高电平期间,将 SDA线拉为高电平,即释放 SDA线,转由接收器控制。接收器在应答时钟脉冲的高电平期间必须拉低 SDA线,以使之为稳定的低电平作为有效应答,如图 7-4 所示。若接收器不能拉低 SDA线,则为非应答信号。

Page 13: 项目七、 I 2 C 总线扩展

主机发出的SCL

发送器发出数据

接收器发出数据

1 8 9起始信号

应答信号

图 7-4 I2C 总线上的应答 发送器向接收器发出一个字节的数据后,等待接收器发出一个应答信号,发送器接收到应答信号后,根据实际情况作出是否继续传递信号的判断。若未收到应答信号,由判断为接收器出现故障。

Page 14: 项目七、 I 2 C 总线扩展

( 5)数据字节的传送 发送到 SDA线上的每个字节必须为 8位。每次传输可以发送的字节数量不受限制,但每个字节后必须跟—个应答位,数据传输的顺序是首先传输数据的最高位 MSB,然后在每一个SCL线的时钟周期内,传送一位数据,在 8 个SCL时钟周期后, SDA线上完成一个字节的数据传送。在传输时,若 SCL线为高电平, SDA线上电平需保持稳定不变,只有SCL为低电平时, SDA线上的电平才能改变。否则,若 SCL线为高电平,而 SDA线上的电平由高跳变到低,则为起始信号;由低跳变到高,则为停止信号。

Page 15: 项目七、 I 2 C 总线扩展

SDA线上完成一个字节的数据传送后,在第 9个 SCL时钟周期,接收器需发出一个应答信号,即在 SCL线为高电平时,将 SDA线拉低,以使之为稳定的低电平作为有效应答,表明正确收到了发送器发送的数据。

Page 16: 项目七、 I 2 C 总线扩展

SDA

SCL 1 2 7 8 9 1 23-8 9

ACK ACK

MSB

起始信号 停止信号

接收器发送的应答信号

字节结束接收器内中断

接收器发送的应答信号

执行中断服务程序时时钟线保持低电平

每个时钟周期传送一位数据

应答信号的时钟脉冲

图 7-5 I2C 总线上数据的传送

Page 17: 项目七、 I 2 C 总线扩展

( 6)一帧完整数据的传送一次典型的 I2C 总线数据传输包括一个起始条件( START)、一个地址字节(位 7-1 : 7位从机地址;位 0 : R/W方向位)、一个或多个字节的数据和一个停止条件( STOP)。每个地址字节和每个数据字节后面都必须用 SCL高电平期间的 SDA低电平(见图 7-6 )来应答( ACKNOWLEDGE简写为 ACK)。如果在数据传输了一段时间后,接收器件不能接收更多的数据字节,接收器件将发出一个“非应答”( NACK)信号,这用 SCL高电平期间的 SDA高电平表示,发送器件读到“非应答”信号后终止传输。

Page 18: 项目七、 I 2 C 总线扩展

方向位占据地址字节的最低位。方向位被设置为逻辑 1 表示这是一个“读”( READ)操作,即主机接收从机发送的数据;方向位为逻辑 0 表示这是一个“写”( WRITE)操作,即从机接收主机发送的数据。所有的数据传输都由主器件启动,可以寻址一个或多个目标从机。

图 7-6 I2C 总线上完整数据的传送

Page 19: 项目七、 I 2 C 总线扩展

3 、 I2C 总线的传送格式 ( 1)主发送从接收

图 7-7 典型的主发送从接收时序

Page 20: 项目七、 I 2 C 总线扩展

( 2)从发送主接收

图 7-8 典型的主接收从发送时序

Page 21: 项目七、 I 2 C 总线扩展

4 、 AT24CXX( 1)管脚配置和功能

1234 5

678A

AA

Vss

0

1

2

VccWP

SDASCL

表 7-4 AT24C02的地址定义 最高位 7 位从机地址 最低位1 0 1 0 A2 A1 A0 R/

W D7 D6 D5 D4 D3 D2 D1 D0

Page 22: 项目七、 I 2 C 总线扩展

SCL :串行时钟 SDA :串行数据 /地址 A0、 A1、 A2:器件地址输入端 WP:写保护 如果 WP管脚连接到 Vcc,所有的内容都被写保护,只能读而不能写。

Page 23: 项目七、 I 2 C 总线扩展

( 2 ) AT24C02的读写操作 1)字节写 在字节写模式下,主机发送起始信号和从机地址信息, R/W位置零。在从机产生应答信号后,主机发送 AT24C02 的内部字节地址,该地址表明一个字节的数据要写入 AT24C02 的哪一个字节。主机在收到从机的另一个应答信号后,再发送数据到 AT24C02 内部字节地址表明的存储单元。 AT24C02 再次应答,并在主机产生停止信号后开始内部数据的擦写。在内部擦写过程中, AT24C02 不再应答主机的任何请求。字节写时序如图 7-10 所示。

Page 24: 项目七、 I 2 C 总线扩展

图 7-10 字节写时序

Page 25: 项目七、 I 2 C 总线扩展

2 )页写 用页写 AT24C02可以一次写入 8个字节的数据。页写操作的启动和字节写一样,不同在于传送了一字节数据后并不产生停止信号。主机被允许再发送 7个额外的字节,每发送一个字节数据后, AT24C02产生一个应答信号,并将内部字节地址自动加 1 。如果写到此页的最后一个字节,即发送完 8个字节数据后,主机继续发送数据,数据将从该页的首地址写入,先前写入的数据将被覆盖,造成数据丢失。

Page 26: 项目七、 I 2 C 总线扩展

图 7-11 页写时序

Page 27: 项目七、 I 2 C 总线扩展

AT24C02的读操作AT24C02的读操作可分为立即地址读、选择性读和连续读。1)立即地址读

图 7-12 立即地址读时序

Page 28: 项目七、 I 2 C 总线扩展

2 )选择性读

图 7-13 选择性读时序

Page 29: 项目七、 I 2 C 总线扩展

3 )连续读

图 7-14 连续读时序

Page 30: 项目七、 I 2 C 总线扩展

四、任务实施1 、硬件设计

图 7-15 单片机和 AT2401CI2C 总线硬件接线原理图

Page 31: 项目七、 I 2 C 总线扩展

2 、软件设计具体流程图如图 7-16 所示。 否 是

有有

发送控制字、从器件地址

I2C 开始信号

中断入口

应答信号发从器件片内地址

应答信号

发送数据

应答信号发送结束

停止信号返回

中断 0(写入 AT2401CI2C 数据)

Page 32: 项目七、 I 2 C 总线扩展

发送从器件地址I2C 开始信号

中断入口

应答信号发从器件片内地址

应答信号开始信号

应答信号

最后一个字节发非应答

返回

发送控制字

接收数据发应答位

停止信号

无有

是否

无有

无有

中断 1(读出 AT2401CI2C数据)

Page 33: 项目七、 I 2 C 总线扩展

主程序:  ACK BIT 10H ;应答标志位  SLA DATA 50H ;器件地址字  SUBA DATA 51H ;器件子地址  NUMBYTE DATA 52H ;读 / 写字节数  SDA BI T P1.5  

  SCL BIT P1.4 ; I2C 总线定义  MTD EQU 30H ;发送数据缓存区首地址 (30H-3FH)

  MRD EQU 40H ;接收数据缓存区首地址 (40H-4FH)

  ORG 0000H  

  AJMP MAIN  

  ORG 0003H  

  LJMP WRITE  

  ORG 0013H  

  LJMP READ  

Page 34: 项目七、 I 2 C 总线扩展

MAIN: MOV R4,#0F0H ;延时 , 等待其它芯片复位完成 DJNZ R4,$ MOV A,#0 ;依次将 30H~ 3FH 设为 00H~

0FH MOV R0,#30H S1: MOV @R0,A INC R0 INC A CJNE R0,#04H,S1 SETB PX1 ;将中断 1 (读数据)设为高优先级 SETB EX0 SETB EX1 SETB EA L1: NOP JMP L1

Page 35: 项目七、 I 2 C 总线扩展

中断 0:(写入 AT2401CI2C 数据)

WRITE: MOV SLA,#0A0H ; 24C01C 地址字 , 写操作  MOV SUBA,#30H ;目标地址  MOV NUMBYTE,#

16;字节数

  LCALL IWRNBYTE ;写数据  RETI    

Page 36: 项目七、 I 2 C 总线扩展

中断 1:(读出 AT2401CI2C 数据)READ: MOV SLA,#0A0H ; 24C01C 地址字 , 伪写入操作  MOV SUBA,#30H ;目标地址  MOV NUMBYTE,#

16;字节数

  LCALL IRDNBYTE ;写数据  RETI    

Page 37: 项目七、 I 2 C 总线扩展

; 名称 :STRRT; 描述 :启动 I2C 总线子程序—发送 I2C 总线起始条件 START: SETB SDA ;发送起始条件数据信号  NOP   ;起始条件建立时间大于 4.7us  SETB SCL ;发送起始条件的时钟信号  NOP      NOP      NOP      NOP      NOP   ;起始条件锁定时间大于 4.7us  CLR SDA ;发送起始信号  NOP      NOP      NOP      NOP   ;起始条件锁定时间大于 4.7us  CLR SCL ;钳住 I2C 总线 , 准备发送或接收数据  NOP      RET    

Page 38: 项目七、 I 2 C 总线扩展

; 名称 :STOP; 描述 :停止 I2C 总线子程序—发送 I2C 总线停止条件 STOP: CLR SDA ;发送停止条件的数据信号 NOP NOP SETB SCL ;发送停止条件的时钟信号 NOP NOP NOP NOP NOP ;起始条件建立时间大于 4.7us SETB SDA ;发送 I2C 总线停止信号 NOP NOP NOP NOP NOP ;延迟时间大于 4.7us RET

Page 39: 项目七、 I 2 C 总线扩展

; 名称 :MACK; 描述 :发送应答信号子程序 MACK: CLR SDA ;将 SDA 置 0  NOP    

  NOP    

  SETB SCL  

  NOP    

  NOP    

  NOP    

  NOP    

  NOP   ;保持数据时间 , 大于 4.7us  CLR SCL  

  NOP    

  NOP    

  RET    

Page 40: 项目七、 I 2 C 总线扩展

; 名称 :MNACK; 描述 :发送非应答信号子程序MNACK: SETB SDA ;将 SDA 置 1  NOP      NOP      SETB SCL    NOP      NOP      NOP      NOP      NOP      CLR SCL ;保持数据时间 , 大于 4.7us  NOP      NOP      RET    

Page 41: 项目七、 I 2 C 总线扩展

; 名称 :CACK; 描述 :检查应答位子程序 , 返回值 :ACK=1时表示有应答 CACK: SETB SDA    NOP      NOP      SETB SCL    CLR ACK    NOP      NOP      MOV C,SDA    JC CEND    SETB ACK ;判断应答位CEND: NOP      CLR SCL    NOP      RET    

Page 42: 项目七、 I 2 C 总线扩展

; 名称 :WRBYTE; 描述 :发送字节子程序 ,字节数据放入ACC WRBYTE:

MOV R0,#08H  

WLP: RLC A ;取数据位  JC WRI    SJMP WRO ;判断数据位WLP1: DJNZ R0,WLP    NOP      RET    WRI: SETB SDA ;发送 1  NOP      SETB SCL    NOP      NOP      NOP      NOP      NOP    

Page 43: 项目七、 I 2 C 总线扩展

  CLR SCL  

  SJMP WLP1  

WRO: CLR SDA ;发送 0  NOP    

  SETB SCL  

  NOP    

  NOP    

  NOP    

  NOP    

  NOP    

  CLR SCL  

  SJMP WLP1  

Page 44: 项目七、 I 2 C 总线扩展

; 名称 :RDBYTE; 描述 :读取字节子程序 ,读出的数据存放在ACC RDBYTE: MOV R0,#08H  

RLP: SETB SDA    NOP      SETB SCL ;时钟线为高 , 接收数据位  NOP      NOP      MOV C,SDA ;读取数据位  MOV A,R2    CLR SCL ;将 SCL 拉低 , 时间大于 4.7us  RLC A ;进行数据位的处理  MOV R2,A    NOP      NOP      NOP      DJNZ R0,RLP ;未够 8 位 , 继续读入  RET    

Page 45: 项目七、 I 2 C 总线扩展

MAIN: MOV R4,#0F0H ;延时 , 等待其它芯片复位完成  DJNZ R4,$ ;发送数据缓存区初始化 , 将 16 个连续字节分别赋值为 00H 到 0FH  MOV A,#0  

  MOV R0,#30H  

S1: MOV @R0,A  

  INC R0  

  INC A  

  CJNE R0,#40H,S1 ;向 24C01C 中写数据 , 数据存放在24C01C 中 30H 开始的 16 个字节中  MOV SLA,#0A0H ; 24C01C 地址字 , 写操作  MOV SUBA,#30H ;目标地址  MOV NUMBYTE,#16 ;字节数

Page 46: 项目七、 I 2 C 总线扩展

  LCALL IWRNBYTE ;写数据DELAY: MOV R5,#20  

D1: MOV R6,#248  

D2: MOV R7,#248  

  DJNZ R7,$  

       

  DJNZ R6,D2  

  DJNZ R5,D1 ;从 24C01C 中读数据 , 数据送AT89C51 中 40H 开始的 16 个字节中  MOV SLA,#0A0H ; 24C01C 地址字 , 伪写入操作

  MOV SUBA,#30H ;目标地址  MOV NUMBYTE,#16 ;字节数  LCALL IRDNBYTE ;写数据  END    

Page 47: 项目七、 I 2 C 总线扩展

; 名称 :IWRNBYTE; 描述 :向器件指定子地址写 N 个数据;入口参数 :器件地址字 SLA,子地址 SUBA,发送数据缓冲区 MTD,发送字节数 NUMBYTE

IWRNBYTE:

MOV R3,NUMBYTE  

  LCALL START ;启动总线  MOV A,SLA  

  LCALL WRBYTE ;发送器件地址字  LCALL CACK  

  JNB ACK,RETWRN ;无应答则退出  MOV A,SUBA ;指定子地址  LCALL WRBYTE  

  LCALL CACK  

  MOV R1,#MTD  

Page 48: 项目七、 I 2 C 总线扩展

WRDA: MOV A,@R1  

  LCALL WRBYTE ;开始写入数据  LCALL CACK  

  JNB ACK,IWRNBYTE

 

  INC R1  

  DJNZ R3,WRDA ;判断是否写完RETWRN: LCALL STOP  

  RET    

Page 49: 项目七、 I 2 C 总线扩展

; 名称 :IRDNBYTE; 描述 :从器件指定子地址读取 N 个数据;入口参数 :器件地址字 SLA,子地址 SUBA,接收数据缓存区 MRD,接收字节数 NUMBYTE IRDNBYTE:

MOV R3,NUMBYTE  

  LCALL START    MOV A,SLA    LCALL WRBYTE ;发送器件地址字  LCALL CACK    JNB ACK,RETRDN  

  MOV A,SUBA ;指定子地址  LCALL WRBYTE    LCALL CACK    LCALL START ; 重新启动总线  MOV A,SLA    INC A ;准备进行读操作  LCALL WRBYTE    LCALL CACK  

Page 50: 项目七、 I 2 C 总线扩展

  JNB ACK,IRDNBYTE

 

  MOV R1,#MRD  

RON1: LCALL RDBYTE ;读操作开始  MOV @R1,A  

  DJNZ R3,SACK  

  LCALL MNACK ;最后一字节发非应答位RETRDN: LCALL STOP  

  RET    

SACK: LCALL MACK  

  INC R1  

  SJMP RON1  

  END    

Page 51: 项目七、 I 2 C 总线扩展

3 、仿真调试

打开“ Proteus ISIS”界面,在 CPU后台加载打开“ I2C 数据读写 .hex”文件,点击运行键,按下“ KEY1写数据”中断按钮,然后按下暂停键,打开“ Debug”下“ 8051 CPU” 下的“ Intermal Memory ”和“ I2C Memory Intermal Memory”窗口可观察到如图 7-17 所示的已经 8051 已将片内 30H 到 3FH的将数据写入 I2C 的 30H 到3FH 。

Page 52: 项目七、 I 2 C 总线扩展

图 7-17 8051 内部数据 30H 到 3FH的数据写入 I2C 的30H 到 3FH

Page 53: 项目七、 I 2 C 总线扩展

按下“ KEY2读数据”中断按钮,然后按下暂停键,打开“ Debug”下“ 8051 CPU”下的“ Intermal Memory ”和“ I2C Memory Intermal Memory”窗口可观察到如图 7-18 所示的已经将 I2C 的 30H 到 3FH。数据读入 8051 的 40H 到 4FH。

Page 54: 项目七、 I 2 C 总线扩展

图 7-18 I2C 的 30H 到 3FH内部数据读到 8051 内部 40H到 4FH

Page 55: 项目七、 I 2 C 总线扩展

打开“ Debug”下“ I2C Debugger”I2C 总线调试器中信息如图 7-19所示。其中第一行为 AT89C51向 24C01写入的数据,其余的几行为 AT89C51从 24C01中读出的数据。

图 7-19 I2C 总线调试信息

Page 56: 项目七、 I 2 C 总线扩展

五、总结与提高1 、 I2C 总线的扩展是属于项目四中的存储器扩展的一部分:2 、 I2C 总线的扩展的特殊性及学习方法: I2C 总线的扩展特殊性: I2C 总线的扩展的学习方法: