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

📄 work.c

📁 这也是本人参与实验室项目编写的实现dvb-mpeg2码流解复用中和码流相关的源代码
💻 C
字号:
/***************************************************************************/
/*                                                                         */
/*     work . C                                                            */
/*                                                                         */
/*                                                                         */
/***************************************************************************/



/***************************************************************************/

#include "54regs.h"			//54寄存器定义
#include "defdef.h"			//宏定义
#include "stdio.h"

/***************************************************************************/



/***************************************************************************/
/*                                                                         */
/*     定义函数		                                                       */
/*                                                                         */
/*                                                                         */
/*                                                                         */
/***************************************************************************/



void initial(void);              //系统初始化
void resetfifo(void);            //各FIFO清零
void loaddata(void);             //搬移数据(A000H---7000H)
void readin(void);
int  getpid(int a ,int b);
void pcr_to_fpga();
void padding1(void);             //给各FIFO填空包
void padding2(void);
void padding3(void);
void padding4(void);
void padding5(void);
void padding6(void);
void padding7(void);




/***************************************************************************/



//变量
/***************************************************************************/
int receiveTS[0x1000];                  //存放读取的TS流
int ramdata[0x1000];                    //存放RAM搬移数据(A000H---)
int pid;                          //读取ts流的pid值
int tempdata;                     //临时读取的数据,判断节目是否改变                                      
int halfflag;                     //半满标志
int cycnum;                       //分发七个包时设置为循环变量 0--7
int incnum;                       //分发七个包时设置为增长变量 0--1504
int ii;                           //主函数中所用循环变量,子函数中用i 
int siflag=0;                     //标志是否正在上传SI信息
int sinum;                        //计上传SI包数
int siaddr;                       //上传SI包起始地址
int tsflag=0;                     //标志读取的TS流是否已上传
/***************************************************************************/



