📄 syntest.c
字号:
// edit by chendong ,2004-3-10
#define M32 0xe6fa2560 //0000 0110 1010 0100 0101 1111 0110 0111
#define M15 0x4d78 //0001 1110 1011 001
#define M63H 0x4314f472 //0000 0111 1110 1010 1100 1101 1101 1010 0100 1110 0010 1111 0010 1000 1100 001
#define M63L 0x5bb357e0
#define DATATOSEND 0x0;
#include "vd.h"
#include "string.h"
#include "math.h"
#define SYN_ADDR_BASE 0x7fc8000
#define SYNNB_ADDR_BASE 0x7fc8000 //对读信号使用非缓冲区域
#define SYN_ADDR_TDATA (*(unsigned *)(SYN_ADDR_BASE+0x000))
#define SYN_ADDR_TQW (*(unsigned *)(SYN_ADDR_BASE+0x280))
#define SYN_ADDR_TECHO (*(unsigned *)(SYN_ADDR_BASE+0x2C0))
#define SYN_ADDR_TP1 (*(unsigned *)(SYN_ADDR_BASE+0x300))
#define SYN_ADDR_TP2 (*(unsigned *)(SYN_ADDR_BASE+0x340))
#define SYN_ADDR_TP3 (*(unsigned *)(SYN_ADDR_BASE+0x380))
#define SYN_ADDR_TBG (*(unsigned *)(SYN_ADDR_BASE+0x3C0))
#define SYN_ADDR_RDATA (*(unsigned *)(SYNNB_ADDR_BASE+0xC00))
#define SYN_ADDR_RQW (*(unsigned *)(SYNNB_ADDR_BASE+0xE80))
#define SYN_ADDR_RBG (*(unsigned *)(SYNNB_ADDR_BASE+0xFC0))
#define SYN_ADDR_TXDCNTCMP (*(volatile unsigned *)(SYN_ADDR_BASE+0x3E0))
#define SYN_ADDR_TXDCNTSET (*(volatile unsigned *)(SYN_ADDR_BASE+0x3E4))
#define SYN_ADDR_TXDSTATEWRB (*(volatile unsigned *)(SYN_ADDR_BASE+0x3E8))
#define SYN_ADDR_TXDSTATE (*(volatile unsigned *)(SYNNB_ADDR_BASE+0x7EC))
#define SYN_ADDR_INTSTATET (*(volatile unsigned *)(SYNNB_ADDR_BASE+0x7F0))
#define SYN_ADDR_ECHOADDR (*(volatile unsigned *)(SYN_ADDR_BASE+0xBE0))
#define SYN_ADDR_MLIMIT (*(volatile unsigned *)(SYN_ADDR_BASE+0xBE4))
#define SYN_ADDR_PNUM (*(volatile unsigned *)(SYNNB_ADDR_BASE+0xFE8))
#define SYN_ADDR_QWTCCNT (*(volatile unsigned *)(SYNNB_ADDR_BASE+0xFEC))
#define SYN_ADDR_ECHOCNT (*(volatile unsigned *)(SYNNB_ADDR_BASE+0xFF0))
#define SYN_ADDR_RXDSTATE (*(volatile unsigned *)(SYNNB_ADDR_BASE+0xFF4))
#define SYN_ADDR_INTSTATER (*(volatile unsigned *)(SYNNB_ADDR_BASE+0xFF8))
void syn_init(void);
void syn_test(void);
void extint1(void);
extern void uartsend(char data[]);
extern B32 ltoa(B32 value,char data[],B32 radix); //transfer value to string,radix=[2..36]
void timingint(B32 timetemp);
void qwtccnt(void);
void echocnt(void);
void qwerror(B32 temp3);
void echoerror(B32 temp3);
void perror(B32 temp3);
void pint(B32 temp3);
void statetest(B32 temp3);
void datatest(void);
void last(void);
extern char data[255];
B32 timelist[5880];
B32 timelist_i=0;
B32 nowstate;
B32 nowtosend;
B32 lastt0;
char datarecord[8192];
B32 times=0;
B32 cmp=0;
B32 nowtest=0;
void syn_init(void)
{
B32 temp;
temp=EXTACON1_C;
temp=temp&0xffff0000;
temp=temp|0x00000441;
EXTACON1_C=temp; //set EXTACON1 mode--tACS1=0cycle tACC1=2cycle tCOS1=1cycle tCOH1=1cycle
T0TMOD_C=0x00000000; //start timer0
T0TDATA_C=0xffffffff;
T0TMOD_C=0x00000001;
nowstate=0;
strcpy(datarecord,"");
//Initialization start
rIOPDATA=0xA0; //系统复位
//写入门限
SYN_ADDR_MLIMIT=0x073f1f0f; //61.29.13 仅此寄存器可在复位时写入
strcpy(data,"系统测试开始...\n\r");
uartsend(data);
temp=SYN_ADDR_TXDSTATE;
strcpy(data,"\n\rTXDSTATE=");
uartsend(data);
ltoa(temp,data,2);
uartsend(data);
temp=SYN_ADDR_INTSTATET;
strcpy(data,"\n\rINTSTATET=");
uartsend(data);
ltoa(temp,data,2);
uartsend(data);
temp=SYN_ADDR_PNUM;
strcpy(data,"\n\rPNUM=");
uartsend(data);
ltoa(temp,data,2);
uartsend(data);
temp=SYN_ADDR_QWTCCNT;
strcpy(data,"\n\rQWTCCNT=");
uartsend(data);
ltoa(temp,data,2);
uartsend(data);
temp=SYN_ADDR_ECHOCNT;
strcpy(data,"\n\rECHOCNT=");
uartsend(data);
ltoa(temp,data,2);
uartsend(data);
temp=SYN_ADDR_RXDSTATE;
strcpy(data,"\n\rRXDSTATE=");
uartsend(data);
ltoa(temp,data,2);
uartsend(data);
temp=SYN_ADDR_INTSTATER;
strcpy(data,"\n\rINTSTATER=");
uartsend(data);
ltoa(temp,data,2);
uartsend(data);
rIOPDATA=0x51; //use P0 to reset
SYN_ADDR_ECHOADDR=0x1; //写入地址,复位时写入则无效
uartsend("\n\r本机地址位为0x01");
uartsend("\n\r相关器门限为:63,31,15");
SYN_ADDR_TXDCNTCMP=0x0;
}
void syn_test(void)
{
B32 *point;
B32 i=0;
B32 datatosend=DATATOSEND;
uartsend("\n\r以下为写入存储器的内容:");
point=&SYN_ADDR_TDATA; //DATA
for(i=0;i<20;i++)
{
uartsend("\n\r@ 0x");
ltoa((int)point,data,16);
uartsend(data);
*point=M32;
ltoa(M32,data,16);
uartsend(" 0x");
uartsend(data);
point++;
*point=datatosend;
ltoa(datatosend,data,16);
uartsend(" 0x");
uartsend(data);
datatosend=datatosend+0x11111111;
point++;
*point=datatosend;
ltoa(datatosend,data,16);
uartsend(" 0x");
uartsend(data);
datatosend=datatosend+0x11111111;
point++;
*point=datatosend;
ltoa(datatosend,data,16);
uartsend(" 0x");
uartsend(data);
datatosend=datatosend+0x11111111;
point++;
*point=datatosend;
ltoa(datatosend,data,16);
uartsend(" 0x");
uartsend(data);
datatosend=datatosend+0x11111111;
point++;
*point=datatosend;
ltoa(datatosend,data,16);
uartsend(" 0x");
uartsend(data);
datatosend=datatosend+0x11111111;
point++;
*point=datatosend;
ltoa(datatosend,data,16);
uartsend(" 0x");
uartsend(data);
datatosend=datatosend+0x11111111;
point++;
*point=datatosend;
ltoa(datatosend,data,16);
uartsend(" 0x");
uartsend(data);
datatosend=datatosend+0x11111111;
point++;
}
point=&SYN_ADDR_TQW; //QW
uartsend("\n\r@ 0x");
ltoa((int)point,data,16);
uartsend(data);
*point=M63L;
ltoa(M63L,data,16);
uartsend(" 0x");
uartsend(data);
point++;
*point=M63H;
ltoa(M63H,data,16);
uartsend(" 0x");
uartsend(data);
for(i=0;i<7;i++)
{
point++;
*point=datatosend;
ltoa(datatosend,data,16);
uartsend(" 0x");
uartsend(data);
datatosend=datatosend+0x11111111;
}
point=&SYN_ADDR_TECHO; //ECHO
uartsend("\n\r@ 0x");
ltoa((int)point,data,16);
uartsend(data);
*point=M15|0x80000000;
ltoa(M15|0x80000000,data,16);
uartsend(" 0x");
uartsend(data);
point++;
*point=0x03;
ltoa(0x03,data,16);
uartsend(" 0x");
uartsend(data);
point=&SYN_ADDR_TP1; //P1
uartsend("\n\r@ 0x");
ltoa((int)point,data,16);
uartsend(data);
*point=0xb287;
ltoa(0xb287,data,16);
uartsend(" 0x");
uartsend(data);
/*
point=&SYN_ADDR_TP2; //P2
uartsend("\n\r@ 0x");
ltoa((int)point,data,16);
uartsend(data);
*point=0x13287;
ltoa(0x13287,data,16);
uartsend(" 0x");
uartsend(data);
point=&SYN_ADDR_TP3; //P3
uartsend("\n\r@ 0x");
ltoa((int)point,data,16);
uartsend(data);
*point=0x03287;
ltoa(0x03287,data,16);
uartsend(" 0x");
uartsend(data);
*/
point=&SYN_ADDR_TBG; //BG
uartsend("\n\r@ 0x");
ltoa((int)point,data,16);
uartsend(data);
*point=0x76543210;
ltoa(0x76543210,data,16);
uartsend(" 0x");
uartsend(data);
point++;
*point=0xfedcba98;
ltoa(0xfedcba98,data,16);
uartsend(" 0x");
uartsend(data);
uartsend("\n\r");
uartsend("\n\r#测试1:系统定时中断测试\n\r");
nowstate=0x0;
nowtosend=0x14;
cmp=0x20000000;
cmp=cmp|(nowtosend<<24);
SYN_ADDR_TXDSTATEWRB=0x1<<20;
nowtosend=0x16;
SYN_ADDR_TXDCNTCMP=cmp;
while(TRUE)
{
;
}
}
void extint1(void)
{
B32 temp1,temp2,temp3,timetemp;
temp1=SYN_ADDR_INTSTATET;
temp2=SYN_ADDR_INTSTATER;
temp1=temp1&0x1;
temp2=temp2&0x1e;
temp3=temp1|temp2;
timetemp=T0TCNT_C;
if(temp1==1) //中断时钟处理
{
cmp=cmp&0xffffff;
switch(nowstate)
{
case 0:
{
cmp=cmp+11136;
nowtosend=0x16;
break;
}
case 1:
{
cmp=cmp+3488;
nowtosend=0x18;
break;
}
case 2:
{
cmp=cmp+1248;
nowtosend=0x1a;
break;
}
case 3:
{
cmp=cmp+1248;
nowtosend=0x1c;
break;
}
case 4:
{
cmp=cmp+1248;
nowtosend=0x1e;
break;
}
case 5:
{
cmp=cmp+2112;
nowtosend=0x0;
break;
}
case 195:
{
cmp=cmp+8192;
nowtosend=0x14;
break;
}
default:
{
cmp=cmp+8192;
nowtosend++;
if(nowtosend==0x14)
nowtosend=0x0;
}
}
if(cmp==0xf0a000)
{
cmp=cmp&0x0;
uartsend("%");
}
cmp=cmp|0x20000000;
cmp=cmp|(nowtosend<<24);
SYN_ADDR_TXDCNTCMP=cmp;
nowstate++;
if(nowstate==196)
nowstate=0;
switch(nowtosend)
{
case 0x14:
{
SYN_ADDR_TXDSTATEWRB=0x1<<20;
break;
}
case 0x16:
{
SYN_ADDR_TXDSTATEWRB=0x1<<21;
break;
}
case 0x18:
{
SYN_ADDR_TXDSTATEWRB=0x1<<22;
break;
}
case 0x1a:
{
SYN_ADDR_TXDSTATEWRB=0x1<<23;
break;
}
case 0x1c:
{
SYN_ADDR_TXDSTATEWRB=0x1<<24;
break;
}
case 0x1e:
{
SYN_ADDR_TXDSTATEWRB=0x1<<25;
break;
}
default:
SYN_ADDR_TXDSTATEWRB=0x1<<nowtosend;
}
}
if(temp1==1)
switch(nowtest)
{
case 0:
{
timingint(timetemp);
break;
}
case 1:
{
qwtccnt();
break;
}
case 2:
{
echocnt();
break;
}
case 3:
{
qwerror(temp3);
break;
}
case 4:
{
echoerror(temp3);
break;
}
case 5:
{
perror(temp3);
break;
}
case 6:
{
pint(temp3);
break;
}
case 7:
{
statetest(temp3);
break;
}
case 8:
{
datatest();
break;
}
default:
{
last();
}
}
switch(temp3)
{
case 0x00:
{
strcpy(data,"\n\r未知中断发生!\n\r");
uartsend(data);
break;
}
case 0x01:
{
//uartsend("#");
break;
}
case 0x02:
{
//strcpy(data,"\n\rechoerror中断发生!\n\r");
uartsend("&");
break;
}
case 0x04:
{
//strcpy(data,"\n\rqwerrorint中断发生!\n\r");
uartsend("*");
break;
}
case 0x08:
{
//strcpy(data,"\n\rbgint2中断发生!\n\r");
uartsend("+");
break;
}
case 0x10:
{
//strcpy(data,"\n\rbginterror中断发生!\n\r");
uartsend("=");
break;
}
default:
{
//strcpy(data,"\n\r多种中断发生!\n\r");
uartsend(">");
//ltoa(temp3,data,2);
//uartsend(data);
}
}
}
void timingint(B32 timetemp)
{
timelist[timelist_i]=lastt0-timetemp;
lastt0=timetemp;
timelist_i++;
if(timelist_i==5880)
{
SYN_ADDR_TXDCNTCMP=0x0; //暂停定时中断,输出数据;
for(timelist_i=0;timelist_i<5880;timelist_i++)
{
if(timelist_i%196==0)
{
uartsend("\n\r");
}
uartsend("\tΔT0=");
ltoa(timelist[timelist_i],data,10);
uartsend(data);
}
nowtest++;
uartsend("\n\r#测试2:勤务帧TC定时测试\n\r");
uartsend("\n\r# 勤务帧TC定时测量数据应该为1576960\n\r");
uartsend("\n\r# 勤务帧发送周期为1576960\n\r");
//SYN_ADDR_TXDSTATEWRB=0x100000;
nowstate=0;
nowtosend=0x16;
timelist_i=0;
cmp=0x0;
SYN_ADDR_TXDCNTCMP=0x34000000;
}
}
void qwtccnt(void)
{
if(nowstate==0) //下一帧发送勤务帧
{
rIOPDATA=rIOPDATA^0xf2;
}
if(nowstate==2) //勤务帧发送完毕后的下一帧
{
timelist[timelist_i]=SYN_ADDR_QWTCCNT&0xffffff;
timelist_i++;
}
if(timelist_i==30)
{
SYN_ADDR_TXDCNTCMP=0x0; //暂停定时中断,输出数据;
for(timelist_i=0;timelist_i<30;timelist_i++)
{
if(timelist_i%10==0)
{
uartsend("\n\r");
}
uartsend("\tTCCNT=");
ltoa(timelist[timelist_i],data,10);
uartsend(data);
}
nowtest++;
uartsend("\n\r#测试3:ECHO测量计时测试\n\r");
uartsend("\n\r 测量值为:发送的第一bit开始,到完全接收数据。\n\r");
uartsend("\n\r ECHO测量的数据应该为2293");
uartsend("\n\r 数据为35*2bit,接收延迟1.5bit(位同步部分),5个时钟的发送延迟:(35*2+1.5)*32+5=2293");
uartsend("\n\r 发送端start信号后从1开始计数,stop信号出现后又会延迟一个时钟停止,所以是2295");
timelist_i=0;
//SYN_ADDR_TXDSTATEWRB=0x100000;
nowstate=0;
nowtosend=0x16;
timelist_i=0;
cmp=0x0;
SYN_ADDR_TXDCNTCMP=0x34000000;
}
}
void echocnt(void)
{
if(nowstate==2) //勤务帧发送完毕后的下一帧
{
timelist[timelist_i]=SYN_ADDR_ECHOCNT&0xffff;
timelist_i++;
}
if(timelist_i==30)
{
SYN_ADDR_TXDCNTCMP=0x0; //暂停定时中断,输出数据;
for(timelist_i=0;timelist_i<30;timelist_i++)
{
if(timelist_i%10==0)
{
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -