项目七、 i 2 c 总线扩展

56
项项项I 2 C 项项项项

Upload: lynsey

Post on 19-Mar-2016

183 views

Category:

Documents


6 download

DESCRIPTION

项目七、 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

TRANSCRIPT

项目七、 I2C 总线扩展

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

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

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

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

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

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

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

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

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

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

SDA

SCL数据线数据有效

允许数据变化

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

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

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

主机发出的SCL

发送器发出数据

接收器发出数据

1 8 9起始信号

应答信号

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

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

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

SDA

SCL 1 2 7 8 9 1 23-8 9

ACK ACK

MSB

起始信号 停止信号

接收器发送的应答信号

字节结束接收器内中断

接收器发送的应答信号

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

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

应答信号的时钟脉冲

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

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

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

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

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

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

( 2)从发送主接收

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

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

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

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

图 7-10 字节写时序

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

图 7-11 页写时序

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

图 7-12 立即地址读时序

2 )选择性读

图 7-13 选择性读时序

3 )连续读

图 7-14 连续读时序

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

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

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

有有

发送控制字、从器件地址

I2C 开始信号

中断入口

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

应答信号

发送数据

应答信号发送结束

停止信号返回

中断 0(写入 AT2401CI2C 数据)

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

中断入口

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

应答信号开始信号

应答信号

最后一个字节发非应答

返回

发送控制字

接收数据发应答位

停止信号

无有

是否

无有

无有

中断 1(读出 AT2401CI2C数据)

主程序:  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  

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

中断 0:(写入 AT2401CI2C 数据)

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

16;字节数

  LCALL IWRNBYTE ;写数据  RETI    

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

16;字节数

  LCALL IRDNBYTE ;写数据  RETI    

; 名称 :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    

; 名称 :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

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

  NOP    

  SETB SCL  

  NOP    

  NOP    

  NOP    

  NOP    

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

  NOP    

  NOP    

  RET    

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

; 名称 :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    

; 名称 :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    

  CLR SCL  

  SJMP WLP1  

WRO: CLR SDA ;发送 0  NOP    

  SETB SCL  

  NOP    

  NOP    

  NOP    

  NOP    

  NOP    

  CLR SCL  

  SJMP WLP1  

; 名称 :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    

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 ;字节数

  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    

; 名称 :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  

WRDA: MOV A,@R1  

  LCALL WRBYTE ;开始写入数据  LCALL CACK  

  JNB ACK,IWRNBYTE

 

  INC R1  

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

  RET    

; 名称 :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  

  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    

3 、仿真调试

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

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

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

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

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

图 7-19 I2C 总线调试信息

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