?? work.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 + -