📄 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 + -