1、连接总线的器件的输出级必须是集电极或漏极开路,以具有线“与”功能。I2C总线的数据传送速率在标准工作方式下为100kbit/s,快速方式下最高传送速率达400kbit/s。3) I2C总线上的时钟信号在I2C总线上传送信息时的时钟同步信号是由挂接在SCL时钟线上的所有器件的逻辑与完成的。SCL线上由高电平到低电平的跳变将影响到这些器件,一旦某个器件的时钟信号下跳为低电平,将使SCL线一直保持低电平,使SCL线上的所有器件开始低电平期。此时,低电平周期短的器件的时钟由低至高的跳变并不能影响SCL线的状态,于是这些器件将进入高电平等待的状态。当所有器件的时钟信号都上跳为高电平时,低电平期结束,SC
2、L线被释放返回高电平,即所有的器件都同时开始它们的高电平期。其后,第一个结束高电平期的器件又将SCL线拉成低电平。这样就在SCL线上产生一个同步时钟。可见,时钟低电平时间由时钟低电平期最长的器件确定,而时钟高电平时间由时钟高电平期最短的器件确定。4) 数据的传送在数据传送过程中,必须确认数据传送的开始和结束。在I2C总线技术规范中,开始和结束信号(也称启动和停止信号)的定义如下图所示。当时钟线SCL为高电平时,数据线SDA由高电平跳变为低电平定义为“开始”信号;当SCL线为高电平时,SDA线发生低电平到高电平的跳变为“结束”信号。开始和结束信号都是由主器件产生。在开始信号以后,总线即被认为处于
3、忙状态;在结束信号以后的一段时间内,总线被认为是空闲的。图5-35 I2C总线启动和停止信号的定义I2C总线的数据传送格式是:在I2C总线开始信号后,送出的第一个字节数据是用来选择从器件地址的,其中前7位为地址码,第8位为方向位(R/W)。方向位为“0”表示发送,即主器件把信息写到所选择的从器件;方向位为“1”表示主器件将从从器件读信息。开始信号后,系统中的各个器件将自己的地址和主器件送到总线上的地址进行比较,如果与主器件发送到总线上的地址一致,则该器件即为被主器件寻址的器件,其接收信息还是发送信息则由第8位(R/W)确定。在I2C总线上每次传送的数据字节数不限,但每一个字节必须为8位,而且每
4、个传送的字节后面必须跟一个认可位(第9位),也叫应答位(ACK)。数据的传送过程如下图所示。每次都是先传最高位,通常从器件在接收到每个字节后都会作出响应,即释放SCL线返回高电平,准备接收下一个数据字节,主器件可继续传送。如果从器件正在处理一个实时事件而不能接收数据时,(例如正在处理一个内部中断,在这个中断处理完之前就不能接收I2C总线上的数据字节)可以使时钟SCL线保持低电平,从器件必须使SDA保持高电平,此时主器件产生1个结束信号,使传送异常结束,迫使主器件处于等待状态。当从器件处理完毕时将释放SCL线,主器件继续传送。图5-36 I2C总线数据传送过程当主器件发送完一个字节的数据后,接着
5、发出对应于SCL线上的一个时钟(ACK)认可位,在此时钟内主器件释放SDA线,一个字节传送结束,而从器件的响应信号将SDA线拉成低电平,使SDA在该时钟的高电平期间为稳定的低电平。从器件的响应信号结束后,SDA线返回高电平,进入下一个传送周期。I2C总线还具有广播呼叫地址用于寻址总线上所有器件的功能。若一个器件不需要广播呼叫寻址中所提供的任何数据,则可以忽略该地址不作响应。如果该器件需要广播呼叫寻址中提供的数据,则应对地址作出响应,其表现为一个接收器。5) 总线竞争的仲裁总线上可能挂接有多个器件,有时会发生两个或多个主器件同时想占用总线的情况。例如,多单片机系统中,可能在某一时刻有两个单片机要
6、同时向总线发送数据,这种情况叫做总线竞争。I2C总线具有多主控能力,可以对发生在SDA线上的总线竞争进行仲裁,其仲裁原则是这样的:当多个主器件同时想占用总线时,如果某个主器件发送高电平,而另一个主器件发送低电平,则发送电平与此时SDA总线电平不符的那个器件将自动关闭其输出级。总线竞争的仲裁是在两个层次上进行的。首先是地址位的比较,如果主器件寻址同一个从器件,则进入数据位的比较,从而确保了竞争仲裁的可靠性。由于是利用I2C总线上的信息进行仲裁,因此不会造成信息的丢失。6) I2C总线的一次典型工作流程1、开始:信号表明传输开始。2、地址:主设备发送地址信息,包含7位的从设备地址和1位的指示位(表
7、明读或者写,即数据流的方向)。3、数据:根据指示位,数据在主设备和从设备之间传输。数据一般以8位传输,最重要的位放在前面;具体能传输多少量的数据并没有限制。接收器上用一位的ACK(回答信号)表明每一个字节都收到了。传输可以被终止和重新开始。4、停止:信号结束传输。 S3C44B0X的I2C控制S3C44B0X处理器提供了一个I2C串行总线,其模块框图如下图所示,包括一个专门的串行数据线和串行时钟线。它的操作模式有四种:1、主设备发送模式; 2、主设备接收模式;3、从设备发送模式; 4、从设备接收模式。图5-37 S3C44B0X处理器I2C串行总线框图1) I2C总线控制寄存器表5-34 I2
8、C总线控制寄存器寄存器名称地址读写状态描述复位值IICCON0x01D60000R/WIIC总线控制寄存器0000 XXXX位初始状态ACK使能70:禁止产生ACK信号1:允许产生ACK信号Tx时钟源选择6IICCLK=fMCLK/16IICCLK=fMCLK/512Tx/Rx中断使能5禁止Tx/Rx中断 1:使能Tx/Rx中断中断清除标记4写0:清除中断标志并重新启动写操作读1:中断标志置位发送时钟值3:0发送加载初始数据,决定发送频率未定义2) 状态寄存器表5-35 状态寄存器IICSTAT0x01D60004IIC总线控制/状态寄存器0000 0000模式选择7:6IIC总线主/从Tx/
9、Rx模式选择位00:从接收模式 01:主接收模式10:从发送模式 11:主发送模式忙信号状态/起停条件读0:IIC总线不忙 写0:产生IIC总线停止信号IIC总线忙 写1:产生IIC总线启动信号串行输出使能禁止Tx/Rx信号传输 1:使能Tx/Rx信号传输仲裁状态标记3总线仲裁成功总线仲裁不成功从设备状态标记2作为从设备时:检测到启动或停止信号 1:接收到地址零地址状态标记1总线地址为0接收到的最低数据位状态标记0接收到ACK应答信号 1:没有接收到ACK应答信号3) 地址寄存器表5-36 地址寄存器IICADD0x01D60008IIC总线地址寄存器XXXX XXXX从地址从设备的设备地址和
10、页面地址位0为读写控制(0为写,1为读)任何时候都可对该值进行读操作,当IICSTAT的串行输出使能位为0时,可对该值进行写操作4) 移位数据寄存器表5-37 移位数据寄存器IICDS0x01D6000CIIC总线发送/接收数据漂移寄存器数据漂移IIC总线要移位发送/接收的数据。任何时候都可对该值进行读操作,当IICSTAT的串行输出使能位为0时,可对该值进行写操作。4 软件设计1) I2C接口初始化I2C接口初始化操作通过函数void iic_init()完成,首先必须进行I2C端口初始化rPCONF = (rPCONF&0xFFFFFF0) | 0xa; /*PF0:IICSCL, PF1
11、:IICSDA */rPUPF |= 0x3; /*pull-up disable */然后配置I2C控制寄存器rIICCON=(17)|(06)|(15)|(0xf); /*Enable interrupt, IICCLK=MCLK/16*/rIICADD=0x10; /* S3C44B0X address */rIICSTAT=0x10;2) I2C写操作I2C写操作通过函数void iic_write_24C08(U32 slvAddr,U32 addr,U8 data)完成,其中slvAddr为从设备地址,在本系统中为0xa0,addr为待写入数据到芯片的地址,data为待写入的数据。
12、I2C写操作代码如下所示。a. 填写I2C命令,I2C缓冲区数据及大小。iic_command=WRDATA;iic_data_tx_index=0;iic_buffer0=(U8)addr;iic_buffer1=data;iic_data_tx_size=2;b. 然后设置从设备地址并启动I2C操作,并将引发中断。在I2C中断处理函数中进行读写操作,操作完毕iic_data_tx_size将被置为-1。rIICDS = slvAddr;rIICSTAT= 0xf0; /*MasTx,Start */c. 等待写操作完成。while(iic_data_tx_size!=-1);d. 等待从设
13、备应答。rIICSTAT=0xd0; /*top MasTx condition */rIICCON=0xaf; /*resumes IIC operation. */Delay(1); /*until stop condtion is in effect.*/ iic_command=POLLACK;while(1) rIICDS=slvAddr; iic_status=0x100; rIICSTAT=0xf0; /*MasTx,Start */ rIICCON=0xaf; /*resumes IIC operation. */ while(iic_status=0x100); if(!(i
14、ic_status&0x1) break; /*when ACK is received */ /*stop MasTx condition */ /*until stop condition is in effect.*/3) I2C读操作I2C读操作通过函数void iic_read_24C08(U32 slvAddr,U32 addr,U8 *data)完成,其中slvAddr为从设备地址,在本系统中为0xa0,addr为待读入数据的地址,data为待读入数据的缓冲区指针。I2C读操作代码如下所示。a. 填写I2C命令。iic_command=SETRDADDR; iic_data_tx
15、_index=0; iic_buffer0=(U8)addr; iic_data_tx_size=1; b. 等待写操作完成。 rIICDS=slvAddr; rIICSTAT=0xf0; /* MasTx,Start */ while(iic_data_tx_size! c. 启动I2C操作,并将引发中断。在I2C中断处理函数中进行读写操作,操作完毕读取的数据被送入iic_buffer中。 iic_command=RDDATA; iic_data_rx_index=0; iic_data_rx_size=1; rIICSTAT=0xb0; /*MasRx,Start */ rIICCON=0
16、xaf; /*resumes IIC operation. */ while(iic_data_rx_size! rIICSTAT=0x90; /*stop MasRx condition */ Delay(1); *data=iic_buffer1;4) I2C中断处理I2C中断中接收I2C命令并进行相应处理,包括对POLLACK、RDDATA、WRDATA命令的处理,代码如下所示。rI_ISPC=BIT_IIC; iicSt=rIICSTAT;switch(iic_command) case POLLACK: iic_status=iicSt; break; case RDDATA: ii
17、c_data_rx_size-; iic_bufferiic_data_rx_index+=rIICDS; if( iic_data_rx_size = -1 ) break; /* The last data has to be read with no ack. */ if(iic_data_rx_size)=0) rIICCON=0x2f; /* resumes IIC operation with NOACK.*/ else rIICCON=0xaf; /* resumes IIC operation with ACK */ case WRDATA: case SETRDADDR: iic_data_tx_size-; if(iic_data_tx_size=-1) break; rIICDS = iic_bufferiic_data_tx_index+; /*iic_buffer0 has dummy*/ for(i=0;i 田泽 ARM7嵌入开发实验与实践 北京: 北京航空航天大学出版社, 2006 2 张勇 ARM原理与C程序设计 西安: 西安电子科技大学出版社, 2009附录:实验程序及注释(自编部分)iic_command=RDDATA; if(iic_
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1