void main()
{//main

   
   initial();            //系统初始化
   resetfifo();          //各FIFO清零
   loaddata();           //搬移数据(A000H---7000H)
   
   pcr_to_fpga();
   
   padding1();           //给各FIFO填空包
   padding2();
   padding3();
   padding4();
   padding5();
   padding6();
 
   

pro_work:
  
   //tsflag=0;
   
   PtoD(0x8001,&tempdata,0);
   PtoD(0x8002,&tempdata,0);
   PtoD(0x8003,&tempdata,0);
   PtoD(0x8000,&tempdata,0);   //判断节目是否改变  
   if(tempdata==0x0055)
      {
         //tempdata=0;
         loaddata();
         tempdata=0;
         DtoP(0x8000,&tempdata,0);
      }
  
     padding7();
     
     
   halfflag=porte006;           //读取半满标志
   
   if(halfflag==0x0001)
      padding1();
   if(halfflag==0x0002)
      padding2();
   if(halfflag==0x0004)
      padding3();
   if(halfflag==0x0008)
      padding4();
   if(halfflag==0x0010)
      padding5();
   if(halfflag==0x0020)
      padding6(); 
      
      
                  //判断IN_FIFO是否半满
                         //值为0x0040时未半满
                          //半满时读取
    halfflag=porte006;
    if(halfflag==0x0040)
       goto  pro_work;

    
     
    
    
     for(;;)             //读取同步
    {
   
    receiveTS[0]=port00;
    receiveTS[0]=receiveTS[0]&0x80ff;
    if(receiveTS[0]==0x8047)
      break;
    
    } 
    
    
    readin();       //开始数据的读取放到receiveTS[]中

    incnum=0;
  
    for(cycnum=0;cycnum<8;cycnum++)
  
    {    //开始分发八个TS包  
    
      tsflag=0;
      pid=getpid(receiveTS[incnum+1],receiveTS[incnum+2]);
           
           
//**********判断MCU提供的各路节目的PID,各ES的PID与AR0是否相同,分发TS包

  
            if ((tsflag==0)&((pid==ramdata[0x11])||
                (pid==ramdata[0x12])||
                (pid==ramdata[0x13])))
               {
                    for(ii=0;ii<188;ii++)
                    {
                       port01=receiveTS[incnum++];                  
                    }
                    
                    tsflag=1;
               }
               
               
            if ((tsflag==0)&((pid==ramdata[0x21])||
                (pid==ramdata[0x22])||
                (pid==ramdata[0x23])))
               {
                    for(ii=0;ii<188;ii++)
                    {
                       port02=receiveTS[incnum++];                  
                    }
                    
                    tsflag=1;
               } 
             
             
            if ((tsflag==0)&((pid==ramdata[0x31])||
                (pid==ramdata[0x32])))
               {
                    for(ii=0;ii<188;ii++)
                    {
                       port03=receiveTS[incnum++];                  
                    }
                    
                    tsflag=1;
               }                         
             
             
            if ((tsflag==0)&((pid==ramdata[0x41])||
                (pid==ramdata[0x42])))
               {
                    for(ii=0;ii<188;ii++)
                    {
                       port04=receiveTS[incnum++];                  
                    }
                    
                    tsflag=1;
               }
             
             
            if ((tsflag==0)&((pid==ramdata[0x51])||
                (pid==ramdata[0x52])))
               {
                    for(ii=0;ii<188;ii++)
                    {
                       port05=receiveTS[incnum++];                  
                    }
                    
                    tsflag=1;
               }    
                          
             
            if ((tsflag==0)&((pid==ramdata[0x61])||
                (pid==ramdata[0x62])))
               {
                    for(ii=0;ii<188;ii++)
                    {
                       port06=receiveTS[incnum++];                  
                    }
                    
                    tsflag=1;
               } 
               
                 
               
            if ((tsflag==0)&(pid==0x1fff))
               {
    
                    
                    incnum=incnum+188;   //丢包处理
                    tsflag=1;
                    
               }               
               
               
//**********分发MCU提供的PAT、PMT表


            if ((tsflag==0)&(pid==0))
               {
                    for(ii=0;ii<376;ii++)
                    {
                       port01=ramdata[0x0100+ii]; 
                       port02=ramdata[0x0300+ii];
                       port03=ramdata[0x0500+ii];
                       port04=ramdata[0x0700+ii];
                       port05=ramdata[0x0900+ii];
                       port06=ramdata[0x0b00+ii];                       
                    }
                    
                    tsflag=1;
                    incnum=incnum+188;   //丢包处理
                    
               }
               
               
           
//**********上传SI包(每50包通知MCU读取一次)
            if ((tsflag==0)&((pid==ramdata[0x05])||
                (pid==ramdata[0x06])||
                (pid==ramdata[0x07])||
                (pid==ramdata[0x08])||
                (pid==ramdata[0x09])))
                
                {
                   if (siflag==0)
                   
                      {  
                        sinum=0;  
                        siaddr=0x9100; 
                        siflag=1;                  
                      }     //如果没有在上传SI信息,则将上传参数初始化
                     
                   // siflag=1;                                                                                     
                   
                       for(ii=0;ii<188;ii++)
                       {
                          DtoP(siaddr++,&receiveTS[incnum++],0);                  
                       }
                    
                    sinum++;
                    
                      if(sinum==40)
                        {
                         
                            tempdata=0x9100;
                            DtoP(0x0ffff,&tempdata,0);
  
                        }
                      
                     if(sinum==80)
                       {
                          tempdata=0x0ae60;
                          DtoP(0x0ffff,&tempdata,0);
                          
                          //sinum=0;  
                          //siaddr=0x9100; 
                          siflag=0;                         
                       }
                       
                       tsflag=1;

                 }
                 
                 
                 
            if(tsflag==0)
            incnum=incnum+188;   //丢包处理
            
  
  
  
    } //分发八个TS包结束              
  
    goto pro_work;   

}//main





