"); //-->
摘要:本文首先简要介绍了视频解码芯片saa7113的特点与应用,然后介绍了初始化时的寄存器配置,用51单片机控制7113的方法,最后给出了初始化7113的汇编程序及控制方法。
关键词:视频解码 saa7113 i2c总线 初始化
引言:
saa7113是飞利浦公司视频解码系列芯片的一种,非常具有代表性,在很多视频产品如电视卡、mpeg2、mpeg4中都有应用,熟悉了7113的原理后,对其它系列芯片saa7114、7115、7118就会很容易理解。saa7113的主要作用是把输入的模拟视频信号解码成标准的“vpo”数字信号,相当于一种“a/d”器件。7113兼容全球各种视频标准,在我国应用时必须根据我国的视频标准来配置内部的寄存器,即初始化,否则7113就不能按要求输出,可以说对7113进行研发的主要工作就是如何初始化。对7113初始化需要通过i2c总线进行,本文给出用51单片机控制的例子。
1. saa7113的基本原理与应用
saa7113是一种视频解码芯片,它可以输入4路模拟视频信号,通过内部寄存器的不同配置可以对4路输入进行转换,输入可以为4路cvbs或2路s视频(y/c)信号,输出8位“vpo”总线,为标准的itu 656、yuv 4:2:2格式。
7113兼容pal、ntsc、secam多种制式,可以自动检测场频适用的50或60hz,可以在pal、ntsc之间自动切换。7113内部具有一系列寄存器,可以配置为不同的参数,对色度、亮度等的控制都是通过对相应寄存器改写不同的值,寄存器的读写需要通过i2c总线进行。
7113的模拟与数字部分均采用+3.3v供电,数字i/o接口可兼容+5v,正常工作时功耗0.4w, 空闲时为0.07w。7113需外接24.576mhz晶体,内部具有锁相环(llc),可输出27mhz的系统时钟。芯片具有上电自动复位功能,另有外部复位管脚(ce),低电平复位,复位以后输出总线变为三态,待复位信号变高后自动恢复,时钟丢失、电源电压降低都会引起芯片的自动复位。7113为qfp44封装。
7113的典型应用如下图所示。
740)this.width=740" border=undefined
2.saa7113的寄存器简要介绍
saa7113的地址从00h开始,其中14h、18h~1eh、20h~3fh、63h~ffh均为保留地址,没有用到,00h、1fh、60h~62h为只读寄存器,只有以下寄存器可以读写:01h~05h(前端输入通道部分),06h~13h、15h~17h(解码部分),40h~60h(常规分离数据部分)。
下面列表对7113中的寄存器进行简要说明,其中默认值为芯片复位后的寄存器默认值,设置值为可以适用于我国pal制式的设置参数,这些参数只供参考,详细信息请参考7113数据手册,有些参数如亮度等可以根据用户的需要适当更改。
740)this.width=740" border=undefined
3.saa7113寄存器的配置方法
saa7113的寄存器配置通过i2c总线来进行,遵从i2c总线协议,下面从读、写两个方面来说明操作的格式:
对7113寄存器的“写”操作:
s
slave address w
ack-s
subaddress
ack-s
data
ack-s
p
对7113寄存器的“读”操作:
s
slave address w
ack-s
subaddress
ack-s
sr
slave address r
ack-s
data
ack-m
p
说明:s:起始位,条件是scl高电平时sda有下降沿;
sr:重复设一个起始位
slave address w:7113芯片地址+写标志,0100 1010 = 4ah,若rts0通过3.3k电阻接地,则为48h;
slave address r:7113芯片地址+写标志,0100 1011 = 4bh,若rts0通过3.3k电阻接地,则为49h;
ack-s:7113产生的回应信号;
ack-m:主机产生的回应信号;
subaddress:寄存器地址;
p:停止位,条件是scl高电平时sda有上升沿;
对多个寄存器操作时,寄存器地址有自动加1功能。
4.用51单片机对7113初始化和控制
saa7113的初始化就是对寄存器配置合适的参数,使其能够有符合要求的输出。寄存器配置通过i2c总线来进行,很多可以控制i2c总线的器件都可以作为主器件对7113进行初始化,这里介绍用51单片机初始化7113的例子。
51单片机和7113的硬件连接非常简单,只要把单片机的两个i/o口(如p1.0、p1.0)直接和7113的scl、sda管脚相连,再加上上拉电阻即可。
用单片机初始化7113的主要任务是程序的编写,首先要熟悉i2c总线协议,根据i2c总线的原理写出启动、停止、应答信号等的子程序,由子程序再写出发送、接收1个字节的程序,然后根据7113的寄存器操作格式写出读写寄存器的程序,最后根据以上的子程序写出初始化7113的程序段。
对7113的控制一般是改变色度、亮度等指标以及输出管脚的输出信号,这可以通过修改相应寄存器的值来完成,程序上写出“读写命令”即可。
下面以程序段的形式给出初始化saa7113以及读写寄存器的具体例子,以供参考。
sda bit p1.0
scl bit p1.1
i2c_error bit 00h ;i2c总线数据传输出错标志
deviceaddressw equ 4ah ;7113器件地址+写
deviceaddressr equ 4bh ;7113器件地址+读
subaddress equ 4dh ;7113寄存器地址字节在单片机中的存放地址
data_i2c equ 50h ;设置写入或读出数据在单片机中的存放地址
;*************启动**************
i2c_start: setb sda
nop
setb scl
nop
clr sda
nop
clr scl
ret
;***************停止**************
i2c_stop: clr sda
nop
setb scl
nop
setb sda
nop
ret
;************送应答位************
send_ack: clr scl
nop
clr sda
nop
setb scl
nop
nop
clr scl
nop
setb sda
ret
;***********送非应答位***********
send_noack: setb sda
nop
setb scl
nop
nop
clr scl
nop
ret
;***********检查应答位************
check_ack: nop
clr scl
nop
setb sda
nop
setb scl
nop
nop
mov c, sda
mov i2c_error, c
clr scl
nop
ret
;*******发送1字节数据,待送数据在a中******
i2c_send_1byte:
mov r0, #8
send100: rlc a
mov sda, c
nop
setb scl
nop
nop
clr scl
djnz r0, send100
ret
;*******接收1字节数据,接收数据放在a中*****
i2c_receive_1byte:
mov r0, #8
recv100: setb sda
nop
setb scl
nop
nop
nop
mov c, sda
clr scl
rlc a
djnz r0, recv100
ret
;*******通过i2c总线向某一寄存器写入一个字节数据*********
i2c_write: acall i2c_start ;发启动信号
mov a, # deviceaddressw ;调7113地址+写
acall i2c_send_1byte ;发送7113地址及“写”命令
acall check_ack ;检查7113的应答信号
jnb i2c_error, wr200 ;应答正确,继续
wr100: acall i2c_stop ;应答不对,返回
ret
wr200: mov a, subaddress ;调寄存器地址
acall i2c_send_1byte ;发送寄存器地址
acall check_ack ;检查7113的应答信号
jb i2c_error, wr100 ;应答不对,返回
mov a, data_i2c ;调准备写入的数据
acall i2c_send_1byte ;发送数据字节
acall check_ack
jb i2c_error, wr100
acall i2c_stop ;发停止信号
ret
;*******通过i2c总线读出某一寄存器的数据*********
i2c_read: acall i2c_start
mov a, # deviceaddressw ;调7113地址,写入
acall i2c_send_1byte
acall check_ack
jnb i2c_error, rd200
rd100: acall i2c_stop
ret
rd200: mov a, subaddress ;调要读的寄存器地址
acall i2c_send_1byte ; 发送寄存器地址字节
acall check_ack
jb i2c_error, rd100
acall i2c_start ;重发起动信号
mov a, # deviceaddressr ;调7113地址,读
acall i2c_send_1byte
acall check_ack
jb i2c_error, rd100
acall i2c_receive_1byte ;接收读出的数据
mov data_i2c, a ;读出数据转存
acall send_noack ;发送非应答位
acall i2c_stop ;停止
ret
;***************初始化7113,配置各寄存器************************
init_saa7113: mov dptr, #saa7113_subaddress
mov r7, #28
init100: mov a, #0
movc a, @a+dptr
mov subaddress, a ;调寄存器地址
mov a,#28
movc a, @a+dptr
mov data_i2c, a ;调寄存器配置数据
inc dptr
acall i2c_write ;配置1个寄存器
jb i2c_error, init200
djnz r7,init100
init200: ret
;***************saa7113寄存器初始化配置数据**********************
saa7113_subaddress:
db 01h,02h,03h,04h,05h,06h,07h,08h,09h,0ah,0bh,0ch,0dh,0eh
db 0fh,10h,11h,12h,13h,15h,16h,17h,40h,58h,59h,5ah,5bh,5eh
;共28个
i2c_reg_value_ai11:
db 08h,0c0h,33h,00h,00h,0ebh,0e0h,0b8h,01h,7eh,46h,43h,01h,01h
db 0fh,00h,0ch,0a7h,00h,00h,00h,00h,02h,00h,54h,07h,80h,00h
;*************对saa7113某一寄存器的改写与读出*******************
write_read: mov subaddress, #0ah ; 设寄存器地址为0ah
mov data_i2c, #88h ;改寄存器的值为88h
acall i2c_write ;改写
acall i2c_read ;读出
结语
saa7113在很多产品中都可以应用,但其初始化与控制的原理都一样,本文中的程序段经过实际应用可以保证7113正常工作,其寄存器设置参数与控制方法可以被借鉴或直接应用。
参考文献
1. 陈露晨主编. 计算机通信接口技术. 成都:电子科技大学出版社,1999
2. 张洪润主编. 单片机应用技术教程. 北京:清华大学出版社,1997
3. saa7113h product specification / data sheet . philips, 1999
*博客内容为网友个人发布,仅代表博主个人观点,如有侵权请联系工作人员删除。