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

📄 video_software.c

📁 use of NIOS PIO to simulate I2C bus,to initial TVP5150
💻 C
字号:
#include <io.h>
#include <stdio.h>
#include <system.h>
#include <alt_types.h>
#include "altera_avalon_pio_regs.h"

#define DELAY_TIME 4
#define TVP5150_ADD 0xba

#define Set_SDA  IOWR_ALTERA_AVALON_PIO_DATA(SDA_BASE, 0x1)
#define Clr_SDA  IOWR_ALTERA_AVALON_PIO_DATA(SDA_BASE, 0x0)
#define Set_SCL  IOWR_ALTERA_AVALON_PIO_DATA(SCL_BASE, 0x1)
#define Clr_SCL  IOWR_ALTERA_AVALON_PIO_DATA(SCL_BASE, 0x0)

void delay(unsigned int value)
{
   unsigned int i;
   for(i=0;i<value;i++)
      ;
}

void I2C_Start(void)
{
/*   SDA -------_________
     SCL ------------____ */
  IOWR_ALTERA_AVALON_PIO_DIRECTION(SDA_BASE, 0x1);
  IOWR_ALTERA_AVALON_PIO_DIRECTION(SCL_BASE, 0x1);  
  Set_SDA;   //SDA = 1
  Set_SCL;   //SCL = 1        
  delay(DELAY_TIME);  
  Clr_SDA;   //SDA = 0     
  delay(DELAY_TIME);  
  Clr_SCL;   //SCL = 0      
  delay(DELAY_TIME);
}

void I2C_Send_Byte(unsigned char d)
{   
/*                 MSB
    SDA  ______-------------__________
  
    SCL  _________-------_____________ */ 
   unsigned char i = 8; 
   IOWR_ALTERA_AVALON_PIO_DIRECTION(SDA_BASE, 0x1);
   IOWR_ALTERA_AVALON_PIO_DIRECTION(SCL_BASE, 0x1);
   Clr_SDA;
   Clr_SCL;
   delay(DELAY_TIME); 
   while( i-- )
   { 
     if (d&0x80) 
        Set_SDA;           
     else 
        Clr_SDA;    
     delay(DELAY_TIME); 
     Set_SCL;   
     delay(DELAY_TIME);     
     Clr_SCL; 
     delay(1);
     Clr_SDA;  
     delay(DELAY_TIME); 
     d = d << 1;
   }
}

void Check_Ack(void)
{
 /*   SDA ____zzzzzzzzzzzzz
      SCL ____------_______ */
   unsigned char a=1;
   IOWR_ALTERA_AVALON_PIO_DIRECTION(SDA_BASE, 0x0);
   IOWR_ALTERA_AVALON_PIO_DIRECTION(SCL_BASE, 0x1); 
   Set_SDA;   // SDA = "Z"  for input model
   delay(DELAY_TIME);
   Set_SCL;   // SCL = 1
   delay(DELAY_TIME);
   a=IORD_ALTERA_AVALON_PIO_DATA(SDA_BASE);
   delay(DELAY_TIME);
/* Clr_SCL;
   delay(DELAY_TIME); 
   if(a==1)
      printf("not receive ack\n");
   else
      printf("receive ack\n"); */
   while(a)
   {
     a=IORD_ALTERA_AVALON_PIO_DATA(SDA_BASE);
     delay(DELAY_TIME);
   } 
   Clr_SCL;
   delay(40);
}

void I2C_Stop(void)
{
 /*   SDA _________--------
      SCL ____------------- */
  IOWR_ALTERA_AVALON_PIO_DIRECTION(SDA_BASE, 0x1);
  IOWR_ALTERA_AVALON_PIO_DIRECTION(SCL_BASE, 0x1);      
  Clr_SDA;  //SDA = 0 
  Clr_SCL;  //SCL = 0    
  delay(DELAY_TIME);  
  Set_SCL;  //SCL = 1         
  delay(DELAY_TIME);   
  Set_SDA;  //SDA = 1
  delay(DELAY_TIME); 
  Clr_SCL;  //SCL = 0    
  delay(DELAY_TIME);  
}


unsigned char I2C_Receive_Byte(void)
{
   unsigned char rn = 8, data=0,rr=0x80;
   IOWR_ALTERA_AVALON_PIO_DIRECTION(SDA_BASE, 0x0);  //input model
   IOWR_ALTERA_AVALON_PIO_DIRECTION(SCL_BASE, 0x1);
   Clr_SCL;
   Set_SDA;   //SDA = "Z"
   delay(DELAY_TIME);
   for(;rn!=0;rn--)
   {
      Set_SCL;
      delay(DELAY_TIME);
      if (IORD_ALTERA_AVALON_PIO_DATA(SDA_BASE)) 
          data|=rr;
      else
          data&=~rr;
      delay(DELAY_TIME);
      rr>>=1;
      Clr_SCL;
      delay(DELAY_TIME);
   }
   return data;
}

