I2C总线读写E2PROM

发布者:玉树琼花最新更新时间:2015-10-28 来源: eefocus关键字:I2C  总线读写  E2PROM 手机看文章 扫描二维码
随时随地手机看文章
这一篇介绍I2C存储器的使用。主要是介绍AT24CXX系列器件,它分为两类,主要是通过被存储容量地址来分的,一类是AT24C02-AT24C16,它的存储容量从256字节到2048字节。另一类是AT24C32-AT24C1024,容量从4K-128K。(理论上好像可以达到最高512K字节容量,但现在网上最高也就能看到AT24C1024也就是128K字节容量)

原理:
  I2C总线是一种用于IC器件之间连接的二线制总线。它通过SDA(串行数据线)及SCL(串行时钟线)两根线在连到总线上的器件之间传送信息,并根据地址识别每个器件:不管是单片机、存储器、LCD驱动器还是键盘接口。
I2C总线接口电路结构如图所示。

9.串行I2C总线E2PROM AT24CXXX的应用1 - 哥只是传说 - 我只是一个传说


SDA和SCL均为双向I/O线,通过上拉电阻接正电源。当总线空闲时,两根线都是高电平。连接总线的器件的输出级必须是集电极或漏极开路,以具有线“与”功能。I2C总线的数据传送速率在标准工作方式下为100kbit/s,在快速方式下,最高传送速率可达400kbit/s。
  在I2C总线技术规范中,开始和结束信号(也称启动和停止信号)的定义如图所示。当时钟线SCL为高电平时,数据线SDA由高电平跳变为低电平定义为“开始”信号;当SCL线为高电平时,SDA线发生低电平到高电平的跳变为“结束”信号。开始和结束信号都是由主器件产生。在开始信号以后,总线即被认为处于忙状态;在结束信号以后的一段时间内,总线被认为是空闲的。

9.串行I2C总线E2PROM AT24CXXX的应用1 - 哥只是传说 - 我只是一个传说

I2C总线的数据传送格式是:在I2C总线开始信号后,送出的第一个字节数据是用来选择从器件地址的,其中4-7位为器件码,如1010就是代表串行E2PROM器件。1-3位为存储器的片选地址或存储器内的块地址码,如何区分?后面再做详细说明,第8位为方向位(R/W)。方向位为“0”表示发送,即主器件把信息写到所选择的从器件;方向位为“1”表示主器件将从从器件读信息。开始信号后,系统中的各个器件将自己的地址和主器件送到总线上的地址进行比较,如果与主器件发送到总线上的地址一致,则该器件即为被主器件寻址的器件,其接收信息还是发送信息则由第8位(R/W)确定。
一个字节的写操作的过程:首先器件发出起始信号后,发送器件识别控制字节,即1010A2A1A00(最低位置0,即R/W读写控制位为低电平0),然后等待应答信号指示从器件被寻址。再发送一个AT24CXX存储器将要写入的位置地址。再次等待AT24CXX应答信号以后,将发送数据字节,AT24CXX接收到后写入到刚刚指定的存储器地址。然后主器件再次等待AT24CXX的应答信号。主器件最后发出停止信号。
  在I2C总线上每次传送的数据字节数不限,但每一个字节必须为8位,而且每个传送的字节后面必须跟一个认可位(第9位),也叫应答位(ACK)。数据的传送过程如图所示。每次都是先传最高位,通常从器件在接收到每个字节后都会作出响应,即释放SCL线返回高电平,准备接收下一个数据字节,主器件可继续传送。如果从器件正在处理一个实时事件而不能接收数据时,(例如正在处理一个内部中断,在这个中断处理完之前就不能接收I2C总线上的数据字节)可以使时钟SCL线保持低电平,从器件必须使SDA保持高电平,此时主器件产生1个结束信号,使传送异常结束,迫使主器件处于等待状态。当从器件处理完毕时将释放SCL线,主器件继续传送。

