560 likes | 657 Views
项目七〠I 2 C 总线扩展. 项目七〠I 2 C 总线扩展 任务. AT24C 系列å˜å‚¨å™¨è¯»å†™æ“作. èƒ½åŠ›ç›®æ ‡ 1ã€äº†è§£ I 2 C æ€»çº¿åŽŸç† 2ã€èƒ½é‡‡ç”¨ I 2 C 技术对 AT24C 系列å˜å‚¨å™¨è¯»å†™æ“作 å¦ä¹ 内容 1〠I 2 C æ€»çº¿åŽŸç† 2〠AT24C 系列å˜å‚¨å™¨è¯»å†™æ“作. 一ã€ä»»åŠ¡è¦æ±‚
E N D
项目七、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所示。
(3)起始条件和停止条件 起始条件:当SCL线为高电平时,SDA线由高到低的转换。出现起始信号以后,总线被认为“忙”。 停止条件:当SCL为线高电平时,SDA线由低到高的转换。出现停止信号后,总线被认为“空闲”。 也就是SCL和SDA都保持高电平,总线就是空闲的。 在连续读写时,如收到—-个“停止条件”。则所有读写操作将终止,芯片将进入等待模式。起始条件和停止条件—般由主机产生。
(4)应答信号 接收数据的芯片在接收到8位数据后,向发送数据的芯片发出特定的低电平脉冲,表示已收到数据。应答位的时钟脉冲也由主机产生。发送器在应答时钟脉冲高电平期间,将SDA线拉为高电平,即释放SDA线,转由接收器控制。接收器在应答时钟脉冲的高电平期间必须拉低SDA线,以使之为稳定的低电平作为有效应答,如图7-4所示。若接收器不能拉低SDA线,则为非应答信号。
图7-4 I2C总线上的应答 发送器向接收器发出一个字节的数据后,等待接收器发出一个应答信号,发送器接收到应答信号后,根据实际情况作出是否继续传递信号的判断。若未收到应答信号,由判断为接收器出现故障。
(5)数据字节的传送 发送到SDA线上的每个字节必须为8位。每次传输可以发送的字节数量不受限制,但每个字节后必须跟—个应答位,数据传输的顺序是首先传输数据的最高位MSB,然后在每一个SCL线的时钟周期内,传送一位数据,在8个SCL时钟周期后,SDA线上完成一个字节的数据传送。在传输时,若SCL线为高电平,SDA线上电平需保持稳定不变,只有SCL为低电平时,SDA线上的电平才能改变。否则,若SCL线为高电平,而SDA线上的电平由高跳变到低,则为起始信号;由低跳变到高,则为停止信号。
SDA线上完成一个字节的数据传送后,在第9个SCL时钟周期,接收器需发出一个应答信号,即在SCL线为高电平时,将SDA线拉低,以使之为稳定的低电平作为有效应答,表明正确收到了发送器发送的数据。
(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 典型的主接收从发送时序
1 0 1 0 A2 A1 A0 R/W 4、AT24CXX (1)管脚配置和功能 表7-4 AT24C02的地址定义 最高位 7位从机地址 最低位 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所示。
2)页写 用页写AT24C02可以一次写入8个字节的数据。页写操作的启动和字节写一样,不同在于传送了一字节数据后并不产生停止信号。主机被允许再发送7个额外的字节,每发送一个字节数据后,AT24C02产生一个应答信号,并将内部字节地址自动加1。如果写到此页的最后一个字节,即发送完8个字节数据后,主机继续发送数据,数据将从该页的首地址写入,先前写入的数据将被覆盖,造成数据丢失。
AT24C02的读操作 AT24C02的读操作可分为立即地址读、选择性读和连续读。 1)立即地址读 图7-12 立即地址读时序
2)选择性读 图7-13 选择性读时序
3)连续读 图7-14 连续读时序
四、任务实施 1、硬件设计 图7-15 单片机和AT2401CI2C总线硬件接线原理图
中断入口 I2C开始信号 发送控制字、从器件地址 无 应答信号 有 发从器件片内地址 应答信号 无 有 发送数据 无 应答信号 有 发送结束 否 是 停止信号 返回 2、软件设计 具体流程图如图7-16所示。 中断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
WRITE: MOV SLA,#0A0H ;24C01C地址字,写操作 MOV SUBA,#30H ;目标地址 MOV NUMBYTE,#16 ;字节数 LCALL IWRNBYTE ;写数据 RETI 中断0:(写入AT2401CI2C数据)
READ: MOV SLA,#0A0H ;24C01C地址字,伪写入操作 MOV SUBA,#30H ;目标地址 MOV NUMBYTE,#16 ;字节数 LCALL IRDNBYTE ;写数据 RETI 中断1:(读出AT2401CI2C数据)
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 ;名称:STRRT ;描述:启动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 ;名称:STOP ;描述:停止I2C总线子程序—发送I2C总线停止条件
MACK: CLR SDA ;将SDA置0 NOP NOP SETB SCL NOP NOP NOP NOP NOP ;保持数据时间,大于4.7us CLR SCL NOP NOP RET ;名称:MACK ;描述:发送应答信号子程序
MNACK: SETB SDA ;将SDA置1 NOP NOP SETB SCL NOP NOP NOP NOP NOP CLR SCL ;保持数据时间,大于4.7us NOP NOP RET ;名称:MNACK ;描述:发送非应答信号子程序
CACK: SETB SDA NOP NOP SETB SCL CLR ACK NOP NOP MOV C,SDA JC CEND SETB ACK ;判断应答位 CEND: NOP CLR SCL NOP RET ;名称:CACK ;描述:检查应答位子程序,返回值:ACK=1时表示有应答
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 ;名称:WRBYTE ;描述:发送字节子程序,字节数据放入ACC
CLR SCL SJMP WLP1 WRO: CLR SDA ;发送0 NOP SETB SCL NOP NOP NOP NOP NOP CLR SCL SJMP WLP1
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 ;名称:RDBYTE ;描述:读取字节子程序,读出的数据存放在ACC
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: 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 ;名称:IWRNBYTE ;描述:向器件指定子地址写N个数据 ;入口参数:器件地址字SLA,子地址SUBA,发送数据缓冲区MTD,发送字节数NUMBYTE
WRDA: MOV A,@R1 LCALL WRBYTE ;开始写入数据 LCALL CACK JNB ACK,IWRNBYTE INC R1 DJNZ R3,WRDA ;判断是否写完 RETWRN: LCALL STOP RET
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 ;名称:IRDNBYTE ;描述:从器件指定子地址读取N个数据 ;入口参数:器件地址字SLA,子地址SUBA,接收数据缓存区MRD,接收字节数NUMBYTE
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