用虚拟I2C总线技术实现SAA7111的初始化
编辑:admin 转载请注明出处
双击自动滚屏
作 者:张克满 何格夫 文章来源:国外电子元器件 摘要:介绍了虚拟I2C总线技术的特点,描述了用单片机(C51)的普通I/O口以及对DSP(TMS320VC5402)的McBSP口和HPI-8口 模拟I2C总线接口的设计方案,最后给出了对SAA7111进行初始化的方法。 关键词:虚拟I2C总线技术;SAA7111;DSP;I2C总线 SAA7111 是philips半导体公司生产的一种视频输入处理器(vip),在视频采集系统中,通常需要诸如SAA7111之类的视频解码器作为模拟视频前端,而视 频解码器的初始化主要通过I2C总线接口来完成。然而,目前的单片机和DSP器件大多都不带有I2C总线接口,为此,本文提出了用虚拟总线技术来模拟实现 I2C总线功能,利用DSP的多功能I/O口和单片机的普通I/O口模拟I2C总线接口设计,从而实现DSP和单片机对SAA7111的初始化与控制的新 方法。 1 虚拟12C总线技术 1.1 多主方式下的12C总线虚拟 I2C 总线是Philips公司推出的一种连接IC器件的二线制总线,它既可以用于构成多主系统,又可工作在单主方式下。因为多主方式下会出现多主竞争的复杂状 态,此时如果系统中没有带I2C总线接口的主控制器,那么要构成多主系统的虚拟I2C总线,就必须在虚拟I2C总线中解决多主竞争状态,而这几乎是不可能 的,鉴于此,多主I2C总线系统必须使用带I2C总线接口的控制器。
当I2C 总线中只有一个主器件时,I2C总线系统的工作方式称为单主方式。在单主方式下,由于I2C总线上只有一个主器件成为主节点,因此,该主器件会永远占据总 线,而不会出现总线竞争,此时的主节点也不必有自己的节点地址。在这种情况下,主器件若没有I2C总线接口,就可以用主控制器的I/O口来模拟I2C总线 接口。 目前,许多视频、音像电器中都采用了虚拟I2C总线技术。SAA7111的初始化控制操作就工作在单主方式下,因此可以用虚拟I2C总线技术来实现SAA7111的初始化控制。下面分别以单片机和DSP为例来说明虚拟I2C总线技术的实现方法。 用 单片机普通I/O口模拟I2C总线接口时,其硬件配置非常简单,因为单片机的I/O口很多,并且大多I/O口都是双向的,因此可以直接用两个I/O口线作 为I2C总线的串行时钟线SCL和串行数据线SDA。图1所示为c51 单片机与SAA7111的硬件连接图。 当硬件配置完成后,根据I2C总线的时序特性可用软件编程来模拟I2C总线接口。图2为I2C总线的起始信号(S),它表示在SCL为高电平期间,数据线 SDA由高电平向低电平变化将启动I2C总线。下面是相应的汇编程序。其它子程序可以参考I2C总线时序来实现,这里就不一一给出了。 启动I2C总线: SETB P1.0 ; SDA=1 SETB P1.1 ; SCL=1 CALL DELAY ;保持数据时间,DELAY 为延迟子程序 CLR P1.0 ; SDA=0 CALL DELAY CLR P1.1 ;钳定总线,开始发送数据 RET 3 用DSP外围接口模拟I2C总线接口 由于TMS320VC5402只有两个通用的I/O引脚,且都是单向的,而在I2C总线中,SDA必须是双向的,因此必须借助于其它总线接口。 3.1 用McBSP口模拟I2C总线接口 首 先,通过配置串口控制寄存器SPCR1和SPCR2以及引脚控制寄存器PCR的禁用McBSP功能,以将McBSP引脚(包括CLKX、CLKR、DX、 DR、FSX、FSR、和CLKS)作为通用I/O口。现以发送器为例,当SPCR2的XRST=0、PCR的XIOEN=1时,串口发送器无效, FSX、CLKX用作通用I/O引脚。FSX和CLKX作为通用V端口的引脚设置情况如表1所列。以McBSP0为例,也可以从FSX0和CLKX0引出 两条线分别表示SDA线和SCL线。 表1 将FXS和CLKX作为通用I/O的设置方法
注:“-”表示无影响 图3为I2C总线的结束信号时序,下面是相应的程序: #define SPSA0 0x0038 //SPSA0指向McBSP0子地址寄存器 #define SPSD0 0x0039 //SPSD0指向McBSP0 子区数据存储器 #define PCR0 ‘0x000E //PCR0代表子地址 0x000E 结束I2C总线: void stop *short * SPSA0=PCR0; //SPSA0指向子 地址PCR0 *short * SPSD0=0x2A02 //初始化PCR0, 令FSX0=0,CLKX=1。即SDA=0,SCL=1 delay ; //延时。Delay()为延时子程序 *short * SPSD0=0x2A0A; //令FSX0=1, CLKX=1。即SDA=1,SCL=1 } 3.2 用HPI-8口模拟I2C总线接口 同 样,首先必须禁用HPI-8的功能,这可通过设置HPI-8控制寄存器(HPIC)的HPIENA为0来完成。当HPI-8工作在通用I/O端口 (GPIO)方式时,通过通用I/O控制寄存器(GPIOCR)和通用I/O状态寄存器(GPIOSR)可以控制GPIO方式下的HPI-8数据引脚。 GPIOCR的DIRx(x=0~7)位为低电平表明HDx引脚为输入,高电平表明HDx为输出。 GPIOSR的D/Ox位则反映了引脚HDx的逻辑值,D/Ox为低电平表明HDx输入/输出为0,D/Ox为高电平表明HDx输入/输出为1。因为在 GPIO方式下,HDx为双向I/O端口,因此可以任意选择一个HDx(如HD0)作为SDA,再用另外一个HDx(HD1)作为SCL以实现I2C总线 接口的模拟。
SAA7111 内部有32个寄存器(Subaddress00~1FH),其中22个是可编程的。00H、1A~1CH、1FH是只读寄存器,其中00H描述的是芯片版 本信息;1A~1CH是文本信息检测和解码寄存器,一般很少用到;1FH用来描述芯片的状态。02H~12H是可读写寄存器,其中02H~05H是模拟输 入控制寄存器,02H用于设置模拟视频信号输入方式(共8种),03H~05H用于设置增益控制方式, 06H~12H主要用于设置解码方式,通过配置这些寄存器可以设置行同步信号的开始和结束位置,并可确定亮度、色度、饱和度的大小以及输出图像数据信号的 格式。 01H、13H~19H、1DH~1EH寄存器保留使用。需要注意的是,在读00H寄存器前,必须将它初始化为0。在对多个连续的寄存器进行操作时,寄存 器地址有自动加1功能。内部寄存器控制位的功能含义详见参考文献。 可 以采用上面任何一种方法来模拟12C总线接口,只是具体的编程方法应视不同的控制器而异。但软件编程具有相同之处,首先必须根据12C总线的原理写出启 动、结束、发送应答信号及读、写一个字节的程序,然后根据SAA7111的寄存器操作格式写出读、写寄存器的程序,最后根据以上子程序写出初始化 SAA7111的程序段。SAA7111的初始化流程如图4所示。 以 单片机为例,硬件连接见前文图1所示,其中IICSA是SAA7111的读写控制位,IICSA=0表示SAA7111的写地址为48H。这里把 SAA7111初始化设定为:一路模拟视频信号输入(AI12)、自动增益控制、625行50Hz PAL制式、YUV 422 16位数字视频信号输出、设置默认的图象对比度、亮度及饱和度。相应的寄存器初始化值如表2所列。下面是向SAA7111的19个连续的子地址寄存器 (00H~12H)写入一组数据的的程序。 表2 寄存器初始化值
入口参数:SAA7111写地址48H、子地址00H、发送数据缓冲区DBUF、发送字节数19。 WNBYTE:MOV R3,19 ;发送字节数19送入R3 LCALL START ;调用启动子程序 MOV A,#48H ;SAA7111写地址送入A LCALL WBYTE ;调用写一个字节子程序 LCALL CHECK ;调用检查应答位子程序 JB F0,NEXT0 ;有应答,转到NEXT0,其 中F0为应答标志位,F0=1 表示有应答 AJMP WNBYTE ;无应答,重新发送 NEXT0:MOV A, 00H ;SAA7111子地址送入A LCALL WBYTE LCALL CHECK JB F0,NEXT1 AJMP START
送入R2 NEXT1:MOV A, @R2 ;发送数据缓冲区数据送 入A LCALL WBYTE LCALL CHECK JNB F0,WNBYTE ;未应答,重新发送 INC R2 DJNZ R3,NEXT1 ;发送完否未完,继续发送 EXIT: LCALL STOP ;发送完毕调用结束子程序 RET 5 结束语 对 一个典型的以DSP为核心处理器的视频采集系统而言,用单片机普通I/O口模拟12C总线接口的编程比较简单,操作也很方便,但是相应的会增加设计成本, 因为系统要额外的增加一片单片机。而用DSP的MCBSP口或者HPI-8口模拟I2C总线接口,虽然不必考虑成本问题,但是必须要禁用MCBSP或者 HPI-8的功能,这对系统中DSP功能的扩展来说是不利的。 |
|