《现代电子技术》2007年第8期摘录:2007年第8期总第247作于
-
如发现有乱码,请点击下面链接浏览原文
正文摘录:
2007年第8期总第247作于接收和发送状态。总线必须由主机(通常为微控制器)控制,主机产生串行时钟(SCI。)控制总线的传输方向,并产生起始和停止条件。SDA线上的数据状态仅在SCI,为低电平的期间才能改变,SCI,为高电平的期间,SDA状态的改变被用来表示起始和停止条件。具体时序见图1。图11。C数据传输时序3嵌入式系统中的l。C驱动的两种实现3.1系统自带I。C寄存器的实现下面以ARM$3C4510B”0为例,给出基于寄存器方式的I。C驱动实现。$3C4510B内含一个I。C总线主控器,可方便地与各种带有I。C接口的器件相连。I。C总线控制器有3个特殊功能寄存器:一个控制状态寄存器(I。CON),一个预分频寄存器(I。CPS)和一个移位缓冲寄存器(I。CBUF)。通过配置这些寄存器,可实现正确的I。C数据传输时序。下面分别给出读、写实现的实例。读操作:IICCON一0x80:IICPS:=0x000000】E:while(IICCONS~0x40);IICCON一0x1010x08;//I。C总线复位为初始化状态IICBUF—IICaddrlOx00:while(!(IICCON&0x01));IICBUF一(int)(regaddr&0xFF):while(!(IICCoN&Ox01));ITCCON一0x30:IICCON一0x100x08:IICBUF—IICaddr}0x01:while(!(IICCON&0x01));data—IICBUF&0XFF:IICCON一0x00:while(!(IICCoN&0x01));IICCON一0x20:returndata;写操作1lCCON-_0x80:IICPS==0x0000001E:whiIe(T1C(:0N托.0x40):IICC()N一0x10i0x08:TICBUF—IICaddr10x00while(!(IICCON&0x01))://设定预分频值//等待总线空闲//发送起始条件//写入从机地址//等待写缓冲//写入寄存器地址//设定重复开始条件//发送起始条件/,。请求从机数据//写从机数据//发送停止条件addr&0xFF):while((IICCON&.0x01)):IICBUF一(int)(reg—data~0xFF);while((IICCON&0x01)):IICCON一0x20:通过对控制状态寄存器(T。CCON)写入0x10发送启动码初始化串行I。C总线,然后总线控制器发送7位的从设备地址并通过移位缓冲寄存器发送读/写控制位,接收器则在主控器的SCI.脉冲期问通过将SDA线从高电平下拉到低电平作为应答信号。写数据的操作先设置控制状态寄存器的BF位(0x01),然后写人数据到移位缓冲寄存器。移位缓冲寄存器无论足被读还是写,BF位均会自动清零。若要进行连续的读/写操作,必须设置控制状态寄存器的ACK位(0x08)。读数据的操作在设置控制状态寄存器的BF位以后,可以进行读数据的操作,当读j写完最后一个字节时,可对ACK位进行复位通知发送器/接收器读数据操作结束。在读/写操作完成以后,可通过对I。CCON写入0x20生成结束码。3.2以GPIo端口模拟I。C实现此方法是直接用ARM$3C4510的GPI()C”(GeneralPurposeInput/()utput圬l脚模拟I。C总线的时序来实现数据传输。$3C4510B提供了18个可编程的通用I/O端口,用户可将每个端口配置为输入模式、输出模式或特殊功能模式,由片内的特殊功能寄存器I()PM()D和IOPC()N控制。控制I/()口的特殊功能寄存器一共有3个:lOP—MOD.IOPCON和I()PDATA。I/O口模式寄存器(IOP—MOD)用于配置P17~P0的输入输出状态;I/O口控制寄存器IOPCON用于配置端口P8~P17的特殊功能,当这些端口用作特殊功能(如外部中断请求、外部中断请求应答、外部DMA请求或应答、定时器溢出)时,其工作模式由IOPCON寄存器控制,而不再由IOPMOD寄存器;I/【)口数据寄存器(IOPDATA)当配置为输入模式时,读取I“)口数据寄存器IOPDATA的每一位对应输入状态.当配置为输出模式时,写每一位对应输出状态。位[17:O]对应于18个I/O引脚P17~P0。下面用GPI()的pin[OⅡ1]脚进行I。C模拟.其中低位为SDA,高位为SCI。。首先给出一螳便于操作的宏定义:#defineBaseAddr0x3FF0000#defineVP;nt*(volariieunsignedint*)#definelOPMOD(BaseAddl-+0x5000)#define10PCON(BaseAddr+0x5004)#define10PDATA(BaseAddr+0x5008)#defineIIC—DEI,AY800/'/延时周期#clefineVPVPintunsignedlongSCI,STATUS,SDASTA’FUS:#defineSDAHIGH(1<’<0)#defineSDAI,OWO#defineSCI。HI(;H(1t<<:1)#defineSCI。I。0WO延时:voiddelay(void){for(inti一0:i<I。Cr)El。AY;i十+)
阅读此文(图):
点击此处在线翻阅