技术简介:
本发明针对采用10位寻址模式的I2C控制器无法访问大容量存储器的问题,提出了一种新的方法。该方法通过将多个标准操作流程组合起来,实现从大容量存储器随机读写数据的功能。解决了原有控制器在处理大容量存储时地址不足的问题,提高了数据传输效率。
关键词:I2C控制器,访问大容量存储器,数据随机读写
专利名称:10位寻址模式i2c控制器访问大容量存储器的方法
技术领域:
本发明涉及电讯设备、电子设备和计算机设备的通讯领域,尤其涉及利用I2C控制器访问大容量存储器的方法。
背景技术:
目前,在数控消费电器、电讯设备、电子设备和计算机设备等领域中,广泛地利用I2C总线及其他设备来实现设备之间的相互通讯。
I2C(Inter-Integrated Circuit)总线是一种双线串行总线,由双向数据线SDA和时钟线SCL构成,通过这两条线,系统元器件之间可以相互通讯。I2C总线从传输速率上划分,有标准模式(100Kbit/s),快速模式(400Kbit/s),高速模式(3.4Mbit/s);从寻址范围上划分有7位地址模式和10位地址模式。I2C总线连接I2C主控制器(bus master)和I2C辅助设备(bus slave),一般来说,I2C主控制器通常是微处理器,I2C辅助设备包括许多连接在I2C总线上的设备,比如存储器、传感器等待。通常,I2C主控制器能与I2C辅助设备直接通讯并提供时钟信号;I2C辅助设备能从I2C主控制器接收数据或者为主控制器提供数据。在任何时候都只能有一个I2C主控制器存在,但可以有多个I2C辅助设备同时存在。
数据只能以字节方式在I2C总线上传输,数据传输单位便是字节。传输通常是以最重要的位(most significant bit,以下简称MSB)作为第一位,后边紧跟8位数据,每个字节传输结束以后,都会从对方传出一个响应位(Acknowledge bit,以下简称ACK)。图1表示I2C总线上数据传输的格式。
I2C主控制器向I2C辅助设备发出一个命令时,软件需要作以下设置设置辅助设备地址(Slave Address)、操作属性是读或是写、命令字(Command Code)、数据(Data),然后将控制寄存器开启(start)。如果所有的参数都正确,则在写操作完成数据的传送时,或者读操作完成数据的接收时,I2C主控制器就会产生一个SMI#信号或者产生中断。
I2C总线支持7种操作方式快速命令(Quick Command)、发送字节、接收字节、写字节、读字节、过程调用和数据块的读/写。下边列出了其中最常用的几种操作方式1)从当前地址读一个字节(Byte)/字(Word)属于I2C辅助设备的存储器内部有一个地址指针计数器用于记录当前的访问地址的指针,每一次存储器读/写操作之后,该指针就会自动移动并保存下来。接收字节就能实现简单地获取当前指针所指地址位存放的数据。该操作在双向数据线SDA上的数据流如图2所示。存储器从当前地址读取一个数据块操作,也就是读取一个字的操作相对于读取一个字节操作而言,其不同之处在于传输一个字节的数据后不发送STOP命令,而是继续读取下一个字节的数据,直到读取完所有的数据,再发送STOP命令,操作数据流如图6所示。
2)向当前地址写一个字节写一个字节与读一个字节的协议很相似,唯一的不同就是数据的传送方向读一个字节的数据是从I2C辅助设备传向I2C主控制器;而写一个字节的数据是从I2C主控制器传向I2C辅助设备。该操作在双向数据线SDA上的数据流与图2相似,只是将图2的第一个字节的第8位改为“0”。
3)向存储器的指定地址写一个字节/字该命令格式要求首先传送一个I2C辅助设备的地址,并在命令字的最后一位标明是一个写操作,等待I2C辅助设备响应,然后传送长度为一个字节的数据地址(Word Address)和要写入的那一个字节的值,后面再发送一个STOP命令。该操作在双向数据线SDA上的数据流如图3所示。写入一个字(buffer写)的操作相对于写一个字节(字节写)操作而言,其不同之处在于传输一个字节的数据后不发送STOP命令,而是继续写入下一个字节的数据,直到写完所有的数据,再发送STOP命令,操作数据流如图4所示。
4)从存储器的指定地址读一个字节/字读操作与写操作不太一样,要读取一个指定地址,必须先用写命令告诉存储器要读取的地址,然后再执行读操作,接收到字节后再发送STOP命令,操作的数据流如图5所示。如果想从指定地址读取一个字的数据,STOP命令之前的操作都不变,只是在接收到第一个字节后,并不发送STOP命令,而是再读取一个字节,直到接收所有的数据,才发送STOP命令。
目前,采用10位寻址模式的I2C总线为辅助设备提供了10位地址线,最多只能访问1K字节的物理空间。随着I2C总线应用的增加,对存储器的空间也提出了更大的要求,目前市面上已经有很多存储空间大于1K字节的存储器,而由于其数据的地址位已经超过了10位,因此用正常的I2C总线操作流程已经不能正常完成数据的随机访问。
发明内容鉴于上述,本发明要解决采用10位寻址模式的I2C控制器因寻址空间不足而无法寻址存储空间大于1K字节的存储设备的技术问题,以提高系统的存储空间,为系统提供更强大的功能。
为了解决上述技术问题,本发明提出一种采用10位寻址模式的I2C控制器访问大容量存储器的方法,其中上述I2C控制器从大容量存储器中随机读取数据的操作至少包括以下步骤步骤1,I2C控制器发送一个开始(start)信号;步骤2,I2C控制器向大容量存储器发送写操作命令,并等待其回传ACK;步骤3,收到ACK后,I2C控制器向大容量存储器发送上述数据的地址的高8位,并等待其回传ACK;步骤4,收到ACK后,I2C控制器向大容量存储器发送上述数据的地址的低8位,并等待其回传ACK;
步骤5,收到ACK后,I2C控制器再发送一个start信号;步骤6,I2C控制器向大容量存储器发送读操作命令,并等待其回传ACK;步骤7,收到ACK后,I2C控制器从大容量存储器中读取上述数据的一个字节,并等待其回传ACK;步骤7′,如果读取的数据大小为一个字节,则直接转到步骤8;如果读取的数据大于一个字节,重复步骤7,直到指定长度的数据全部读取完毕,转到步骤8;步骤8,收到ACK后,发送停止(stop)命令。
其中,步骤2中的写操作命令为一个字节,其第1-7位用于决定这次操作所选择的从控制器,也就是上述大容量存储器的地址,其第8位为0,表示用于决定这次操作是写操作;步骤6中的读操作命令为一个字节,其第1-7位用于决定这次操作所选择的从控制器,也就是上述大容量存储器的地址,其第8位为1,表示用于决定这次操作是读操作。
采用10位寻址模式的I2C控制器向大容量存储器写入随机读取数据的操作至少包括以下步骤步骤1,I2C控制器发送一个start信号;步骤2,I2C控制器向大容量存储器发送写操作命令,并等待其回传ACK;步骤3,收到ACK后,I2C控制器向大容量存储器发送将要写入上述数据的地址的高8位,并等待其回传ACK;步骤4,收到ACK后,I2C控制器向大容量存储器发送将要写入上述数据的地址的低8位,并等待其回传ACK;步骤5,收到ACK后,I2C控制器向大容量存储器发送需要写入的数据的一个字节,并等待其回传ACK;步骤5′,如果需要写入的数据的大小为一个字节,则直接转到步骤6;如果需要写入的数据大于一个字节,重复步骤5,直到指定长度的数据全部写入,转到步骤6;步骤6,收到ACK后,发送stop命令。
其中,步骤2中的写操作命令为一个字节,其第1-7位用于决定这次操作所选择的从控制器,也就是上述大容量存储器的地址,其第8位为0,表示用于决定这次操作是写操作。上述可写入的数据最多为15个字节。
采用本发明所述方法可以简单高效的实现标准I2C控制器访问更大空间的存储介质,有效的扩大I2C辅助设备的可用地址空间,为I2C辅助设备提供更强大的功能。它的优点如下不更改已有的I2C控制器,电路不作任何改动,完全由软件来实现,保证硬件的兼容性。
下面结合附图,对本发明的具体实施作进一步的详细说明。对于熟悉本
技术领域:
的人员而言,从对本发明方法的详细说明中,本发明的上述和其他目的、特征和优点将显而易见。
图1为I2C总线上数据传输的格式。
图2为从当前地址读一个字节的操作的数据流。
图3为I2C控制器向指定的地址写一个字节的操作的数据流。
图4为I2C控制器向指定的地址写一个连续数据块的操作的数据流。
图5为I2C控制器从指定地址读取一个字节的操作的数据流。
图6为I2C控制器从当前地址读取一个连续数据块的操作的数据流。
图7为大于1K字节的存储空间的存储器字节读操作的数据流。
图8为大于1K字节的存储空间的存储器字节写操作的数据流。
图9为大于1K字节的存储空间的存储器读取一个连续数据块的操作的数据流。
具体实施方式下面结合附图和
具体实施例对本发明所述的方法作进一步的详细说明。
一些大容量存储器,特别是大于1K字节的存储空间的存储器,提供了一些与采用10位寻址模式的I2C控制器的操作兼容的操作,包括按字节写、按页写、当前地址读/写、随机读、按页读等。下面讨论几种常用操作方式。
(1)从当前地址读一个字节此操作方式与背景技术中提到的从当前地址读一个字节的操作方式是完全一样的,在此不再讨论。
(2)向当前地址写一个字节此操作方式与背景技术中提到的向当前地址写一个字节的操作方式是完全一样的,在此不再讨论。
(3)从指定的地址读一个字节随机读方式允许采用10位寻址模式的I2C控制器随机访问整个空间内任意地址,在读数据之前必须先执行一个空写操作,将要读取的字节的地址传给双向数据线SDA,然后执行一次当前地址的读操作。
图7表示了从大于1K字节的存储空间的存储器随机读取一个字节的流程,该流程与采用10位寻址模式的I2C控制器的流程差别很大,没有一个单独的流程能独立完成此功能。本方法将多个标准的操作流程组合起来,实现从大容量存储器随机读取一个字节的功能。基本思想是利用如图3所示的采用10位寻址模式的I2C控制器的向指定地址写一个字节的操作和如图2所示的从当前地址读一个字节的操作组合起来实现此功能。具体的步骤至少包括第一步I2C控制器发送一个Start信号;第二步I2C控制器发送写操作命令,并等待存储器回应ACK;第三步收到ACK后,I2C控制器向存储器发送指定地址的高8位,并等待存储器回应ACK;第四步收到ACK后,I2C控制器向存储器发送指定地址的低8位,并等待存储器回应ACK;第五步收到ACK后,发送一个Start信号;第六步I2C控制器向存储器发送读操作命令,并等待存储器回应ACK;第七步收到ACK后,I2C控制器从存储器中读取数据的一个字节,并等待存储器回应ACK;第八步发送STOP命令。
图9表示了了从大于1K字节的存储空间的存储器随机读取一个连续数据块的操作。从大容量存储器中随机读取一个连续数据块的流程与从大容量存储器随机读取一个字节的流程的主要区别是在采用10位寻址模式的I2C控制器成功读取第一个字节后,不立即结束读取操作,而是继续等待大容量存储器向采用10位寻址模式的I2C控制器发送数据,读指定的数据长度后才结束本次读操作。本方法将多个标准的操作流程组合起来,完成从大容量存储器随机读取一个连续数据块的功能。具体的步骤至少包括第一步I2C控制器发送一个Start信号;第二步I2C控制器发送写操作命令,并等待存储器回应ACK;第三步收到ACK后,I2C控制器向存储器发送指定地址的高8位,并等待存储器回应ACK;第四步收到ACK后,I2C控制器向存储器发送指定地址的低8位,并等待存储器回应ACK;第五步收到ACK后,发送一个Start信号;第六步发送读操作命令,并等待存储器回应ACK;第七步收到ACK后,I2C控制器从存储器中读取数据的一个字节,并等待存储器回应ACK;第八步重复第七步操作,直到读取完所有要求的数据,每个字节的数据读取操作都要等待存储器回应ACK;第九步发送STOP命令。
(4)向指定地址写入一个字节这个操作与背景技术中提到的向存储器的指定地址写一个字节的操作相比较而言,多了一个字节的地址,其它地方都是完全一样,如图8所示。
仔细对比图4和图8,不难发现图4的处理流程在发出写命令后,只送出了一个字节的存储器地址,后边可以连续写入1-16个字节的数据;图8处理流程要求在写命令后发送两个字节的存储器地址,后边再一个字节的数据。对于存储器来说,数据和字节都只是一些字节流,它不可能也没有必要区分。所以本方法就利用这些特点,使用采用10位寻址模式的I2C控制器以图4的处理流程向指定存储器地址写入两个字节,来实现向大容量存储器随机写入一个字节的功能。写操作的步骤至少包括第一步I2C控制器发送一个Start信号;第二步I2C控制器发送写操作命令,并等待存储器回应ACK;第三步收到ACK后,I2C控制器向存储器发送将要写入上述数据的存储器地址的高8位,并等待存储器回应ACK;第四步收到ACK后,I2C控制器向存储器发送将要写入上述数据的存储器地址的低8位,并等待存储器回应ACK;第五步收到ACK后,I2C控制器向存储器发送要写入的数据,并等待存储器回应ACK;第六步收到ACK后,I2C控制器发送STOP命令。
采用10位寻址模式的I2C控制器向大容量存储器随机地址写入一连续数据块(buffer写)和写入一个字节(字节写)的主要区别在于,在一个字节的数据发送成功后,并不结束本次写操作,而连续发送多个字节,成功后才发送写结束命令。所以这样的操作流,可以利用采用10位寻址模式的I2C控制器的buffer写流程来实现。仔细分析图4可以发现,可以利用图4的流程,稍作改动即能实现大容量存储器的buffer写功能。由于两种设备的限制,这种方法实现的buffer写的单次写操作最多可以写入15个字节。具体的步骤为第一步I2C控制器发送一个Start信号;第二步I2C控制器发送写操作命令,并等待存储器回应ACK;第三步收到ACK后,I2C控制器向存储器发送将要写入上述数据的存储器地址的高8位,并等待存储器回应ACK;第四步收到ACK后,I2C控制器向存储器发送将要写入上述数据的存储器地址的低8位,并等待存储器回应ACK;第五步收到ACK后,I2C控制器向存储器发送要写入的数据的第一个字节,并等待存储器回应ACK;第六步重复第五步操作,直到发送完所有要求写入的数据,每个数据字节发送操作都要等待存储器回应ACK;第七步收到ACK后,I2C控制器发送STOP命令。
在不背离发明精神及其实质的情况下,熟悉本领域的技术人员当可根据本发明作出各种相应的改变,但这些相应的改变都应属于本发明的
权利要求的保护范围。
权利要求1.一种采用10位寻址模式的I2C控制器访问大容量存储器的方法,其特征是上述I2C控制器从大容量存储器中随机读取数据的操作至少包括以下步骤步骤1,I2C控制器发送一个开始信号;步骤2,I2C控制器向大容量存储器发送写操作命令,并等待其回传响应位;步骤3,收到响应位后,I2C控制器向大容量存储器发送上述数据的地址的高8位,并等待其回传响应位;步骤4,收到响应位后,I2C控制器向大容量存储器发送上述数据的地址的低8位,并等待其回传响应位;步骤5,收到响应位后,I2C控制器再发送一个开始信号;步骤6,I2C控制器向大容量存储器发送读操作命令,并等待其回传响应位;步骤7,收到响应位后,I2C控制器从大容量存储器中读取上述数据的一个字节,并等待其回传响应位;步骤7′,如果读取的数据大小为一个字节,则直接转到步骤8;如果读取的数据大于一个字节,重复步骤7,直到指定长度的数据全部读取完毕,转到步骤8;步骤8,收到响应位后,发送停止命令。
2.根据
权利要求1所述的方法,其特征是步骤2中的写操作命令为一个字节,其第1-7位用于决定这次操作所选择的从控制器,也就是上述大容量存储器的地址,其第8位为0,表示用于决定这次操作是写操作。
3.根据
权利要求1所述的方法,其特征是步骤6中的读操作命令为一个字节,其第1-7位用于决定这次操作所选择的从控制器,也就是上述大容量存储器的地址,其第8位为1,表示用于决定这次操作是读操作。
4.一种采用10位寻址模式的I2C控制器访问大容量存储器的方法,其特征是上述I2C控制器向大容量存储器写入随机读取数据的操作至少包括以下步骤步骤1,I2C控制器发送一个开始信号;步骤2,I2C控制器向大容量存储器发送写操作命令,并等待其回传响应位;步骤3,收到响应位后,I2C控制器向大容量存储器发送将要写入上述数据的地址的高8位,并等待其回传响应位;步骤4,收到响应位后,I2C控制器向大容量存储器发送将要写入上述数据的地址的低8位,并等待其回传响应位;步骤5,收到响应位后,I2C控制器向大容量存储器发送需要写入的数据的一个字节,并等待其回传响应位;步骤5′,如果需要写入的数据的大小为一个字节,则直接转到步骤6;如果需要写入的数据大于一个字节,重复步骤5,直到指定长度的数据全部写入,转到步骤6;步骤6,收到响应位后,发送停止命令。
5.根据
权利要求4所述的方法,其特征是步骤2中的写操作命令为一个字节,其第1-7位用于决定这次操作所选择的从控制器,也就是上述大容量存储器的地址,其第8位为0,表示用于决定这次操作是写操作。
6.根据
权利要求4所述的方法,其特征是上述数据最多为15个字节。
专利摘要本发明提供了一种采用10位寻址模式的I2C控制器访问大容量存储器的方法,其中上述I2C控制器从大容量存储器中随机读取数据的操作至少包括以下步骤I2C控制器发送一个开始信号;发送写操作命令,等待回传ACK;发送上述数据的地址的高8位,等待回传ACK;发送上述数据的地址的低8位,等待回传ACK;发送一个开始信号;发送读操作命令,等待回传ACK;读取上述数据的一个字节,等待回传ACK;如果读取的数据大小为一个字节,则直接转到下一步;如果读取的数据大于一个字节,重复该步骤,直到指定长度的数据全部读取完毕;发送停止命令。采用本发明的方法可以简单高效的实现标准I2C控制器访问更大空间的I2C存储介质。
文档编号G06F3/06GK1996275SQ200610138576
公开日2007年7月11日 申请日期2006年11月9日
发明者郑其杉, 马彧, 杨波 申请人:中兴通讯股份有限公司