专利名称:一种实现i2c读写时序的方法
技术领域:
本发明涉及电子通讯领域,尤其涉及一种实现I2C读写时序的方法。
背景技术:
I2C是一种双线(SDA(Serial Data-串行数据线)和SCL(Serial Clock-串行时钟线))总线,通过这两条线,系统元器件之间可以相互通讯。I2C包括多个设备主控制器(bus master)和辅助设备(bus slave)。通常,主控制器能与辅助设备直接通讯并提供时钟信号;辅助设备能从主控制器那接收数据或者为主控制器提供数据。在任何时候都只能有一个主控制器存在,但可以有多辅助设备同时存在。
目前,Start信号、Stop信号、I2C时钟信号、ACK信号均是由硬件来产生的,主从设备在通讯过程中,有机将Start信号、Stop信号、ACK信号组织在一起形成一个独立、完整的操作时序。
1、数据有效性SDA线上的数据必须在时钟的高电平周期保持稳定,数据线的高或低电平状态只有在SCL线的时钟信号是低电平时才能改变。如图1所示。
2、起始条件如图2所示。
3、停止条件如图3所示。
4、I2C上的数据传输数据只能以字节方式在I2C上传输,数据传输单位是字节。传输通常是以MSB(most significant bit-最重要的位)作为第一位,后边紧跟8位数据,每个字节传输结束以后,都会从对方传出一个响应位(ACK)。图4列出了数据传输的时序。
I2C主控制器向辅助设备发一个命令时,软件需要作以下一些设置设置辅助设备地址(Slave Address)、操作属性是读或是写、命令字(CommandCode)、数据(Data),然后将控制寄存器的开启(start)使能位置1。如果所有的参数都正确,当写操作完成数据的传送,或者读操作完成数据的接收,主控制器就会产生一个SMI#信号或者产生中断。
I2C支持7种命令格式Quick Command、发送字节、接收字节、写字节、读字节、过程调用和数据块的读/写。下边列出了其中最常用的几种命令格式(这些命令都需要主/从I2C设备之间进行一系列的通讯,通讯过程中有机将START、STOP、ACK信号组织在一起形成一个独立、完整的操作时序)1、从当前位置读一个字节I2C存储设备内部有一个地址指针计数器用于记录当前的访问位置的指针,每一次I2C存储设备读/写操作之后,该指针就会自动移动并保存下来。接收字节就能实现简单地获取当前指针所指地址位存放的数据。该操作在SDA(Serial Data-串行数据)上数据流如图5所示。
2、向当前位置写一个字节写一个字节与读一个字节协议很相似,唯一的不同就是数据的传送方向,读一个字节的数据是从辅助设备传向主控制器;而写一个字节的数据是从主控制器传向辅助设备。该操作在SDA上数据流只是将图5的第一个字节的第7位改为“0”。
3、向存储器的指定位置写一个字节(Byte)/字(Word)该命令格式要求首先传送一个辅助设备的地址,并在命令字的最后一位标明是一个写操作,等待辅助设备响应,然后传送长度为一个字节的数据地址(Word Address)和要写入的那一个字节的值,后面再发送一个STOP命令字。该操作在SDA上数据流如图6所示。写入一个字的操作相对于写字节操作而言,STOP之前的操作都是一样的,只是再传输另外一个字节,接收到ACK后,再发送STOP。操作数据流如图7所示。
4、从存储器的指定位置读一个字节(Byte)/字(Word)
读操作与写操作不太一样,要读取一个指定地址,必须先告诉存储器要读取的地址,然后再执行读操作,接收到字节后再发送STOP信号。如果想从指定地址读取一个字(WORD)的数据,STOP之前的操作都不变,只是在接收到第一个字节后,并不发送STOP,再读取一个字节,接收到ACK后,才发送STOP信号,详细的操作数据流如图8所示。
上述操作都是通过硬件来实现的,通过硬件实现对I2C从设备的访问,必须有以下设备I2C主控制器和I2C从设备。从而导致硬件设计难度大、稳定性差。
发明内容
本发明解决的主要技术问题是提供了一种实现I2C读写时序的方法,解决了硬件设计复杂、稳定性差的问题。
为了解决上述问题,本发明提出了一种实现I2C读写时序的方法,通过信号的组合,完成读写操作,主要特点在于,I2C时钟信号、Start信号即起始信号、Stop信号即停止信号、发送或获取ACK信号即响应信号是通过数据控制寄存器、时钟控制寄存器以及时间延时的设置来实现的;并且主从设备在通讯过程中,利用Start信号、Stop信号、ACK信号来完成读写操作。
进一步的,本发明提供的方法特点在于,I2C时钟信号是通过以下步骤实现的步骤一,时钟控制寄存器置1,从而相应电路输出高电平;步骤二,延时n ms;步骤三,时钟控制寄存器清0,从而相应电路输出低电平;步骤四,延时nms后,重新进行步骤一,如此循环,从而实现了用软件产生I2C时钟信号的目的。
进一步的,本发明提供的方法特点在于,Start信号是通过以下步骤实现的步骤一,把数据控制寄存器置1,数据线上输出高电平;步骤二,延时n/2ms;
步骤三,时钟控制寄存器置1,从而相应电路输出高电平;步骤四,延时n/2ms;步骤五,数据控制寄存器清0,数据线上输出低电平;步骤六,延时n/2ms;步骤七,时钟控制寄存器清0,从而相应电路输出低电平;步骤八,延时n/2ms,从而利用软件实现了时钟为高电平时检测到数据线从高到低的一次变化。
进一步的,本发明提供的方法特点在于,Stop信号是通过以下步骤实现的步骤一,数据控制寄存器清0,数据线上输出低电平;步骤二,时钟控制寄存器清0,相应电路输出低电平;步骤三,延时n/2ms;步骤四,时钟控制寄存器置1,相应电路输出高电平;步骤五,延时n/2ms;步骤六,数据控制寄存器置1,数据线上输出高电平;步骤七,延时n/2ms,从而实现了时钟为高电平时检测到数据线从低到高的一次变化。
进一步的,本发明提供的方法特点在于,获取ACK信号是通过以下步骤实现的步骤一,数据控制寄存器置1,数据线上输出高电平;步骤二,延时1ms;步骤三,时钟控制寄存器置1,相应电路输出高电平;步骤四,延时1ms;步骤五,读数据控制寄存器;步骤六,判断数据控制寄存器的最低位是否为1,如果是,执行步骤七,否则,执行步骤四;步骤七,时钟控制寄存器清0,从而实现了I2C主设备接收到的ACK信号在数据线为高时,从设备输出还是为高。
进一步的,本发明提供的方法特点在于,发送ACK信号是通过以下步骤实现的步骤一,数据控制寄存器清0,数据线上输出低电平;步骤二,延时n/2ms;步骤三,时钟控制寄存器置1,相应电路输出高电平;步骤四,延时n/2ms;步骤五,时钟控制寄存器清0,从而实现了数据线为低时产生半个时钟周期的高时钟信号。
进一步的,上述方法还具有以下特点,主从设备在通讯过程中,利用Start信号、Stop信号、ACK信号来完成读写操作,执行写操作是通过以下步骤实现的步骤一,发送Start信号;步骤二,发送一个特定控制字0x86;步骤三,等待从设备响应信号;步骤四,发送地址偏移;步骤五,等待从设备响应信号;步骤六,发送要写入的值;步骤七,等待从设备响应信号;步骤八,发送Stop信号,从而实现了向指定地址写一个字节。
进一步的,上述方法还具有以下特点,主从设备在通讯过程中,利用Start信号、Stop信号、ACK信号来完成读写操作,执行读操作是通过以下步骤实现的步骤一,发送Start信号;步骤二,发送一个特定控制字0x86;步骤三,等待从设备响应信号;步骤四,发送地址偏移;步骤五,等待从设备响应信号;步骤六,发送Start信号;步骤七,发送一个特定控制字0x87;步骤八,等待从设备响应信号;
步骤九,读取I2C传回的值;步骤十,发送Stop信号,从而实现了从指定地址读取一个字节。
采用本发明所述方法可以简化硬件设计的复杂度,增强了模块的可移植性,增加系统设计的灵活性,缩短产品开发的周期,大大降低了由于硬件原因而造成的产品故障,最终提高了产品的合格率和使用寿命。
图1是I2C总线的有效位传输时序图;图2是I2C的Start信号的时序图;图3是I2C的Stop信号的时序图;图4是I2C字节传输格式图;图5是从当前位置读一个字节操作的数据流图;图6是I2C控制器向指定的地址写一个字节操作的数据流图;图7是I2C控制器向指定的地址写一个数据块操作的数据流图;图8是I2C控制器从指定地址读取一个字节操作的数据流图;图9是软件产生时钟信号流程图;图10是软件产生Start信号流程图;图11是软件产生Stop信号流程图;图12是软件获取ACK信号流程图;图13是软件实现发送ACK信号流程图;图14是向指定地址写入一个字节处理流程图;图15是从指定地址读取一个字节处理流程图。
具体实施例方式
下面结合附图对本发明进行详细介绍。
本发明需要硬件提供两个可控制的数字信号,这两信号分别与I2C器件的SDA和SCL相连。软件向控制寄存器中写1,相应电路输出高电平;软件向控制寄存器中写0,相应电路输出低电平。
本发明实现I2C的以下基本功能
(1)软件产生I2C时钟;(2)软件实现START信号;(3)软件实现STOP信号;(4)软件实现获取ACK信号;(5)软件实现发送ACK信号;(6)向指定地址写入一个字节(7)从指定地址读取一个字节。
下面进行详细介绍。
(1)软件产生I2C时钟I2C的时钟如图1所示,虽然没有同步的要求,但是时钟与数据之间存在一定的制约关系,数据必须在时钟的高电平周期保持稳定,数据线的高或低电平状态只有在时钟信号是低电平时才能改变。其处理流程如图9所示。在图9中,执行的步骤如下步骤一,时钟控制寄存器置1,从而相应电路输出高电平;步骤二,延时nms;步骤三,时钟控制寄存器清0,从而相应电路输出低电平,步骤四,延时nms后,重新进行步骤一,如此循环,从而实现了用软件产生I2C时钟信号的目的。
(2)软件实现START信号的方法START信号如图2所示,其特点是在时钟为高电平时检测到数据线从高到低的一次变化。其处理流程如图10所示。在图10中,执行的步骤如下步骤一,把数据控制寄存器置1,数据线上输出高电平;步骤二,延时n/2ms;步骤三,时钟控制寄存器置1,从而相应电路输出高电平;步骤四,延时n/2ms;步骤五,数据控制寄存器清0,数据线上输出低电平;步骤六,延时n/2ms;步骤七,时钟控制寄存器清0,从而相应电路输出低电平;步骤八,延时n/2ms,从而利用软件实现了时钟为高电平时检测到数据线从高到低的一次变化。
(3)软件实现STOP的方法STOP如图3所示,该信号的特点是在时钟为高电平时检测到数据线从低到高的一次变化。其处理流程如图11所示,执行如下步骤步骤一,数据控制寄存器清0,数据线上输出低电平;步骤二,时钟控制寄存器清0,相应电路输出低电平;步骤三,延时n/2ms;步骤四,时钟控制寄存器置1,相应电路输出高电平;步骤五,延时n/2ms;步骤六,数据控制寄存器置1,数据线上输出高电平;步骤七,延时n/2ms,从而实现了时钟为高电平时检测到数据线从低到高的一次变化。
(4)软件实现获取ACK信号的方法I2C主设备接收到的ACK信号特点是在数据线为高时,从设备输出还是为高。其处理流程如图12所示,执行的步骤如下步骤一,数据控制寄存器置1,数据线上输出高电平;步骤二,延时1ms;步骤三,时钟控制寄存器置1,相应电路输出高电平;步骤四,延时1ms;步骤五,读数据控制寄存器;步骤六,判断数据控制寄存器的最低位是否为1,如果是,执行步骤七,否则,执行步骤四;步骤七,时钟控制寄存器清0,从而实现了I2C主设备接收到的ACK信号在数据线为高时,从设备输出还是为高。
(5)软件实现发送ACK信号的方法I2C主设备发送的ACK信号特点是在数据线为低时产生半个时钟周期的高时钟信号。其处理流程如图13所示,执行的步骤如下步骤一,数据控制寄存器清0,数据线上输出低电平;步骤二,延时n/2ms;步骤三,时钟控制寄存器置1,相应电路输出高电平;步骤四,延时n/2ms;步骤五,时钟控制寄存器清0,从而实现了数据线为低时产生半个时钟周期的高时钟信号。
(6)向指定地址写入一个字节每一个字节的写入都需要主/从I2C设备之间进行一系列的通讯,通讯过程中有机将START、STOP、ACK信号组织在一起形成一个独立、完成的操作时序。完整的时序如图6所示。软件实现一个写操作会调用前边提供的函数即可实现向指定地址写入一个特定数据的操作,其处理流程如图14所示,包括以下步骤步骤一,发送Start信号;步骤二,发送一个特定控制字0x86;步骤三,等待从设备响应信号;步骤四,发送地址偏移;步骤五,等待从设备响应信号;步骤六,发送要写入的值;步骤七,等待从设备响应信号;步骤八,发送Stop信号,从而实现了向指定地址写一个字节。
(7)从指定地址读取一个字节
每一个字节的读取也都需要主/从I2C设备之间进行一系列的通讯,通讯过程中有机地将START、STOP、ACK信号组织在一起形成一个独立、完成的操作时序。完整的时序如图8所示。软件实现一个读操作会调用前边提供的函数即可实现从指定地址读取一个字节的操作,其处理流程如图15所示,包括如下步骤步骤一,发送Start信号;步骤二,发送一个特定控制字0x86;步骤三,等待从设备响应信号;步骤四,发送地址偏移;步骤五,等待从设备响应信号;步骤六,发送Start信号;步骤七,发送一个特定控制字0x87;步骤八,等待从设备响应信号;步骤九,读取I2C传回的值;步骤十,发送Stop信号,从而实现了从指定地址读取一个字节。
权利要求
1.一种实现I2C读写时序的方法,通过信号的组合,完成读写操作,其特征在于,I2C时钟信号、Start信号即起始信号、Stop信号即停止信号、发送或获取ACK信号即响应信号是通过数据控制寄存器、时钟控制寄存器以及时间延时的设置来实现的,并且主从设备在通讯过程中,利用Start信号、Stop信号、ACK信号来完成读写操作。
2.根据权利要求1所述的方法,其特征在于,I2C时钟信号是通过以下步骤实现的步骤一,时钟控制寄存器置1,从而相应电路输出高电平;步骤二,延时n ms;步骤三,时钟控制寄存器清0,从而相应电路输出低电平;步骤四,延时n ms后,重新进行步骤一,如此循环,从而实现了用软件产生I2C时钟信号的目的。
3.根据权利要求1所述的方法,其特征在于,Start信号是通过以下步骤实现的步骤一,把数据控制寄存器置1,数据线上输出高电平;步骤二,延时n/2ms;步骤三,时钟控制寄存器置1,从而相应电路输出高电平;步骤四,延时n/2ms;步骤五,数据控制寄存器清0,数据线上输出低电平;步骤六,延时n/2ms;步骤七,时钟控制寄存器清0,从而相应电路输出低电平;步骤八,延时n/2ms,从而利用软件实现了时钟为高电平时检测到数据线从高到低的一次变化。
4.根据权利要求1所述的方法,其特征在于,Stop信号是通过以下步骤实现的步骤一,数据控制寄存器清0,数据线上输出低电平;步骤二,时钟控制寄存器清0,相应电路输出低电平;步骤三,延时n/2ms;步骤四,时钟控制寄存器置1,相应电路输出高电平;步骤五,延时n/2ms;步骤六,数据控制寄存器置1,数据线上输出高电平;步骤七,延时n/2ms,从而实现了时钟为高电平时检测到数据线从低到高的一次变化。
5.根据权利要求1所述的方法,其特征在于,获取ACK信号是通过以下步骤实现的步骤一,数据控制寄存器置1,数据线上输出高电平;步骤二,延时1ms;步骤三,时钟控制寄存器置1,相应电路输出高电平;步骤四,延时1ms;步骤五,读数据控制寄存器;步骤六,判断数据控制寄存器的最低位是否为1,如果是,执行步骤七,否则,执行步骤四;步骤七,时钟控制寄存器清0,从而实现了I2C主设备接收到的ACK信号在数据线为高时,从设备输出还是为高。
6.根据权利要求1所述的方法,其特征在于,发送ACK信号是通过以下步骤实现的步骤一,数据控制寄存器清0,数据线上输出低电平;步骤二,延时n/2ms;步骤三,时钟控制寄存器置1,相应电路输出高电平;步骤四,延时n/2ms;步骤五,时钟控制寄存器清0,从而实现了数据线为低时产生半个时钟周期的高时钟信号。
7.根据权利要求1所述的方法,其特征在于,主从设备在通讯过程中,利用Start信号、Stop信号、ACK信号来完成读写操作,执行写操作是通过以下步骤实现的步骤一,发送Start信号;步骤二,发送一个特定控制字0x86;步骤三,等待从设备响应信号;步骤四,发送地址偏移;步骤五,等待从设备响应信号;步骤六,发送要写入的值;步骤七,等待从设备响应信号;步骤八,发送Stop信号,从而实现了向指定地址写一个字节。
8.根据权利要求1所述的方法,其特征在于,主从设备在通讯过程中,利用Start信号、Stop信号、ACK信号来完成读写操作,执行读操作是通过以下步骤实现的步骤一,发送Start信号;步骤二,发送一个特定控制字0x86;步骤三,等待从设备响应信号;步骤四,发送地址偏移;步骤五,等待从设备响应信号;步骤六,发送Start信号;步骤七,发送一个特定控制字0x87;步骤八,等待从设备响应信号;步骤九,读取I2C传回的值;步骤十,发送Stop信号,从而实现了从指定地址读取一个字节。
全文摘要
本发明提供了一种实现I2C读写时序的方法,应用于电子通讯领域,通过信号的组合,完成读写操作,主要特点在于,I2C时钟信号、Start信号即起始信号、Stop信号即停止信号、发送或获取ACK信号即响应信号是通过数据控制寄存器、时钟控制寄存器以及时间延时的设置来实现的;并且主从设备在通讯过程中,利用Start信号、Stop信号、ACK信号来完成读写操作。采用本发明所述方法可以简化硬件设计的复杂度,增强了模块的可移植性,增加系统设计的灵活性,缩短产品开发的周期,大大降低了由于硬件原因而造成的产品故障,最终提高了产品的合格率和使用寿命。
文档编号G06F13/42GK101089838SQ20071012899
公开日2007年12月19日 申请日期2007年7月28日 优先权日2007年7月28日
发明者郑其杉 申请人:中兴通讯股份有限公司