摘要:介绍了虚拟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 虚拟I2C总线技术
1.1 多主方式下的I2C总线虚拟
I2C总线是Philips公司推出的一种连接IC器件的二线制总线,它既可以用于构成多主系统,又可工作在单主方式下。因为多主方式下会出现多主竞争的复杂状态,此时如果系统中没有带I2C总线接口的主控制器,那么要构成多主系统的虚拟I2C总线,就必须在虚拟I2C总线中解决多主竞争状态,而这几乎是不可能的,鉴于此,多主I2C总线系统必须使用带I2C总线接口的控制器。
1.2 单主方式下的I2C总线虚拟
当I2C总线中只有一个主器件时,I2C总线系统的工作方式称为单主方式。在单主方式下,由于I2C总线上只有一个主器件成为主节点,因此,该主器件会永远占据总线,而不会出现总线竞争,此时的主节点也不必有自己的节点地址。在这种情况下,主器件若没有I2C总线接口,就可以用主控制器的I/O口来模拟I2C总线接口。
目前,许多视频、音像电器中都采用了虚拟I2C总线技术。SAA7111的初始化控制操作就工作在单主方式下,因此可以用虚拟I2C总线技术来实现SAA7111的初始化控制。下面分别以单片机和DSP为例来说明虚拟I2C总线技术的实现方法。
2 用单片机普通I/O模拟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作为通用I/O端口的引脚设置情况如表1所列。以McBSP0为例,也可以从FSX0和CLKX0引出两条线分别表示SDA线和SCL线。
表1 将FXS和CLKX作为通用I/O的设置方法
引脚 | FSX数据方向 | CLKX数据方向 | FSX输出值 | CLKX输出值 | ||||
FSXM | CLKXM | FSXP | CLKXP | |||||
0 | 1 | 0 | 1 | 0 | 1 | 0 | 1 | |
FSX | 输入 | 输出 | - | - | - | 1 | - | - |
CLKX | - | - | 输入 | 输出 | - | - | 0 | 1 |
注:“-”表示无影响
图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总线接口的模拟。
4 SAA7111的初始化
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功能。内部寄存器控制位的功能含义详见参考文献。
可以采用上面任何一种方法来模拟I2C总线接口,只是具体的编程方法应视不同的控制器而异。但软件编程具有相同之处,首先必须根据I2C总线的原理写出启动、结束、发送应答信号及读、写一个字节的程序,然后根据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 寄存器初始化值
SubAddress | Data | SubAddress | Data |
00H | 00H | 01H | 00H |
02H | C1H | 03H | 33H |
04H | 00H | 05H | 00H |
06H | EBH | 07H | E0H |
08H | 88H | 09H | 01H |
0AH | 80H | 0BH | 47H |
0CH | 40H | 0DH | 00H |
0EH | 01H | 0FH | 00H |
10H | 40H | 11H | 1CH |
12H | 03H |
入口参数: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
MOV R2,#DBUF ;发送数据缓冲区首地址
送入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口模拟I2C总线接口的编程比较简单,操作也很方便,但是相应的会增加设计成本,因为系统要额外的增加一片单片机。而用DSP的McBSP口或者HPI-8口模拟I2C总线接口,虽然不必考虑成本问题,但是必须要禁用McBSP或者HPI-8的功能,这对系统中DSP功能的扩展来说是不利的。