新闻  |   论坛  |   博客  |   在线研讨会
视频解码芯片SAA7113的初始化与控制
yanqin | 2009-06-24 18:50:30    阅读:1687   发布文章

 

摘要:本文首先简要介绍了视频解码芯片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

  


*博客内容为网友个人发布,仅代表博主个人观点,如有侵权请联系工作人员删除。

参与讨论
登录后参与讨论
推荐文章
最近访客