void I2C_Ack(void)
{
 /*   SDA _________________
      SCL ____------_______ */
  IOWR_ALTERA_AVALON_PIO_DIRECTION(SDA_BASE, 0x1);
  IOWR_ALTERA_AVALON_PIO_DIRECTION(SCL_BASE, 0x1);
  Clr_SDA;  
  delay(DELAY_TIME);
  Set_SCL;
  delay(DELAY_TIME);
  Clr_SCL;
  delay(DELAY_TIME);
}

void I2C_Nack(void)
{
 /*   SDA ___--------_____
      SCL ____------_______ */
  IOWR_ALTERA_AVALON_PIO_DIRECTION(SDA_BASE, 0x1);
  IOWR_ALTERA_AVALON_PIO_DIRECTION(SCL_BASE, 0x1); 
  Set_SDA;
  delay(DELAY_TIME); 
  Set_SCL;
  delay(DELAY_TIME); 
  Clr_SCL;
  delay(1); 
  Clr_SDA;
  delay(DELAY_TIME);
}

void tvp5150_wr(unsigned char main_add, unsigned char sub_add,unsigned char data )
{
     I2C_Start();
     I2C_Send_Byte(main_add);
     Check_Ack();
     I2C_Send_Byte(sub_add);
     Check_Ack();
     I2C_Send_Byte(data);
     Check_Ack();
     I2C_Stop();
}

unsigned char tvp5150_rd(unsigned char main_add,unsigned char sub_add)
{
    unsigned char rd_data;
    I2C_Start();
    I2C_Send_Byte( main_add );
    Check_Ack();
    I2C_Send_Byte( sub_add );
    Check_Ack();
    I2C_Stop();
    I2C_Start();
    I2C_Send_Byte( main_add+1 );
    Check_Ack();
    rd_data=I2C_Receive_Byte();
    I2C_Nack();
    I2C_Stop();
    return rd_data;
}

unsigned char saa7121_rd(unsigned char main_add,unsigned char sub_add)
{
    unsigned char rd_data;
    I2C_Start();
    I2C_Send_Byte( main_add );
    Check_Ack();
    I2C_Send_Byte( sub_add );
    Check_Ack();
/*    I2C_Stop();
    I2C_Start();
    I2C_Send_Byte( main_add );
    Check_Ack();*/
    rd_data=I2C_Receive_Byte();
    //I2C_Nack();
    I2C_Ack();
    I2C_Stop();
    return rd_data;
}

unsigned char tvp5150_init(void)
{
     unsigned char buff=0x00;
     
     tvp5150_wr(TVP5150_ADD,0x00,0x00);  //AIP1A selected  --default
     if(tvp5150_rd(TVP5150_ADD,0x00)==0x00)
        buff|=0x01;
     else 
        buff&=0xfe; 
         
     tvp5150_wr(TVP5150_ADD,0x03,0x0d);  //Enables the YCbCr output data, HSYNC, VSYNC/PALI, AVID, and FID/GLCO
     if(tvp5150_rd(TVP5150_ADD,0x03)==0x0d)
        buff|=0x02;
     else 
        buff&=0xfd;  
           
     tvp5150_wr(TVP5150_ADD,0x04,0xc0);  //Unmask NTSC-443, PAL-N, and PAL-M from the autoswitch process
     if(tvp5150_rd(TVP5150_ADD,0x04)==0xc0)
        buff|=0x04; 
     else 
        buff&=0xfb;
      
     tvp5150_wr(TVP5150_ADD,0x0d,0x40);  //Enables 8-bit 4:2:2 YCbCr with discrete sync output
     if(tvp5150_rd(TVP5150_ADD,0x0d)==0x40)
        buff|=0x08; 
     else 
        buff&=0xf7;
     return (buff);
}

int main(void)
{
   unsigned char temp=0x00;
   while(1)
   {
     temp=tvp5150_init();
     if(temp==0x0f)
     {
        temp=0x00;
        printf("TVP5150 initial is success!\n");
     }
     else 
     {
        temp=0x00;
        printf("TVP5150 initial is failed\n");     
     }
     delay(5000);
   }
}

⌨️ 快捷键说明

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