9.串行I2C总线E2PROM AT24CXXX的应用1 - 哥只是传说 - 我只是一个传说

  当主器件发送完一个字节的数据后,接着发出对应于SCL线上的一个时钟(ACK)认可位,在此时钟内主器件释放SDA线,一个字节传送结束,而从器件的响应信号将SDA线拉成低电平,使SDA在该时钟的高电平期间为稳定的低电平。从器件的响应信号结束后,SDA线返回高电平,进入下一个传送周期。
  I2C总线还具有广播呼叫地址用于寻址总线上所有器件的功能。若一个器件不需要广播呼叫寻址中所提供的任何数据,则可以忽略该地址不作响应。如果该器件需要广播呼叫寻址中提供的数据,则应对地址作出响应,其表现为一个接收器。
  5.总线竞争的仲裁 总线上可能挂接有多个器件,有时会发生两个或多个主器件同时想占用总线的情况。例如,多单片机系统中,可能在某一时刻有两个单片机要同时向总线发送数据,这种情况叫做总线竞争。I2C总线具有多主控能力,可以对发生在SDA线上的总线竞争进行仲裁,其仲裁原则是这样的:当多个主器件同时想占用总线时,如果某个主器件发送高电平,而另一个主器件发送低电平,则发送电平与此时SDA总线电平不符的那个器件将自动关闭其输出级。总线竞争的仲裁是在两个层次上进行的。首先是地址位的比较,如果主器件寻址同一个从器件,则进入数据位的比较,从而确保了竞争仲裁的可靠性。由于是利用I2C总线上的信息进行仲裁,因此不会造成信息的丢失。

器件说明:
AT24CXXX系列引脚图如下

9.串行I2C总线E2PROM AT24CXXX的应用1 - 哥只是传说 - 我只是一个传说

现在我先来说说AT24CXX的具体使用
      假设用AT89S51的P0.0做SDA总线,P0.1做SCL总线。有若干个I2C器件挂接在SDA和SCL总线上。
现在要对E2PROM_01存储器进行写字节操作看看它是如何找到的。
上面说过在发送完一个开始信号后接着发送一个字节的器件识别信号。这一个字节的4-7位就是器件识别码。1010就是对应E2PROM器件,其它器件就不再理会了。1-3位是器件的物理地址,也就是说如果是E2PROM,它可以在I2C总线上挂接(000-111)8个E2PROM。在这里就得详细说说AT24CXX上的A0,A1,A2和这个器件识别字节之间的关系了。上面说过存储器的寻址范围是一个字节,也就256个,AT24C02的存储容量为256字字,刚刚好将一个字节的地址用完。器件电路上A0,A1,A2三个管脚通过接高电平或低电平来和AT89S51发送过来的器件识别控制字节相匹配,从而得以识别出AT89S51将要操作的那个存储器。现在AT24C04的容量是512个字节,那不是一个字节的地址不够用了吗?其实它是将512个字节为成两个页,每页256字节,而页地址就是器件识别控制字节的1位。前面说了这个1-3位不是和器件上的A0,A1,A2匹配来识别器件的吗?是的,但存储器容量超过256字节情况就有变了。AT24C04上的A0这时就废弃不用了,只用A1和A2,这样就只能接(00-11)四个AT24C04了,同样AT24C08容量为1K字节分为4页了,于是页地址就是器件识别控制字节的1-2位,器件上的A0,A1废弃不用,只用A2,就只能接两个AT24C08了。AT24C16容量为2K字节,分为8页。页地址是器件识别控制字节的1-3位,全用了。器件上的A0,A1,A2,就无效了,只能接一只AT24C16。

9.串行I2C总线E2PROM AT24CXXX的应用1 - 哥只是传说 - 我只是一个传说


我这么说能明白吗?

  对于大容量AT24C32-1024的存储器。器件的存储寻址地址为两个字节,所以它的一页为65536(64K)。AT24C32-64的容量为4K字节-8K字节,在一页范围,可以接8只器件。从AT24C128-1024的器件代号也由1010改为10100,多了一位,识别控制字节的器件物理地址就少了一位,变为1-2位,相应的在器件管脚上A2也废弃空着了,因此最多只能接四只器件。AT24C128-512只有两位器件地址所以最多只能接四只器件。而AT24C1024的容量为128K,分为两页,识别控制字节的的1位为页地址,器件的A0脚废弃不用,只用了A1。因此只能接2只器件。

9.串行I2C总线E2PROM AT24CXXX的应用1 - 哥只是传说 - 我只是一个传说
     下面我们进行具体的制做先准备好器件如下图 ,我用的是AT24C16

9.串行I2C总线E2PROM AT24CXXX的应用1 - 哥只是传说 - 我只是一个传说

原先的板子如下图

9.串行I2C总线E2PROM AT24CXXX的应用1 - 哥只是传说 - 我只是一个传说

焊好后。

 

9.串行I2C总线E2PROM AT24CXXX的应用1 - 哥只是传说 - 我只是一个传说

好!下面我们进行调试:插上主电源。但AT24C16的电源短路帽不接,在短路帽两个针之间接上万用表的电流档检查是否有短路和静态电流的大小。实测静态电流几乎为零,改变两个数据线的电平时,电流会有所上升,说明电路基本正常。

9.串行I2C总线E2PROM AT24CXXX的应用1 - 哥只是传说 - 我只是一个传说

现在我们接上电源短路帽把AT24C16电源接好。将两个数据线用跳线接到P1.6和P1.7口上(接到哪个口上可以自己选的)。注意分清哪个是SDA哪个是SCL。别弄错了。

9.串行I2C总线E2PROM AT24CXXX的应用1 - 哥只是传说 - 我只是一个传说


把LCD12864装上,后面我们就要进行软件的调试了。

9.串行I2C总线E2PROM AT24CXXX的应用1 - 哥只是传说 - 我只是一个传说

 


关键字:I2C  总线读写  E2PROM 引用地址:I2C总线读写E2PROM

上一篇:标记的用法,用一个按键控制1个LED灯的亮灭,按键去抖
下一篇:I2C总线读写E2PROM

推荐阅读最新更新时间:2024-03-16 14:37

I2C总线信号传送格式
  主控器与被控器之间在总线上进行的一次数据传输称为一帧。按I2C总线规范的约定,一帧信号由启动信号、寻址字节、若干个数据字节、停止信号以及重启动信号组成。 启动信号表示一帧信号的开端,紧随其后的寻址字节包含着7位地址码和位读/写控制位R/W,在寻址字节之后是按R/W约定的读或写操作的数据字节和应答位。一帧结束时,主控器必须发送一个停止信号。 在I2C总线上进行的通信活动的典型信号格式有以下3种。 ①主控器向被控器写数据。 主控器向被寻址的被控器发送n个数据字节,在整个数据传输过程中,传输方向不变,其信号传输格式如1所示。    图1 主控器向被控器写数据    ②主控器从被控器读数据。
[嵌入式]
STM32开发板- I2C--24Cxx
我们所用来示范的24Cxx系列是最常用的EEPROM芯片。 前面提到了一个地址码, 24Cxx的地址码是固定的, 8位如下: 1 0 1 0 A2 A1 A0 0 A2 A1 A0分别是它三个管脚的电平 24Cxx 理解起来有一个特别之处。 24Cxx 包括 01/02/04/08/16 四种,容量关系刚好和数字一样。1K 2K 4K 8K 16K 24C02 最为常见, 它的三个地址管脚A2 A1 A0都是可用的, A2 A1 A0 有8中电平组合,也就是说,可以有8个 24C02 挂载同一个I2C总线上。 24C04呢, A0管脚就失效了,只有A2 和 A1 有用,四种组合,最多有4个24C04在总线上, 以此类推。2
[单片机]
STM8 I2C从模式
STM8 I2C从模式 为了产生正确的时序,必须在I2C_FREQR寄存器中设定该模块的输入时钟。输入时钟的频率必须至少是: 标准模式下为:1MHz 快速模式下为:4MHz 一旦检测到起始条件,在SDA线上接收到的地址被送到移位寄存器。然后与STM8芯片自己的地址OARLSB和OAR2或者广播呼叫地址(如果ENGC=1)相比较。 注:在10位地址模式时,比较包括头段序列(11110xx0),其中的xx是地址的两个最高有效位。 头段或地址不匹配:I2C接口将其忽略并等待另一个起始条件。 头段匹配(仅10位模式):如果ACK位被置'1',I2C接口产生一个应答脉冲并等待8位从地址。 地址匹配:I2C接口产生
[单片机]
STM8 <font color='red'>I2C</font>从模式
关于I2C的总结
这两天在看I2C,为了加深印象,把我遇到的一些问题写出来吧。 1 最先遇到的问题是AT24C02的操作时序,AT24C02内部有一个指针,指向储存空间的某一个字节,另外AT24C系列支持页操作,对于AT24C02一个页是8字节,也就是说地址的高5位是页地址,在同一次写入中,页地址不变,低3位地址一次增加,当增加到7之后再加1就变成0了,而由于页地址不变,相当于指针回到了页首,如果继续写那前面的内容会被覆盖。写数据的时序,先是I2C的开始信号,发送设备地址,之后写入希望写入的数据地址,然后依次写入数据。当然,可以只写一个字节的数据。 对于读取,是不存在页的概念的,时序是先发送启动信号,然后发送设备地址(注意,是写设备的
[单片机]
硬件中断方式I2C(CVAVR)
//i2c.h #define TWPS0 0 #define TWPS1 1 #define TWEN 2 #define TWIE 0 #define TWEA 6 #define TWINT 7 #define TWSTA 5 #define TWSTO 4 // TWSR values (not bits) // Master #define TW_START 0x08 #define TW_REP_START 0x10 // Master Transmitter #define TW_MT_SLA_ACK
[单片机]
STM32F030 硬件I2C驱动 AT24C16
I2C 的配置 static void InitI2C() { I2C_InitTypeDef I2C_InitStructure; GPIO_InitTypeDef GPIO_InitA; RCC_APB1PeriphClockCmd(RCC_APB1Periph_I2C1,ENABLE);//使能I2C1,I2C2的时钟 RCC_I2CCLKConfig(RCC_I2C1CLK_SYSCLK);//时钟源设定 GPIO_PinAFConfig(GPIOB, GPIO_PinSource8, GPIO_AF_1); //配置PB8 成第二功能引脚 I2C1_SCL GPIO_PinAFConfig(GPIOB,
[单片机]
STM32F030 硬件<font color='red'>I2C</font>驱动 AT24C16
DM642的I2C总线配置与应用
随着国民经济的快速发展,数字图像处理广泛应用于社会生活的各个领域。DM642作为高性能的视频处理芯片,被广泛应用到视频处理的很多领域,但是DM642的I2C应用容易遇到I2C、VP等死锁,以及SAA7115的从地址不能正确设置的问题。本文主要介绍的就是基于DM642的视频采集处理系统中I2C模块的正确初始化,以及通过I2C总线正确地对视频解码芯片SAA7115的寄存器读/写程序。 1 I2C总线控制器的初始化 为了正确使用DM642内置的I2C模块,首先需要正确的初始化。 1.1 解锁DM642中的I2C模块 在DM642的I2C应用中,容易遇到不能使用初始化I2C模块的问题,原因在于没有先解锁并使能I2C模块。在DM64
[嵌入式]
DM642的<font color='red'>I2C</font><font color='red'>总线</font>配置与应用
stm8s105调试I2C记录
最近由于AR项目中调试LCOS需要用到STM8S105的mcu,本次主要是使用模拟I2C。 1.IIC协议简介 IIC协议这里只做简要介绍,详细介绍可以百度了解,协议相对简单,主要有开始位,停止位,应答位,非应答位。 开始位:当时钟为高,数据线由高变低 停止位:当时钟位高,数据线由低变高。 应答位:第9个时钟到来时,数据线为低。(这里第9个时钟,发送完一个字节,紧接着就是第9个时钟到来) 非应答位,第9个时钟到来时,数据线为高。 2.LCOS协议: 1.发送数据: 单数据发送: 开始位:写地址位(8bit):寄存器地址(16bit):数据(8bit):停止位 多字节发送:开始位:写地址(8bi
[单片机]
stm8s105调试<font color='red'>I2C</font>记录
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved