📄 saa7113.c
字号:
#include <REG52.H>
#include <intrins.h>
#include "i2c_vc.h"
#include "sys.h"
bit I2C_ERROR; // I2C总线数据传输出错标志
#define DeviceaddressW 0x4A //7113器件写地址
#define DeviceaddressR 0x4B //7113器件读地址
uchar Subaddress;
uchar code SAA7113_regaddress[28]={ //初始化代码
0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08,0x09,0x0A,0x0B,0x0C,0x0D,0x0E,
0x0,0x10,0x11,0x12,0x13,0x15,0x16,0x17,0x40,0x58,0x59,0x5A,0x5B,0x5E};
uchar code I2C_REG_VALUE_AI11[28]={
0x08,0xC2,0x33,0x00,0x00,0xEB,0xE0,0xB8,0x01,0x7E,0x46,0x43,0x01,0x01,
0x0F,0x00,0x0C,0xA7,0x00,0x00,0x00,0x00,0x02,0x00,0x54,0x07,0x80,0x00};
/*
static unsigned char SAA7113_Init[][2] ={///-----前端输入通道部分----
{0x01, 0x08},
{0x02, 0xC0},
{0x03, 0x33},
{0x04, 0x00},
{0x05, 0x00},
//-------解码部分------
{0x06, 0xEB},//default E9 采用缺省的会导致图形往右偏移
{0x07, 0xE0},//default 0D
{0x08, 0xB8},//9C
{0x09, 0x01},//[PAL:01, NTSC:41]
{0x0A, 0x80},//[PAL:80, NTSC:95]
{0x0B, 0x47},//[PAL:47, NTSC:48]
{0x0C, 0x42},//40/
{0x0D, 0x01},//default 00
{0x0E, 0x01},
{0x0F, 0x0F},//24
{0x10, 0x00},//00 VRLN=1
{0x11, 0x0C},
{0x12, 0x7B},//7B 这部分控制RTS1-VREF(50Hz), RTS0-HREF(15.6kHz) 输出
{0x13, 0x00},//01
{0x15, 0x00},
{0x16, 0x00},
{0x17, 0x00},
//-------常规分离数据部分------
{0x40, 0x02},
{0x41, 0xFF},
{0x42, 0xFF},
{0x43, 0xFF},
{0x44, 0xFF},
{0x45, 0xFF},
{0x46, 0xFF},
{0x47, 0xFF},
{0x48, 0xFF},
{0x49, 0xFF},
{0x4A, 0xFF},
{0x4B, 0xFF},
{0x4C, 0xFF},
{0x4D, 0xFF},
{0x4E, 0xFF},
{0x4F, 0xFF},
{0x50, 0xFF},
{0x51, 0xFF},
{0x52, 0xFF},
{0x53, 0xFF},
{0x54, 0xFF},
{0x55, 0xFF},
{0x56, 0xFF},
{0x57, 0xFF},
{0x58, 0x40},
{0x59, 0x54},//horizontal offset for slicer
{0x5A, 0x07},//vertical offset for slicer [PAL:07 NTSC:0A]
{0x5B, 0x83},//83field offset and MSBs for horizontal and vertical offset
{0x5C, 0x00},
{0x5D, 0x00},
{0x5E, 0x00},
{0x00, 0x00}};
*/
/*NTSC时试试看08寄存器,把它强制在60Hz状态。
2、试试看12寄存器,选择不同的V和H*/
/*寄存器0x02:输入端口选择:=0xC2选择输入端口AI21(PIN43)*/
/*
SAA7113 的地址从00H 开始,其中14H、18H~1EH、20H~3FH、63H~FFH 均为保留地址,没有用到,
00H、1FH、60H~62H 为只读寄存器,只有以下寄存器可以读写:0 1 H ~ 0 5 H (前端输入通道部分) ,
06H~13H、15H~17H(解码部分),40H~60H(常规分离数据部分)。
*/
/*Status byte video decoder subaddress 1Fh
RDCAPready for capture (all internal loops locked); active HIGH (OLDSB = 0) D0
CODEcolor signal in accordance with selected standard has been detected;active HIGH (OLDSB = 1)
COPRO copy protected source detected according to Macrovision version up to 7.01 (OLDSB = 0)
SLTCAslow time constant active in WIPA mode; active HIGH (OLDSB = 1) D1
WIPA white peak loop is activated; active HIGH D2
GLIMB gain value for active luminance channel is limited[min(bottom)];active HIGH D3
FIDTidentification bit for detected field frequency; LOW = 50 Hz,HIGH=60Hz D5
HLVLNstatus bit for horizontal/vertical loop: LOW = locked, HIGH = unlocked(OLDSB= 0) D6
INTLstatus bit for interlace detection; LOW = non-interlaced,HIGH=interlaced D7*/
//;***********送非应答位***********
/*void SEND_NOACK(void){
SDA=1;
_nop_();
SCL=1;
_nop_();
_nop_();
SCL=0;
_nop_();
}*/
void CHECK_ACK(void){
_nop_();
SCL=0;
_nop_();
SDA=1;
_nop_();
SCL=1;
_nop_();
_nop_();
I2C_ERROR=SDA;
SCL=0;
_nop_();
}
void I2C_SEND_1BYTE(uchar sendbyte)
{
uchar j=8;
for(;j>0;j--)
{
SCL=0;
sendbyte<<=1; //无论C51怎样实现这个操作,始终会使CY=sendbyte^7;
SDA=CY;
SCL=1;
}
SCL=0;
}
//;;;;;;;;;*******通过I2C总线向某一寄存器写入一个字节数据*********
void Saa7113_IIC_W(uchar reg_addr,uchar data_a){
I_start();
I2C_SEND_1BYTE(DeviceaddressW);//发送7113地址及“写”命令
CHECK_ACK();//检查7113的应答信号
if(I2C_ERROR==0) //;如果7113的应答信号正确
{
I2C_SEND_1BYTE(reg_addr); //发送寄存器地址
CHECK_ACK();
if(I2C_ERROR==0){ //;如果7113的应答信号正确
I2C_SEND_1BYTE(data_a);//发送数据字节
CHECK_ACK();
}}
I_stop();
}
//***************初始化7113,配置各寄存器************************
void INIT_SAA7113(void){
uchar i;
for(i=0;i<28;i++){/*SAA7113寄存器初始化配置数据*/
Saa7113_IIC_W(SAA7113_regaddress[i],I2C_REG_VALUE_AI11[i]);
if(I2C_ERROR==1)break;
}
//WR_SAA7113(0x0a,0x88);
}
uchar check7113(uchar reg){//需调试
//I2C_READ(0x08)//PAL,NTSC检测
//I2C_READ(0x0e)//0x0e:设置制式 ,默认PAL G
//0X11 0X12
return(rd_i2c_saa7113_data(DeviceaddressW,reg));
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -