SAA7113是飛利浦公司視頻解碼系列晶片的一種,非常具有代表性,在很多視頻產品如電視卡、MPEG2、MPEG4中都有套用,熟悉了7113的原理後,對其它系列晶片SAA7114、7115、7118就會很容易理解。SAA7113的主要作用是把輸入的模擬視頻信號解碼成標準的“VPO”數位訊號,相當於一種“A/D”器件。7113兼容全球各種視頻標準,在我國套用時必須根據我國的視頻標準來配置內部的暫存器,即初始化,否則7113就不能按要求輸出,可以說對7113進行研發的主要工作就是如何初始化。對7113初始化需要通過I2C匯流排進行,本文給出用51單片機控制的例子。
基本介紹
- 中文名:saa7113
- 出自:飛利浦公司
- 本質:一種視頻解碼晶片
- 套用:電視卡、MPEG2、MPEG4
原理與套用,暫存器,配置方法,初始化和控制,
原理與套用
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的典型套用如下圖所示。
暫存器
SAA7113的地址從00H開始,其中14H、18H~1EH、20H~3FH、63H~FFH均為保留地址,沒有用到,00H、1FH、60H~62H為唯讀暫存器,只有以下暫存器可以讀寫:01H~05H(前端輸入通道部分),06H~13H、15H~17H(解碼部分),40H~60H(常規分離數據部分)。
下面列表對7113中的暫存器進行簡要說明,其中默認值為晶片復位後的暫存器默認值,設定值為可以適用於我國PAL制式的設定參數,這些參數只供參考,詳細信息請參考7113數據手冊,有些參數如亮度等可以根據用戶的需要適當更改。
配置方法
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功能。
初始化和控制
SAA7113的初始化就是對暫存器配置合適的參數,使其能夠有符合要求的輸出。暫存器配置通過I2C匯流排來進行,很多可以控制I2C匯流排的器件都可以作為主器件對7113進行初始化,這裡介紹用51單片機初始化7113的例子。
51單片機和7113的硬體連線非常簡單,只要把單片機的兩個I/O口(如P1.0、P1.0)直接和7113的SCL、SDA管腳相連,再加上上拉電阻即可。
用單片機初始化7113的主要任務是程式的編寫,首先要熟悉I2C匯流排協定,根據I2C匯流排的原理寫出啟動、停止、應答信號等的子程式,由子程式再寫出傳送、接收1個位元組的程式,然後根據7113的暫存器操作格式寫出讀寫暫存器的程式,最後根據以上的子程式寫出初始化7113的程式段。
對7113的控制一般是改變色度、亮度等指標以及輸出管腳的輸出信號,這可以通過修改相應暫存器的值來完成,程式上寫出“讀寫命令”即可。
SDA BIT P1.0
SCL BIT P1.1
I2C_ERROR BIT 00H ;I2C匯流排數據傳輸出錯標誌
DeviceaddressW EQU 4AH ;7113器件地址+寫
DeviceaddressR EQU 4BH ;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
MOV C 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 ;讀出
結語