实验二 I2C存储器实验重点讲义资料
- 格式:doc
- 大小:692.00 KB
- 文档页数:16
II22CC总线扩展实验06300720040夏晓天电子信息科学与技术【预习报告】一.实验目的掌握基于MCS-51系统的I2C总线扩展的方法二.实验内容1.利用MCS-51系统的P1口模拟I2C总线接口,扩展串口存储器24C16,每次存入1个数据,并反复读回,用示波器测试读回的波形。
(分别以数据AAH,55H测试)2.将MCS-51系统片内存储器的10个数据存入串口存储器24C16并读回,分别设置存入的地址为页地址+00H和页地址+07H。
读回为地址页地址+00H,将读回的数据存放在片内存储器,并与发送数据进行比较。
三.电原理图和程序清单8-4-1.硬件连接图:程序清单:ORG 0000HAJMP MAINORG 0030HMAIN:SCL EQU P1.0SDA EQU P1.1MRD EQU 40H;发送部分SNDN: LCALL START ;启动MOV A,#0A0H ;发控制字,写LCALL SEND ;发送LCALL CACK ;检查应答位JB F0,SNDN ;非正常应答则重新发送 MOV A,#00H ;发送地址LCALL SEND ;发送LCALL CACK ;检查应答位JB F0,SNDN ;非正常应答则重新发送 MOV A,#0AAH ;发送数据LCALL SEND ;发送LCALL CACK ;检查应答位JB F0,SNDN ;非正常应答则重新发送 LCALL STOP ;停止LCALL DELAY2 ;延迟一段时间再读回;接收部分REVN: LCALL START ;启动MOV A,#0A0H ;发控制字,写LCALL SEND ;发送LCALL CACK ;检查应答位JB F0,REVN ;非正常应答则重新发送 MOV A,#00H ;发送地址LCALL SEND ;发送LCALL CACK ;检查应答位JB F0,REVN ;非正常应答则重新发送 LCALL START ;再次启动MOV A,#0A1H ;发控制字,读LCALL SEND ;发送LCALL ACKS ;发送应答位LCALL REV ;接收MOV MRD,A ;接收的数据存放在40H LCALL NACKS ;发送非应答位LCALL STOP ;停止SJMP REVN ;再次接收;启动信号传递START:SETB SDANOPSETB SCLLCALL DELAYCLR SDALCALL DELAYCLR SCLNOPRET;停止信号传递STOP: CLR SDANOPNOPSETB SCLLCALL DELAYSETB SDALCALL DELAY;CLR SDA;CLR SCLRET;发送一个字节SEND: MOV R0,#08H ;8位数据长度送R0WLP: RLC A ;发送数据左移,使发送位入C JC WR1 ;判断发送为1还是0,发送1转WR1 AJMP WR0 ;发送0转WR0WLP1: DJNZ R0,WLP ;8位是否发送完?未完转WLPRET ;8位发送完结束WR1: SETB SDA ;发送1程序段NOPSETB SCLLCALL DELAYCLR SCL;CLR SDAAJMP WLP1WR0: CLR SDA ;发送0程序段NOPSETB SCLLCALL DELAYCLR SCLAJMP WLP1;接收一个字节REV: MOV R0,#08H ;8位数据长度入R0REV0: SETB SDA ;置VSDA为输入方式NOPSETB SCL ;使VSDA上数据有效NOPMOV C,SDA ;读入VSDA引脚状态MOV A,R2 ;读入0程序段,由C拼装入R2中 CLR SCL ;使VSCL=0可继续接收数据位RLC AMOV R2,ALCALL DELAYDJNZ R0,REV0 ;8位是否读完?未读完转RLPRET;发送应答位ACKS: CLR SDANOPNOPSETB SCLLCALL DELAYCLR SCLNOPNOP;SETB SDARET;发送非应答位NACKS:SETB SDANOPNOPSETB SCLLCALL DELAYCLR SCLNOPNOP;CLR SDARET;检查应答位CACK: SETB SDA ;置VSDA为输入方式NOPNOPSETB SCL ;使VSDA上数据有效CLR F0 ;预设F0=0NOPNOPMOV C,SDA ;输入VSDA引脚状态JNC CEND ;检查VSDA状态,正常应答转CEND,且F0=0 SETB F0 ;无正常应答,F0=1CEND: NOPCLR SCL ;子程序结束,使VSCL=0NOPRET;延时DELAY: NOPNOPNOPNOPRET;延时2DELAY2:MOV R6,#0FFHDEL1: MOV R7,#0FFHD EL2: DJNZ R7,DEL2DJNZ R6,DEL1RETEND8-4-2.硬件连接图:程序清单:ORG 0000HAJMP MAINORG 0030HMAIN:SCL EQU P1.0SDA EQU P1.1MTD EQU 30HMRD EQU 40HMOV R0,#0AHMOV R1,#30HMOV A,#00HSTR: MOV @R1,A ;0~9分别存放在30H~39H INC R1INC ADJNZ R0,STR;发送部分1MOV R1,#30HMOV R0,#0AHSNDN1: LCALL START ;启动MOV A,#0A0H ;发控制字,写LCALL SEND ;发送LCALL CACK ;检查应答位JB F0,SNDN1 ;非正常应答则重新发送 MOV A,#00H ;发送地址LCALL SEND ;发送LCALL CACK ;检查应答位JB F0,SNDN1 ;非正常应答则重新发送L1: MOV A,@R1 ;取发送数据LCALL SEND ;发送LCALL CACK ;检查应答位JB F0,SNDN1 ;非正常应答则重新发送INC R1DJNZ R0,L1 ;未发完10个数据则转L1 LCALL STOP ;停止LCALL DELAY2 ;延迟一段时间再读回;发送部分2MOV R1,#30HMOV R0,#0AHSNDN2: LCALL START ;启动MOV A,#0A0H ;发控制字,写LCALL SEND ;发送LCALL CACK ;检查应答位JB F0,SNDN2 ;非正常应答则重新发送MOV A,#00H ;发送地址LCALL SEND ;发送LCALL CACK ;检查应答位JB F0,SNDN2 ;非正常应答则重新发送L2: MOV A,@R1 ;取发送数据LCALL SEND ;发送LCALL CACK ;检查应答位JB F0,SNDN2 ;非正常应答则重新发送INC R1DJNZ R0,L2 ;未发完10个数据则转L1LCALL STOP ;停止LCALL DELAY2 ;延迟一段时间再读回;接收部分MOV R1,#40HMOV R0,#14HREVN: LCALL START ;启动MOV A,#0A0H ;发控制字,写LCALL SEND ;发送LCALL CACK ;检查应答位JB F0,REVN ;非正常应答则重新发送MOV A,#00H ;发送地址LCALL SEND ;发送LCALL CACK ;检查应答位JB F0,REVN ;非正常应答则重新发送LCALL START ;再次启动MOV A,#0A1H ;发控制字,读LCALL SEND ;发送LCALL ACKS ;发送应答位L3: LCALL REV ;接收LCALL ACKS ;发送应答位MOV @R1,A ;接收数据存放在40H~49H INC R1DJNZ R0,L3 ;未接收完10个数据则转L3 LCALL NACKS ;发送非应答位LCALL STOP ;停止HE : SJMP HE;启动信号传递START:SETB SDANOPSETB SCLLCALL DELAYCLR SDALCALL DELAYCLR SCLNOPRET;停止信号传递STOP: CLR SDANOPNOPSETB SCLLCALL DELAYSETB SDALCALL DELAY;CLR SDA;CLR SCLRET;发送一个字节SEND: MOV R0,#08H ;8位数据长度送R0WLP: RLC A ;发送数据左移,使发送位入CJC WR1 ;判断发送为1还是0,发送1转WR1 AJMP WR0 ;发送0转WR0WLP1: DJNZ R0,WLP ;8位是否发送完?未完转WLPRET ;8位发送完结束WR1: SETB SDA ;发送1程序段NOPSETB SCLLCALL DELAYCLR SCL;CLR SDAAJMP WLP1WR0: CLR SDA ;发送0程序段NOPSETB SCLLCALL DELAYCLR SCLAJMP WLP1;接收一个字节REV: MOV R0,#08H ;8位数据长度入R0REV0: SETB SDA ;置VSDA为输入方式NOPSETB SCL ;使VSDA上数据有效NOPMOV C,SDA ;读入VSDA引脚状态MOV A,R2 ;读入0程序段,由C拼装入R2中CLR SCL ;使VSCL=0可继续接收数据位RLC AMOV R2,ALCALL DELAYDJNZ R0,REV0 ;8位是否读完?未读完转RLPRET;发送应答位ACKS: CLR SDANOPNOPSETB SCLLCALL DELAYCLR SCLNOPNOP;SETB SDARET;发送非应答位NACKS:SETB SDANOPNOPSETB SCLLCALL DELAYCLR SCLNOPNOP;CLR SDARET;检查应答位CACK: SETB SDA ;置VSDA为输入方式NOPNOPSETB SCL ;使VSDA上数据有效CLR F0 ;预设F0=0NOPNOPMOV C,SDA ;输入VSDA引脚状态JNC CEND ;检查VSDA状态,正常应答转CEND,且F0=0 SETB F0 ;无正常应答,F0=1CEND: NOPCLR SCL ;子程序结束,使VSCL=0NOPRET;延时DELAY: NOPNOPNOPNOPRET;延时2DELAY2:MOV R6,#0FFHDEL1: MOV R7,#0FFHD EL2: DJNZ R7,DEL2DJNZ R6,DEL1RETEND【实验报告】 一.修改后的电原理图(不需修改,见预习报告)二.修改后的程序清单:8-4-1.(不需修改,见预习报告)三.实验结果和数据8-4-1.示波器测试的读回的波形:波形分析:由于一个读回周期比较长,所以波形分成四段才能看完整。
单片机汇编实验六:I2C串行总线存储器读写实验实验要求:由AT89S52 内部定时器1,按方式1 工作,每1 秒钟24C02的0001H 单元内容加2,以键盘作为外部中断输入信号,有键按下时,读取0001H 单元内容并由LED 显示。
//This is the sixthprogramof the homework;//Name :Wang Qi Date:2013/3/11 北京化工大学自实1001 SDA EQU P2.0 SCL EQU P2.1 ORG 0000H //主函数入口SJMP MAIN ORG 0013H //外部中断1 入口LJMP WZD0 ORG 001BH //计时器1 入口LJMP WT1 ORG 0050HMAIN: MOV SP,#60H MOV TMOD,#10H //设置T1 工作方式MOV TH1,#4CH //设初值MOV TL1,#00H MOV R7,#10 //计数器SETB EA //全局中断SETB ET1 //允许定时器1 SETB TR1 //启动定时器1 SETB IT1 //外部中断跳变触发方式SETB EX1 //允许外部中断1OK: MOV C,P3.4 //扫描键盘JNC OK1 MOV C,P3.5 JNC OK1 MOV C,P3.6 JNC OK1 MOV C,P3.7 JNC OK1 SJMP OKOK1: CLR P3.3 //中断信号SETB P3.3 SJMP OKWZD0: SETB P3.3 //中断程序PUSH TH1 //保护现场PUSH TL1CLR TR1 //停止T1 计数MOV R2,#01H CALL DU MOV P1,R3POP TL1POP TH1SETB TR1RETIWT1: MOV TH1,#4CH //定时函数MOV TL1,#00H DJNZ R7,RET0 MOV R7,#10 //1 秒到来了INC 30H INC 30H mov R2,#01H MOV R3,30H CALL XIERET0: RETI//////////////I2C 协议摘自网络Thanks to the authorXIE: //写数据子程序,R2 是要写入的24c02 的字节位置地址,R3 是要写入的内容LCALL STAR;起始条件MOV A,#10100000B //寻址24C02 的总线硬件地址并使用写入命令LCALL SDATA //传输数据A 给24C02MOV A,R2 //确定要写入的字节位置地址LCALL SDATA //传输数据A给24C02MOV A,R3 //把数据R3 写入刚指定的字节地址LCALL SDATA //传输数据A 给24C02LCALL STOP //写入结束LCALL CHULI //提供2ms 给24C02。
1 概述I2C总线以2根信号线(数据线SDA,时钟线SCL)实现双向同步数据传,并且可以连接到总线上的任何一个器件作为一个发送器或接收器。
执行数据传输时可以当作主机或从机。
发送器:传送中发送数据到总线的器件接收器:传送中从总线接收数据的器件主机:用来初始化发送、产生时钟信号和终止发送的器件,可是发送器或接收器从机:被主机寻址的器件,也可以作为发送器或接收器LPC1700有三个接口:I2C0/1/2。
I2C0为标准I2C总线接口(开漏引脚),该接口支持I2C规范中所叙述的功能,运行速度高达1MHz。
支持多主机操作,并允许挂接在I2C总线上运行器件在退出I2C总线功能时掉电;而I2C1和I2C2使用标准I/O引脚,专用于单主机I2C总线,不支持挂接在I2C总线上的运行器件在退出I2C总线功能时掉电,也不支持多主机I2C操作。
三个接口在标准模式下,总线数据传输的速度为0到100Kbit/s;高速模式下的为0到400Kbit/s;总线速率越高,总线上拉电阻要越小。
注意的是只有I2C0总线支持快速plus模式,速度可达1Mbit/s,可通过设置CPADCFG寄存器里的SDADRV0和SCLDRV0来实现。
2 总线特性:标准的I2C总线接口;可配置为主机、从机或主/从机;可编程时钟能够实现通用速率控制;主从之间双向数据传输;多主机总线;通信速率高达1MHZ(快速模式);支持监控模式;只能基于版内通信;3 传输协议(1)寻址字节主机产生起始信号后,发送的第一个字节为寻址字节。
前7位为从机地址,最低位决定报文方向:0表示主机写信息到从机,1表示主机读从机中的信息。
(2)传输格式主机产生起始信号后,发送一个寻址字节,收到应答后紧跟着的就是数据传输,数据传输一般由主机产生的停止位终止。
如果主机仍希望在总线上通讯,它可以产生重复起始信号和寻址另一个从机,而不是首先产生一个停止信号。
4 基本配置利用以下寄存器来配置I2C0/1/2接口:(1)电源:在寄存器PCONP中置位PCI2C0/1/2;(2)时钟:在寄存器PCLK_SEL0中选择PCLK_I2C0;在寄存器PCLK_SEL1中选择PCLK_I2C1/2(3)引脚:通过寄存器PINSEL使能I2C0引脚和选择I2C1/2引脚。
EEPROMI2C操作说明EEPROM (Electrically Erasable Programmable Read-Only Memory)是一种非易失性存储器,可以通过电子方式擦除和编程,同时可以通过I2C总线进行操作。
本文将详细介绍EEPROM的I2C操作说明。
I2C(Inter-Integrated Circuit)是一种串行通信接口协议,可以在多个设备之间进行通信。
在EEPROM的I2C操作中,需要了解以下几个重要的概念和步骤。
1.设备地址:每个通过I2C连接的设备都有一个唯一的设备地址。
在EEPROM的I2C操作中,需要使用设备地址来与EEPROM进行通信。
2.起始条件和停止条件:I2C通信中,起始条件表示通信的开始,停止条件表示通信的结束。
起始条件由一个高电平到低电平的SCL上升沿和一个低电平的SDA下降沿组成,停止条件由一个低电平到高电平的SCL上升沿和一个高电平的SDA上升沿组成。
3. 数据传输:I2C通信中,数据可以以字节的形式进行传输。
每个字节由8个bit组成,包括7个数据位和1个校验位。
在进行EEPROM的I2C操作时,通常需要经过以下几个步骤:1.发送起始条件:将SCL和SDA引脚拉高,然后将SDA引脚拉低,形成起始条件。
2.发送设备地址和写命令:根据EEPROM的设备地址,将设备地址和写命令(0)发送到SDA引脚。
3.发送要写入的地址:将要写入数据的地址发送到SDA引脚。
4.发送数据:将要写入的数据发送到SDA引脚。
5.发送停止条件:将SCL引脚拉高,然后将SDA引脚拉高,形成停止条件。
实际的EEPROM的I2C操作可能还包括以下一些操作:1.读操作:通过发送读命令(1)和读取数据的地址,可以从EEPROM 中读取数据。
读操作与写操作类似,只是需要在发送设备地址时,将写命令(0)改为读命令(1)。
2.擦除操作:EEPROM的主要特点之一是可以擦除数据。
通过发送擦除命令和要擦除的数据的地址,可以将指定数据段擦除为初始值。
i2c通信的详细讲解I2C(全称Inter-IntegratedCircuit)是一种基于两线式总线系统,可以利用它让一台机器和另一台机器或者一个器件与另一个器件之间建立通信连接。
它由一个多晶片系统(Multi-Chip System)所创造出来,可以减少实现多晶片系统的内部连接的数量,从而减少印制电路板的体积。
它允许多达127个从设备以最低物理开销(Low Physical Overhead)与一个主设备连接,具有低成本和高可靠性,现已成为很多类型的微控制器(Microcontroller)和处理器(Processors)的标准总线,应用非常广泛。
1. I2C概述I2C从最初的Philips经过20多年的发展,已经成为一种横跨多个行业的解决方案。
它可以在不同的系统上提供高性能片上系统(System-on-a-Chip,SoC)间的通信和协调,支持多达127的电子设备连接。
主要由两条信号线,称为SDA(Data Line)和SCL(Clock Line)构成,它们分别连接电子设备的数据和时钟,每个设备还有一个物理上的地址,用于标识彼此来进行通信。
I2C总线具有速度快、低功耗、简单易用等优点,现在已经被应用在系统和高速处理器、传感器、可编程逻辑器件(PLD)、多媒体设备、电源管理、液晶/LED等多个行业中。
2. I2C通信原理I2C通信可以说是一种异步通信方式,它是一种时钟控制的异步通信方式,发送一个字节,都要经过下面几个步骤:(1)发送起始条件:S(Start):该条件由SDA和SCL电平组合构成,SDA在SCL电平为高时从高电平变低电平。
(2)发送设备地址:在I2C总线上,设备都会有自己的地址,每个设备可以收发多个字节,这样就可以确定设备的身份。
(3)发送控制位:也称命令位,它用于确定主设备发送的是某种命令,比如写入数据,读取数据,还是其它的控制信息。
(4)发送数据:数据由SDA高低电平传输,而SDA电平的变化必须在SCL的上升沿才能有效。
关于I2C通讯的资料,网络上很多,多了我这篇也不多,我也很想对i2c和 ATMEIL 发表一点什么。
关于I2C:1.空闲时候,SDA,SCL都是保持高电平,因此stop信号后,保持SDA,SCL,释放总线。
2.开始信号是:在SCL高电平时候,SDA跳变为低;结束信号:在SCL高电平时候,SDA跳变为高。
3.信号发送:主机在SCL低电平期间准备好要发送的bit,赋值给SDA,在SCL由低变高后的一段时间内写入从机。
4.信号接受:主机释放总线(置为高电平),从机在SCL低电平期间已经准备好SDA的bit 数据,主机只需要在SCL由低变高一段时间后读取数据。
5.应答:主机发送8bit后,释放总线,SCL由低变高后,可以读取从机发送的应答信号(应答用0表示,无应答用1表示),收到应答信号后,SCL应该拉低;主机接受8bit后,应该发送应答信号0(24c02要求最后一次读取8bit数据后无须发送应答0,须发送1),从机在SCL由低变高后一段时间内读取应答信号。
关于ATMEL 24C02:1.用EEPROM保存数据最大的好处是不占用CPU时间,不会让CPU、中断等暂停,而用片内的flash存储数据,会导致cpu暂停,中断暂停,严重影响程序效果。
2.数据保存需要时间,这个时间内不可以对同一个24c02进行写保存数据操作(这段时间内是否能读?没有测试过),单字节写入和页写入,需要的保存时间一样,官方说不超过5ms,实测不足1ms。
相对于单字节写入,页写入效率更高。
3.关于WP写保护功能,WP高电平可以正常读数据,但是不能读。
WP低电平可以读写。
那么,是否是数据保存延时的期间WP也需要保持低电平呢?答案是否定的,也就是说,I2C通讯完成,即可WP=1,再继续延时5ms,数据成功写入,亲测有效!4.读数据时候,一定在stop信号前一个byte后发送无应答信号(即1),其他读byte后发送应答信号(即0);以下程序:1.适用于于多个i2c端口,如同时挂led显示,24c02等多个不能用寻址来区别的系统。
1.what is I2C?简单讲就是用来传输数据的两根线:一根数据线(SDA)一根时钟线(SCL)2.I2C怎么传输的?(1)基本过程:1.主机发出开始信号2.主机接着发出一字节的从机地址信息,其中最低位为读写控制码(1为读、0为写)高七位为从机器件地址3.从机发出认可信号4.主机开始发送信号,每发完一字节后,从机发出认可信号给主机5.主机发出停止信号(2)对以上信号的具体说明:开始信号:在时钟线为高电平期间,数据线由高变低,将产生一个开始信号停止信号:在时钟线为高电平期间,数据线由低变高,将产生一个停止信号应答信号:即认可信号,主机写从机时,每写完一个字节,如果正确从机将在下一个时钟周期将数据线拉低,以告诉主机操作有效。
在主机读从机的时候,正确读完一个字节后,主机在下一个时钟周期同样也要将数据线拉低,发出认可信号,告诉从机所发数据已经收妥(注:读从机时主机在最后一个字节数据接收完后,不发应答,直接发停止信号)注意:任何在时钟线为高电平期间的数据线上的电平改变都被认为是起始和停止信号,所以数据改变必须要在时钟为低电平时改变。
(3)数据格式:I2C支持两种数据格式:7bit/10bit寻址数据格式7bit/10bit寻址和重复开始信号的格式从设备地址:总线上每个设备都有自己的一个addr,共7个bit,广播地址全0.系统中可能有多个同种芯片,为此addr分为固定部分和可编程部份,细节视芯片而定,看datasheet。
硬件结构:每一个I2C总线器件内部的SDA、SCL引脚电路结构都是一样的,引脚的输出驱动与输入缓冲连在一起。
其中输出为漏极开路的场效应管、输入缓冲为一只高输入阻抗的同相器。
这种电路具有两个特点:(1)由于 SDA、SCL 为漏极开路结构,借助于外部的上拉电阻实现了信号的“线与”逻辑;(2)引脚在输出信号的同时还将引脚上的电平进行检测,检测是否与刚才输出一致。
为“时钟同步”和“总线仲裁”提供硬件基础。
I2C参数什么是I2C?I2C(Inter-Integrated Circuit)是一种串行通信协议,用于在集成电路(IC)之间进行数据传输。
它由飞利浦(Philips)开发,用于简化电子设备之间的通信。
I2C是一种双向通信协议,允许多个设备通过共享总线进行通信。
I2C总线结构I2C总线由两根信号线组成:SCL(Serial Clock)和SDA(Serial Data)。
SCL线用于传输时钟信号,而SDA线用于传输数据。
所有的I2C设备都通过这两根线连接到总线上。
在I2C总线中,有两个重要的角色:主设备(Master)和从设备(Slave)。
主设备负责控制总线上的通信,从设备则被动地响应主设备的指令。
I2C参数详解在使用I2C协议进行通信时,有几个重要的参数需要考虑:1. 速率(Speed)I2C总线的速率是指数据传输的速度,通常以Kbps(千位每秒)为单位。
速率越高,数据传输的速度越快,但同时也会增加总线的噪声和功耗。
常见的速率有100Kbps、400Kbps和1Mbps。
2. 地址(Address)每个I2C设备都有一个唯一的地址,用于在总线上识别设备。
地址可以是7位或10位,取决于设备的支持。
7位地址可以支持最多128个设备,而10位地址可以支持最多1024个设备。
3. 时钟频率(Clock Frequency)时钟频率是指I2C总线的时钟信号的频率。
它决定了数据传输的速度。
时钟频率可以通过调整主设备的时钟发生器来设置,通常以Hz(赫兹)为单位。
常见的时钟频率有100kHz、400kHz和1MHz。
4. 读写位(Read/Write Bit)I2C通信中的每个数据传输都包含一个读写位,用于指示主设备是要读取数据还是写入数据。
读写位为0表示写入数据,为1表示读取数据。
5. 数据位(Data Bits)数据位指的是传输的数据位数。
在I2C通信中,每个数据字节都由8个数据位组成。
数据位的长度取决于设备的要求。
I2C存储器实验 实验目的 1、了解I2C总线的工作原理 2、掌握I2C总线驱动程序的设计和调试方法 3、掌握I2C总线存储器的读写方法 实验仪器 单片机开发板、稳压电源、计算机 实验原理 1、 I2C总线常识 I2C总线采用一个双线式漏极开路接口,可在一根总线上支持多个器件和主控器。所连接的器件只会把总线拉至低电平,而决不会将其驱动至高电平。总线在外部通过一个电流源或上拉电阻器连接至一个正电源电压。当总线空闲时,两条线路均为高电平。在标准模式中,I2C 总线上的数据传输速率高达100kbit/s,而在快速模式中则高达400kbit/s。 I2C总线上的每个器件均由一个存储于该器件中的唯一地址来识别,并可被用作一个发送器或接收器(视其功能而定)。除了发送器和接收器之外,在执行数据传输时,还可把器件视作主控器或受控器。主控器是负责启动总线上的数据传输并生成时钟信号以允许执行该传输的器件。同时,任何被寻址的器件均被视作受控器。 CAT24WC01/02/04/08/16是一个1K/2K/4K/8K/16K位串行CMOS EEPROM,内部含有128/256/512/1024/2048个8位字节,CATALYST公司的先进CMOS技术实质上减少了器件的功耗,CAT24WC01有一个8字节页写缓冲器,CAT24WC02/04/08/16有一个16字节页写缓冲器,该器件通过I2C总线接口进行操作,有一个专门的写保护功能,并且器件能与400KHzI2C总线兼容。 引脚名称和功能如图1所示。
图1 24系例I2C存储器引脚说明 通过器件地址输入端A0、A1和A2可以实现将最多8个24WC01和24WC02器件4个24WC04器件,2个24WC08器件和1个24WC16器件连接到总线上。 2、I2C总线协议 (1)只有在总线空闲时才允许启动数据传送。 (2)在数据传送过程中,当时钟线为高电平时,数据线必须保持稳定状态,不允许有 跳变。时钟线为高电平时,数据线的任何电平变化将被看作总线的起始或停止信号。 (3)起始信号 时钟线保持高电平期间,数据线电平从高到低的跳变作为I2C 总线的起始信号。 (4) 停止信号 时钟线保持高电平期间,数据线电平从低到高的跳变作为I2C 总线的停止信号。 I2C 总线时序:
I2C 总线时序图 I2C总线启动停止信号波形:SCL为高电平,SDA降沿为启动信号;SCL为高电平,SDA上升沿为停止信号。
I2C 总线启动停止信号 I2C总线写周期波形:SCL正脉冲锁存数据,或SCL为高电平数据有效。SCL高电平期间SDA数据应保持不变。
I2C 总线写时序波形 I2C总线应答信号波形:I2C总线数据传送时,每成功地传送一个字节数据后,接收器都必须产生一个应答信号。应答的器件在第9个时钟周期时将SDA线拉低,表示其已收到一个8 位数据。
I2C 总线读时序 3、24C系列存储器读写操作 (1)24系列常用存储器器件地址安排
24系例存储器器件地址安排 (2)字节写操作 在字节写模式下,主器件发送起始命令和从器件地址信息(R/W位置零)给从器件,在从器件产生应答信号后,主器件发送CAT24WC01/02/04/08/16的1字节地址(存储容量大的存储器字节地址两字节),主器件在收到从器件的另一个应答信号后,再发送数据到被寻址的存储单元。CAT24WC01/02/04/08/16再次应答,并在主器件产生停止信号后,开始内部数据的擦写,在内部擦写过程中从器件不再应答主器件的任何请求(10ms)。如图所示。
字节写操作数据帧结构 (3)页写操作(提高写入速度) 根据页缓冲区的大小,页写的字节数不能超过缓冲区大小。如果在发送停止信号之前主器件发送超过缓冲区大小,地址计数器将自动翻转,先前写入的数据被覆盖。如图所示。
页写操作数据帧结构 (4)当前地址读操作 当读取一个字节数据后,存储器内部地址计数器加1。当读到最后一字节时,计数器将翻转到0且继续输出数据。CAT24WC01/02/04/08/16 接收到从器件地址信号后(R/W 位置1),它首先发送一个应答信号,然后发送一个8位字节数据。主器件产生一个非应答信号(这里是主器件发送的非应答信号),再产生一个停止信号。如图所示。 当前地址读操作数据帧结构 (5)任意地址读操作、连续读操作
任意地址读、连续读操作数据帧结构 4、 I2C总线存储读写程序设计 I2C总线存储器读写程序分为两层:硬件接口程序和存储器读写程序。其中硬件接口程序有:总线启动、停止、发数据、收数据、发响应、发非响应、读从器件响应状态等。存储器读写程序有:单字节写数据、页写数据、当前地址读数据、任意地址读数据、连续读数据等。 参考上面的时序图设计硬件接口相关子程序。
I2C总线接口程序流程图
I2C总线数据读写流程图 存储器读写程序设计。这里以单字节读、写程序为例说明,其它子程序由读者自行设计。
I2C存储器单字节读写流程图 实验参考程序: /****************************************************************************** 普中科技 -------------------------------------------------------------------------------- * 实 验 名 : 24C02EEPROM存储试验 * 实验说明 : 使用LCD1602显示写入的数据和读出的数据 * 连接方式 : 见连接图 * 注 意 : ******************************************************************************/ #include #include"i2c.h" #include"lcd.h"
//--定义使用的IO口--// //数码管IO #define GPIO_DIG P0 sbit LSA=P2^2; sbit LSB=P2^3; sbit LSC=P2^4; //按键IO sbit K1=P3^0; sbit K2=P3^1; sbit K3=P3^2; sbit K4=P3^3;
//--定义全局变量--// unsigned char wordCode0[6] = "write:"; unsigned char wordCode1[6] = " read:";
//--声明全局函数--// void At24c02Write(unsigned char ,unsigned char ); unsigned char At24c02Read(unsigned char ); void Delay10ms(unsigned int c); //误差 0us
/****************************************************************************** * 函数名 : main * 函数功能 : 主函数 * 输入 : 无 * 输出 : 无 ******************************************************************************/
void main() { unsigned int num0 = 0,num1 = 0,n;
LcdInit(); LcdWriteCom(0x80); for(n=0; n<6; n++) { LcdWriteData(wordCode0[n]); } LcdWriteCom(0x80 + 0x40); for(n=0; n<6; n++) { LcdWriteData(wordCode1[n]); } while(1) { if(K1 == 0) //按键1按下 { Delay10ms(1); if(K1 == 0) At24c02Write(2,num0); while((n < 50)&&(K3==0)) { n++; Delay10ms(1); } n=0; n=0; }
if(K2 == 0) //按键2按下 { Delay10ms(1); if(K2 == 0) num1 = At24c02Read(2); while((n < 50)&&(K2 == 0)) { n++; Delay10ms(1); } n=0; } if(K3 == 0) //按键3按下 { Delay10ms(1); if(K3 == 0) num0++; while((n < 50)&&(K3 == 0)) { n++; Delay10ms(1); } n=0; if(num0==256) num0=0; }
if(K4 == 0) //按键4按下 { Delay10ms(1); if(K4 == 0) num0 = 0; while((n < 50) && (K4 == 0)) { n++; Delay10ms(1); } n=0; }
LcdWriteCom(0x87); LcdWriteData('0' + (num0/1000));//千位 LcdWriteData('0' + (num0%1000/100));//百位 LcdWriteData('0' + (num0%1000%100/10));//十位 LcdWriteData('0' + (num0%1000%100%10));//个位
LcdWriteCom(0x87 + 0x40); LcdWriteData('0' + (num1/1000));//千位 LcdWriteData('0' + (num1%1000/100));//百位 LcdWriteData('0' + (num1%1000%100/10));//十位 LcdWriteData('0' + (num1%1000%100%10));//个位
} }
/****************************************************************************** * 函 数 名 : Delay10ms