⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 video_adv7181b.c

📁 ADV7181B视频解码设置和控制实验 FreeDev Digital Application Board采用了ADI公司的 ADV7181B视频解码芯片。控制接口使用I2C
💻 C
字号:
 /**************************************************************程序说明 :ADV7181B视频解码设置和控制实验  FreeDev Digital Application Board采用了ADI公司的            ADV7181B视频解码芯片。    1、控制接口使用I2C,40H--write,41H---read。            2、I2C IP Quartus 工程目录中**************************************/#include <stdio.h>#include <system.h>#include <io.h>#include <alt_types.h>#define CVBS_AIN6 0#define S_VIDEO_AIN2_AIN4 1#define PAL_AIN6 2/*********************************************函数名:I2c_write_ADV7181B功  能:I2C写视频芯片ADV7181B控制寄存器输  入:设备地址,寄存器地址,数据返  回:       -1  写器件地址错误      -2  写寄存器地址错误      -3  写数据错误      0   成功备  注:通过I2C控制总线写ADV7181B控制寄存器       使用了I2C库的相关函数。**********************************************/int I2C_write_ADV7181B(alt_u8 slaveAddr,alt_u8 sub_address,alt_u8 data){    alt_u8 uc;    int iRet;        uc=slaveAddr & 0xfe;       iRet=start_write_waitack(uc);    if(iRet<0)      return -1;        //write sub address    iRet=write_waitack(sub_address);    if(iRet<0)      return -2;             //write data     iRet=write_waitack_stop(data);    if(iRet<0)      return -3;           return 0;  }  /*********************************************函数名:I2c_read_ADV7181B功  能:I2C写视频芯片ADV7181B控制寄存器输  入:设备地址,字节地址,读数据指针返  回:       -1  写器件地址错误      -2  写寄存器地址错误      -3  写数据错误      0   成功备  注:通过I2C控制总线写ADV7181B控制寄存器       使用了I2C库的相关函数。**********************************************/int I2C_read_ADV7181B(alt_u8 slaveAddr,alt_u8 sub_address,alt_u8 *pData){    alt_u8 uc;    int iRet;        //start    uc=slaveAddr &0xfe;       iRet=start_write_waitack(uc);    if(iRet<0)      return -1;        //write sub address    iRet=write_waitack(sub_address);    if(iRet<0)      return -2;             //restart     uc=slaveAddr | 0x01;    iRet=start_read_waitack(uc);    if(iRet<0)      return -3;        // read data and stop      iRet=read_sendack_stop(pData);    if(iRet<0)      return -4;             return 0;}/*********************************************函数名:show_ADV7181B_reg功  能:显示参数地址指定的ADV7181B控制寄存器值输  入:设返  回: 备  注:**********************************************/int show_ADV7181B_reg(unsigned char add){  int iRet;  unsigned char ch,i;    iRet=I2C_read_ADV7181B(0x41,add,&ch);    if(iRet<0){      printf(" I2C_read_ADV7181B reg[%2x] error=[%d]\n",i,iRet);      return -(i);    }    printf(" ADV7181B视频芯片寄存器[%2x]=[%2x]\n",add,ch);    printf(" 适应国情\n");    return 0;  }/*********************************************函数名:init_ADV7181B功  能:初始化视频芯片ADV7181B控制寄存器输  入:设返  回: 备  注:**********************************************/int init_ADV7181B(int format){  int iRet;  unsigned char ch,i,j;  int count;      printf(" 初始化ADV7181B视频芯片寄存器...\n");    printf(" ADV7181B 复位...\n");  iRet=I2C_write_ADV7181B(0x40,0x0f,0x80);  count = 0;  while (count<200000)    count++;  printf(" ADV7181B复位OK\n");    if(format==CVBS_AIN6)//CVBS ANI6   {          // Digital Clamp Control1           iRet=I2C_write_ADV7181B(0x40,0x15,0x00);          if(iRet<0)            return -1;                    // Shaping Filter Control            iRet=I2C_write_ADV7181B(0x40,0x17,0x41);          if(iRet<0)            return -1;                   // Power down ADC1 ADC2            iRet=I2C_write_ADV7181B(0x40,0x3a,0x16);          if(iRet<00)            return -1;                  // CTI DNR Control4            iRet=I2C_write_ADV7181B(0x40,0x50,0x04);          if(iRet<0)            return -1;                  // ADC SWITCH1 select AIN6             iRet=I2C_write_ADV7181B(0x40,0xc3,0x05);          if(iRet<0)            return -1;          // ADC SWITCH2 ADC_SW_MAN_EN            iRet=I2C_write_ADV7181B(0x40,0xc4,0x80);          if(iRet<0)            return -1;          // ADI Control 默认值            iRet=I2C_write_ADV7181B(0x40,0x0e,0x80);          if(iRet<0)            return -1;          // CCI DNR Control 4            iRet=I2C_write_ADV7181B(0x40,0x50,0x20);          if(iRet<0)            return -1;          // SD Saturation Cr            iRet=I2C_write_ADV7181B(0x40,0xe4,0x3e);          if(iRet<0)            return -1;          // PAL F Bit Toggle            iRet=I2C_write_ADV7181B(0x40,0xea,0x0f);          if(iRet<0)            return -1;          // Vsync Field Control 1            iRet=I2C_write_ADV7181B(0x40,0x31,0x12);          if(iRet<0)            return -1;          // Vsync Field Control 2            iRet=I2C_write_ADV7181B(0x40,0x32,0x81);          if(iRet<0)            return -1;         //  Vsync Field Control 3           iRet=I2C_write_ADV7181B(0x40,0x33,0x84);          if(iRet<0)            return -1;         // Polarity          iRet=I2C_write_ADV7181B(0x40,0x37,0xA0);          if(iRet<0)            return -1;           // NTSC V bit Begin            iRet=I2C_write_ADV7181B(0x40,0xe5,0x80);          if(iRet<0)            return -1;         // NTSC V bit End         iRet=I2C_write_ADV7181B(0x40,0xe6,0x03);          if(iRet<0)            return -1;          // NTSC F Bit Toggle            iRet=I2C_write_ADV7181B(0x40,0xe7,0x85);          if(iRet<0)            return -1;         // CTI DNR Ctrl 4         iRet=I2C_write_ADV7181B(0x40,0x50,0x00);          if(iRet<0)            return -1;         // Lock Count            iRet=I2C_write_ADV7181B(0x40,0x51,0x00);          if(iRet<0)            return -1;            // 0x50 修改成 0x00 cvbs 自动检测所有制式         iRet=I2C_write_ADV7181B(0x40,0x00,0x00);          if(iRet<0)            return -1;           // Extended Output Control            iRet=I2C_write_ADV7181B(0x40,0x04,0x02);          if(iRet<0)            return -1;         // Contrast Register         iRet=I2C_write_ADV7181B(0x40,0x08,0x60);          if(iRet<0)            return -1;         // Brightness Register         iRet=I2C_write_ADV7181B(0x40,0x0a,0x18);          if(iRet<0)            return -1;        // ADI Control        iRet=I2C_write_ADV7181B(0x40,0x0e,0x05);          if(iRet<0)            return -1;  }else if (format== S_VIDEO_AIN2_AIN4){    // S_VIDEO_AIN2_AIN4              // 0x06 0000 自动检测所有制式  0110 S_VIDEO         iRet=I2C_write_ADV7181B(0x40,0x00,0x06);          if(iRet<0)            return -1;                  // ADC0--AIN2  ADC1--AIN4            iRet=I2C_write_ADV7181B(0x40,0xc3,0x41);          if(iRet<0)            return -1;                    // ADC_SW_MAN_EN 1 ,ADC2 NOT CONNECT            iRet=I2C_write_ADV7181B(0x40,0xc4,0x80);          if(iRet<0)            return -1;                  // Power down ADC1 ADC2            iRet=I2C_write_ADV7181B(0x40,0x3a,0x12);          if(iRet<0)            return -1;                      // Digital Clamp Control1           iRet=I2C_write_ADV7181B(0x40,0x15,0x00);          if(iRet<0)            return -1;                    // Shaping Filter Control            iRet=I2C_write_ADV7181B(0x40,0x17,0x41);          if(iRet<0)            return -1;                  // CTI DNR Control4            iRet=I2C_write_ADV7181B(0x40,0x50,0x04);          if(iRet<0)            return -1;                   // ADI Control 默认值            iRet=I2C_write_ADV7181B(0x40,0x0e,0x80);          if(iRet<0)            return -1;                    // CCI DNR Control 4            iRet=I2C_write_ADV7181B(0x40,0x50,0x20);          if(iRet<0)            return -1;                    // SD Saturation Cr            iRet=I2C_write_ADV7181B(0x40,0xe4,0x3e);          if(iRet<0)            return -1;                    // PAL F Bit Toggle            iRet=I2C_write_ADV7181B(0x40,0xea,0x0f);          if(iRet<0)            return -1;                    // Vsync Field Control 1            iRet=I2C_write_ADV7181B(0x40,0x31,0x12);          if(iRet<0)            return -1;                    // Vsync Field Control 2            iRet=I2C_write_ADV7181B(0x40,0x32,0x81);          if(iRet<0)            return -1;                  //  Vsync Field Control 3           iRet=I2C_write_ADV7181B(0x40,0x33,0x84);          if(iRet<0)            return -1;                  // Polarity          iRet=I2C_write_ADV7181B(0x40,0x37,0xA0);          if(iRet<0)            return -1;                     // NTSC V bit Begin            iRet=I2C_write_ADV7181B(0x40,0xe5,0x80);          if(iRet<0)            return -1;         // NTSC V bit End         iRet=I2C_write_ADV7181B(0x40,0xe6,0x03);          if(iRet<0)            return -1;                     // NTSC F Bit Toggle            iRet=I2C_write_ADV7181B(0x40,0xe7,0x85);          if(iRet<0)            return -1;                  // CTI DNR Ctrl 4         iRet=I2C_write_ADV7181B(0x40,0x50,0x00);          if(iRet<0)            return -1;                  // Lock Count            iRet=I2C_write_ADV7181B(0x40,0x51,0x00);          if(iRet<0)            return -1;                    // Extended Output Control            iRet=I2C_write_ADV7181B(0x40,0x04,0x02);          if(iRet<0)            return -1;                  // Contrast Register         iRet=I2C_write_ADV7181B(0x40,0x08,0x60);          if(iRet<0)            return -1;                  // Brightness Register         iRet=I2C_write_ADV7181B(0x40,0x0a,0x18);          if(iRet<0)            return -1;                // ADI Control        iRet=I2C_write_ADV7181B(0x40,0x0e,0x05);          if(iRet<0)            return -1;    }    else if (format== PAL_AIN6){    // PAL_AIN6              // 0x06 0000 自动检测所有制式  0110 S_VIDEO         iRet=I2C_write_ADV7181B(0x40,0x00,0x80);          if(iRet<0)            return -1;                  // ADC0--AIN2  ADC1--AIN4            iRet=I2C_write_ADV7181B(0x40,0x07,0x01);          if(iRet<0)            return -1;                      iRet=I2C_write_ADV7181B(0x40,0x10,0x01);//+          if(iRet<0)            return -1;                    // ADC_SW_MAN_EN 1 ,ADC2 NOT CONNECT            iRet=I2C_write_ADV7181B(0x40,0x15,0x00);          if(iRet<0)            return -1;                  // Power down ADC1 ADC2            iRet=I2C_write_ADV7181B(0x40,0x17,0x41);          if(iRet<0)            return -1;                      // Digital Clamp Control1           iRet=I2C_write_ADV7181B(0x40,0x19,0xFA);          if(iRet<0)            return -1;                     // Polarity            iRet=I2C_write_ADV7181B(0x40,0x37,0xA0);          if(iRet<0)            return -1;                               // ADI Control 默认值            iRet=I2C_write_ADV7181B(0x40,0x3A,0x16);          if(iRet<0)            return -1;                              // PAL F Bit Toggle            iRet=I2C_write_ADV7181B(0x40,0x50,0x0A);          if(iRet<0)            return -1;                    // Vsync Field Control 1            iRet=I2C_write_ADV7181B(0x40,0xC3,0x05);          if(iRet<0)            return -1;                    // Vsync Field Control 2            iRet=I2C_write_ADV7181B(0x40,0xC4,0x80);          if(iRet<0)            return -1;                  //  Vsync Field Control 3           iRet=I2C_write_ADV7181B(0x40,0x0E,0x80);          if(iRet<0)            return -1;                  // Polarity          iRet=I2C_write_ADV7181B(0x40,0x50,0x20);          if(iRet<0)            return -1;                     // NTSC V bit Begin            iRet=I2C_write_ADV7181B(0x40,0x52,0x18);          if(iRet<0)            return -1;         // NTSC V bit End         iRet=I2C_write_ADV7181B(0x40,0x58,0xED);          if(iRet<0)            return -1;                     // NTSC F Bit Toggle            iRet=I2C_write_ADV7181B(0x40,0x77,0xC5);          if(iRet<0)            return -1;                  // CTI DNR Ctrl 4         iRet=I2C_write_ADV7181B(0x40,0x7C,0x93);          if(iRet<0)            return -1;                  // Lock Count            iRet=I2C_write_ADV7181B(0x40,0x7D,0x00);          if(iRet<0)            return -1;                    // Extended Output Control            iRet=I2C_write_ADV7181B(0x40,0xD0,0x48);          if(iRet<0)            return -1;                  // Contrast Register         iRet=I2C_write_ADV7181B(0x40,0xD5,0xA0);          if(iRet<0)            return -1;                  // Brightness Register         iRet=I2C_write_ADV7181B(0x40,0xD7,0xEA);          if(iRet<0)            return -1;                // ADI Control        iRet=I2C_write_ADV7181B(0x40,0xE4,0x3E);          if(iRet<0)            return -1;                           // Contrast Register         iRet=I2C_write_ADV7181B(0x40,0xE9,0x3E);          if(iRet<0)            return -1;                  // Brightness Register         iRet=I2C_write_ADV7181B(0x40,0xEA,0x0F);          if(iRet<0)            return -1;                // ADI Control        iRet=I2C_write_ADV7181B(0x40,0x0E,0x00);          if(iRet<0)            return -1;    }      return 0;  }int main(){  int iRet,i,j;  unsigned char ch;  // 初始化视频I2C控制器  init_i2c(FREEDEV_I2C_0_BASE);    // 复位音频处理芯片  aic23_reset();  // 设置为旁路状态    aic23_analog_bypass_test();    printf("视频芯片配置...\n"); // init_ADV7181B(CVBS_AIN6);  //init_ADV7181B(S_VIDEO_AIN2_AIN4); // init_ADV7181B(CVBS_AIN6); init_ADV7181B(PAL_AIN6);//init_ADV7181B(PAL_AIN6);  printf("视频芯片配置OK!!!\n");   printf("测试NIOS编译OK!!!\n");   /*   //视频芯片状态  // ADV7181B revision  show_ADV7181B_reg(0x11);  // STATUS1  show_ADV7181B_reg(0x10);  // STATUS2  show_ADV7181B_reg(0x12);  // STATUS3  show_ADV7181B_reg(0x13);    */    while(1);}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -