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

📄 syntest.c

📁 sl811hs 的驱动
💻 C
📖 第 1 页 / 共 2 页
字号:
// 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 + -