void initial()
{



/**初始化系统**************/

/**配置C5402系统寄存器*****/

			   asm ("   STM		#0x2f92,SWWSR	");
			   ////*SWWSR=0x2f92;         //0010 1111 1001 0010
			   asm ("   STM     #0x0002,BSCR	");                       //I/O等待2个时钟,数据和程序空间无等待???
               ////*BSCR=0x0000;          //为块切换等待0个时钟
               asm ("   STM		#0x0ffe8,PMST	");
               //*PMST=0x0ffe8;
		       ////*PMST=0xffe8;          //0x17e8=0001 0111 1110 1000
		                                //0x1780=0001 0111 1000 0000
		       //*ST0=0x1800;           //复位数据页指针,DP数据存储器页面指针
		       //*ST1=0x2900;           //0001 1000 0000 0000
		                              //0010 1001 0000 0000 两者均为复位后的值
                                      //屏蔽全局中断
    
/**使所有的中断无效*******/
		         asm ("   STM    #0x0000,IMR	");
		         asm ("   STM    #0x0FFFF,IFR	");
		                              //INTM已通过ST1初始化置1
				////*IMR=0x0000;          //屏蔽所有的中断
				////*IFR=0x0FFFF;         //清除中断标志寄存器
				
/**时钟方案选择***********/
                
			    asm ("   STM		#0x9007,CLKMD	");
				////*CLKMD=0x9007;        //设置DSP时钟到160MHz 6.25ns
				                      //1001 0000 0000 0111 
				                      //工作在PLL模式,PLL模式开
				                      //PLL计数器为0  乘法系数为10

/**设置定时器控制寄存器***/
                asm ("   STM		#0x0010,TCR	  ");
			    ////*TCR=0x0010;          //片内定时器0停止


}




void resetfifo()
{
 
 porte005=0x8011;

}



void loaddata()
{
    int data;
    int start=0x0a000;
    int i;
    for(i=0;i<0x1000;i++)
    {
       
   	   PtoD(start,&data,0);
   	   ramdata[i]=data;
   	   start++;
   	   
   	 }                               

}



void readin()
{
   int i;
   for(i=1;i<1504;i++)
   {
     receiveTS[i]=port00;  
   }
}



int getpid(int a ,int b)

{   int apid;
    int bpid;
    apid=a<<8;
    bpid=b;
    apid=(apid|bpid)&0x1fff;
    return apid;
}

void pcr_to_fpga()
{
    portf000=ramdata[0x2];
    portf000=ramdata[0x3];
    portf000=ramdata[0x4];
    portf000=ramdata[0x5];
    portf000=ramdata[0x6];
    portf000=ramdata[0x7];
    portf000=ramdata[0x8];
    portf000=ramdata[0x9];
    portf000=ramdata[0x0a];
    portf000=ramdata[0x0b];
    portf000=ramdata[0x0c];
    portf000=ramdata[0x0d];
}
  

void padding1()
{ 
   int i;
   port01=0x8047;
   port01=0x001f;
   port01=0x00ff;
   port01=0x0010;
   
   for(i=0;i<184;i++)
     {
     port01=0x00ff;
     }
}




void padding2()
{  
   int i;
   port02=0x8047;
   port02=0x001f;
   port02=0x00ff;
   port02=0x0010;
   
   for(i=0;i<184;i++)
     {
     port02=0x00ff;
     }

}




void padding3()
{  
   int i;
   port03=0x8047;
   port03=0x001f;
   port03=0x00ff;
   port03=0x0010;
   for(i=0;i<184;i++)
     {
     port03=0x00ff;
     }
}




void padding4()
{  
   int i;
   port04=0x8047;
   port04=0x001f;
   port04=0x00ff;
   port04=0x0010;
   
   for(i=0;i<184;i++)
     {
     port04=0x00ff;
     }

}




void padding5()
{ 
   int i;
   port05=0x8047;
   port05=0x001f;
   port05=0x00ff;
   port05=0x0010;
   
   for(i=0;i<184;i++)
     {
     port05=0x00ff;
     }

}




void padding6()
{  
   int i;
   port06=0x8047;
   port06=0x001f;
   port06=0x00ff;
   port06=0x0010;
   
   for(i=0;i<184;i++)
     {
     port06=0x00ff;
     }

}





void padding7()
{ 
   int i;
   port07=0x8047;
   port07=0x001f;
   port07=0x00ff;
   port07=0x0010;
   
   //for(i=0;i<184;i++)
   for(i=0;i<4;i++)
     {
     port07=0x00ff;
     }
}



⌨️ 快捷键说明

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