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

📄 tbtx.c

📁 TI TMS320F206
💻 C
字号:
#include "tyclh.h"

volatile unsigned int *reg_point1,*reg_point2 ;
int	len;
unsigned	cc1,ccc[20];
struct StructKeyNode KeyNode;
Boolean	bNewSysRdData,bNewData,bNewKey;
int		nNewSysDataRdPreAdr;
/*long	nTbCount,nTbCountTxInt,nTbCountRxInt;*/

Boolean	bNewSysWrData,bRefurbish;
int		nNewSysDataWrPreAdr;
#define SOH		0x7e7e
#define SOH_REAPT	0x8181
#define	Make_TxCrc      nTbTxCrc ^=
#define	Make_RxCrc      nTbRxCrc ^=
extern      TbWrSysTab,TbRdSysTab;

unsigned int nTbRxCrc;
Boolean	 bTbRxSoh;
unsigned int nTbRxBegin,nTbRxEnd;
unsigned int nTbRxChBuf[256],nTbRxChLen,nTbRxCh[256];
 
Boolean      bTbTxSoh;
unsigned int nTbTxBegin,nTbTxEnd;
unsigned int nTbTxChBuf[256],nTbTxCh[256];
unsigned int nTbTxCrc;
void TbTranRxData();
void TbTx_Data();
/*--------------------------------------*/ 
void ReadRom(rom_area,ram_area,length)
unsigned int rom_area[],ram_area[],length;
{	len=length;
	reg_point2=ram_area;
	reg_point1=rom_area;
	
	asm("	MAR		*,AR4		");
	asm("	ldpk	_reg_point2	");
	asm("	LAR	AR4,_reg_point2");
	asm("	ldpk	_reg_point1	");
	asm("	lacc	_reg_point1	");
	asm("	RPT	_len	");
	asm("	TBLR	*+,AR4	");
	
}
/*--------------------------------------*/
void TbTxInit()
{long	i;
	
	bTbRxSoh=0;
	nTbRxChLen=0;
	nTbRxBegin=0;
	nTbRxEnd=0;
	bTbTxSoh=0;
	nTbTxBegin=0;
	nTbTxEnd=0; 
	reg_sspcr=0xcc0a;
	reg_sspcr=0xcc3a;
	bNewSysRdData=True;
	bNewData=bNewSysWrData=False;
	nNewSysDataRdPreAdr=0;
	nNewSysDataWrPreAdr=0;
/*	nTbCount=0;nTbCountTxInt=0;nTbCountRxInt=0;*/
}/*-------------------------------------*/
Boolean TbGetRxCrc(unsigned int nTbRxChar[])
/*nTbRxChar[],nTbRxChBuf[],nTbRxChLen,nTbRxBegin,nTbRxEnd ,bTbRxSoh*/
{
unsigned int k;
unsigned int nTbRxChPre;
  if(nTbRxBegin==nTbRxEnd) return(False);
  for(;nTbRxBegin!=nTbRxEnd;nTbRxBegin++,nTbRxBegin &=0x00ff)
  {  if(nTbRxChLen>256-1)
     { nTbRxChLen=0;
	 nTbRxCrc=0;
	 bTbRxSoh=False;
     }
     nTbRxChPre=nTbRxChBuf[nTbRxBegin];
     if(bTbRxSoh==True)
     {
	  if (nTbRxChPre==SOH)
	  {
	   if(nTbRxChLen > 2)
	   {
	      nTbRxChLen=0;
	      bTbRxSoh = False;
	      if(nTbRxCrc==0)
	       {return(True);}
	      nTbRxCrc = 0;
	      return(1);  /*break for, just finshed*/
	   }
	   else
	   {  nTbRxChLen=0;
	      nTbRxCrc=0;
	      bTbRxSoh=True;
	   }/*len*/
	}/*wait soh to again*/
	else if(nTbRxChLen>0 && nTbRxChPre==SOH_REAPT)
	{   bTbRxSoh=False ;		/*input SOH_REAPT*/
	    Make_RxCrc SOH;
	    nTbRxChar[nTbRxChLen]=SOH;/*in "7E"*/
	    nTbRxChLen++;

	}
	else/*  'bsoh=True*/
	{   nTbRxCrc=0;
	    nTbRxChar[0]=nTbRxChPre;	/*in first data*/
	    nTbRxChLen=1;
	    bTbRxSoh=False;
	    Make_RxCrc nTbRxChPre;
	}
     }/*soh */
     /*	'bsoh = False*/
     else if(nTbRxChPre==SOH)/*in first SOH*/
       {     bTbRxSoh=True;}
     else if(nTbRxChLen>0)
     {	 bTbRxSoh=False;
	 nTbRxChar[nTbRxChLen]=nTbRxChPre; /*input a byte*/
 	 nTbRxChLen++;
	 Make_RxCrc nTbRxChPre;
     }
   }/*end for*/
   return(False);
}/*-------------------------------------*/
Boolean TbSentTxCrc(unsigned int *Txdata,unsigned int Len)
/*user *nTbTxChBuff[],nTbTxBegin,nTbTxEnd*/
{
unsigned int  n,k,nTbTxChPre,nSaveTxEnd,*reg_p;
  nSaveTxEnd=nTbTxEnd;
  if(nTbTxBegin>nTbTxEnd){n=nTbTxBegin-nTbTxEnd;}
  else {n=256-nTbTxBegin+nTbTxEnd;}
  if(n<Len+6){return(False);}
  else
  { /* nTbTxChBuf[nTbTxEnd++]=0x7E; */

	nTbTxChBuf[nTbTxEnd]=SOH;
	nTbTxEnd++;nTbTxEnd &=0x00ff;
	nTbTxCrc=0;
	for(k=0;k<Len;k++)
	{ nTbTxChPre=*Txdata++;
	    if(nTbTxEnd==nTbTxBegin){nTbTxEnd=nSaveTxEnd;return(False);}
	    Make_TxCrc nTbTxChPre;
	    nTbTxChBuf[nTbTxEnd]=nTbTxChPre;
	    nTbTxEnd++;nTbTxEnd &=0x00ff;
	    if(nTbTxChPre ==SOH)
	    { if(nTbTxEnd==nTbTxBegin){nTbTxEnd=nSaveTxEnd;return(False);}
		nTbTxChBuf[nTbTxEnd]=SOH_REAPT;
		nTbTxEnd++;nTbTxEnd &=0x00ff;
	    }
	}
   }
	Make_TxCrc 0;
	if(nTbTxEnd==nTbTxBegin){nTbTxEnd=nSaveTxEnd;return(False);}
	nTbTxChBuf[nTbTxEnd]=nTbTxCrc;
	nTbTxEnd++;nTbTxEnd &=0x00ff;
	if(nTbTxChPre==SOH)
	{   if(nTbTxEnd==nTbTxBegin){nTbTxEnd=nSaveTxEnd;return(False);}
		nTbTxChBuf[nTbTxEnd]=SOH_REAPT;
		nTbTxEnd++;nTbTxEnd &=0x00ff;
		
	}
	for(k=0;k<3;k++)
	{
		if(nTbTxEnd==nTbTxBegin)
		{nTbTxEnd=nSaveTxEnd;return(False);}
		nTbTxChBuf[nTbTxEnd]=SOH;
		nTbTxEnd++;nTbTxEnd &=0x00ff; 
	}
	
	reg_p=(unsigned int *)reg_imr;
	if((*reg_p & 0x0010)==0)
	{*reg_p |=0x00010;}

	return(True);
}/*-------------------------------------*/
Boolean TbTranTxData(unsigned int command,unsigned int Len,unsigned int *info,unsigned int *nTxBuf)
{
unsigned int i,k,*reg_p;

  if(Len>256-1) return(False);
  *nTxBuf++=command;
  *nTxBuf++=Len;
  for(i=2;i<Len+2;i++)    {	*nTxBuf++=*info++;}
  nTxBuf=nTxBuf-Len-2;
  i=TbSentTxCrc(nTxBuf,Len+2);
  
  if(i==False)
    {reg_p=(unsigned int *)reg_imr;
	 if((*reg_p & 0x0010)==0)
	 {*reg_p |=0x00010;}
    }
	return(i);
}/*-------------------------------------*/
interrupt void TbTxInt()
{                           
unsigned int	i,flag_sspcr,*reg_p;
	reg_p=(unsigned int *)reg_ifr;
/*	nTbCountTxInt++;*/
	if(nTbTxBegin==nTbTxEnd)
	 	{ 	
			*reg_p |=0x0010; 
	 		reg_p=(unsigned int *)reg_imr;
			*reg_p &=0xffef;
	 		return;
		 }	
  if((reg_sspcr & 0x2000)==0)
   {
	for(i=0;i<4;i++)
	 {
	  if(nTbTxBegin==nTbTxEnd)
	 	{   reg_sdtr=SOH;
	 		
		 }
		else
		 { 	
	  		reg_sdtr=nTbTxChBuf[nTbTxBegin++];
	  		nTbTxBegin &=0x00ff;
	  	 }
	 }
	}
	*reg_p |=0x0010; 
}/*---------------------------------*/
interrupt void TbRxInt()
{   
unsigned int	iii,*reg_p;
/*	nTbCountRxInt++;*/
	reg_p=(unsigned int *)reg_ifr;
	if((reg_sspcr & 0x0080)!=0)	
	iii=0;
	cc1++;
	cc1 &=0xf; 
	iii=0; iii=0;
	while((reg_sspcr & 0x1000)!=0)
    {
     iii++;
     nTbRxChBuf[nTbRxEnd++]=reg_sdtr;
     nTbRxEnd &=0x00ff;
    } 
	ccc[cc1]=iii;
   *reg_p =0x0008; 
 
}/*---------------------------------*/
void RdSysData()                              
{unsigned nTab[5];
   ReadRom((unsigned *)((&TbRdSysTab)+nNewSysDataRdPreAdr),nTab,4);
   if(nTab[0]==0 )
    {nNewSysDataRdPreAdr=0;bNewSysRdData=False;
    bNewData=True;
  //  TbTranTxData(0x4444,1,nTbRxCh,nTbTxCh);
	return;}
   TbTranTxData(0x2200,4,nTab,nTbTxCh);  
}/*-------------------------------------*/
Boolean WrSysData()                              
{
unsigned int i,*reg_p,*info;
int	Len;
  ReadRom((unsigned *)((&TbWrSysTab)+nNewSysDataWrPreAdr),nTbTxCh+1,4);   
  if(nTbTxCh[1]==0)
   {nNewSysDataWrPreAdr=0;
    if(bRefurbish==True)
    TbTranTxData(0x4444,1,nTbRxCh,nTbTxCh);
    return;}
  Len=nTbTxCh[2];
  info=(unsigned *)nTbTxCh[1];
  reg_p=nTbTxCh;
  if(Len>256-1) return(False);
  *reg_p++=0x3355;
  *reg_p++=Len+3;
  reg_p+=3;
  for(i=5;i<Len+5;i++)    {	*reg_p++=*info++;}
  
  i=TbSentTxCrc(nTbTxCh,Len+5);
  
  if(i==False)
    {reg_p=(unsigned int *)reg_imr;
	 if((*reg_p & 0x0010)==0)
	 {*reg_p |=0x00010;
	 }
    }
  else nNewSysDataWrPreAdr+=4;
  return(i);   
}/*-------------------------------------*/
void TbTranRxData(int *nTime)
{
unsigned int	i;
unsigned int	*pd,*ps;
  i=TbGetRxCrc(nTbRxCh);	
  if(i==False) {return; }
  if(i==1)
   {
	TbTranTxData(0x1515,1,nTbRxCh,nTbTxCh);/*err*/
	return;
   }
  switch(nTbRxCh[0])
  {case 0x1515 :
    {
     *nTime=0x5555;
    
	}
   case 0x55aa :
      {
/*	  TbTranTxData(0x550a,4,nTbRxCh,nTbTxCh);
        pd=(unsigned int *)nTbRxCh[1];
        ps=nTbRxCh+3;
      	if(nTbRxCh[1]==0x1900)
      	for(i=0;i<20;i++)
      	{   if((unsigned int )pd<1800) 
      			{break;}
      		
      		*pd++=*ps++;
      	}
*/		break;
      }
   case 0x550a :
      {
       i=0;
	break;
	}
   case 0x3355 :
      {
		*nTime=0; 
		WrSysData(); 
		break; 
	  }
   case 0x2255 :          /*Claim New data*/
      { 

		bNewSysRdData=True;
		nNewSysDataRdPreAdr=0;
		RdSysData();nNewSysDataRdPreAdr+=4;
		*nTime=0;
	
		break;
      }
   case 0x2200 :          /**/
      {
		pd=(unsigned *)nTbTxCh[2];
		if((unsigned)pd<0x100)return;
		for(i=0,ps=nTbRxCh+4;i<nTbRxCh[3];i++)
		*pd++=*ps++;
/*if(nTbRxCh[2]==3299)
{if(!(nTbRxCh[4]==6666))
	{i=i;}}  */
		RdSysData();nNewSysDataRdPreAdr+=4;
		*nTime=0; 

		break;
      }
   case 0x4444	:
   		bRefurbish=False;
   		bNewSysWrData=False;
   		break;
   case 0x6666	:
   		KeyNode.nkey=nTbRxCh[2];
		KeyNode.nPageType=nTbRxCh[3];
		KeyNode.nCs=nTbRxCh[4];
		KeyNode.nPage=nTbRxCh[5];
		KeyNode.nCursor=nTbRxCh[6];
		KeyNode.nCursorPreLine=nTbRxCh[7];
		KeyNode.nCursorOldLine=nTbRxCh[8];
		KeyNode.nPageNo=nTbRxCh[9];
		KeyNode.nSerial=nTbRxCh[10];
		TbTranTxData(0x6666,1,nTbRxCh,nTbTxCh);
		bNewKey=True;
   default :{;break;}
  }
}/*-------------------------------------*/
void SysTb(int *nTime,unsigned nConstTime)
{   TbTranRxData(nTime);
/*	nTbCount++;
	if(nTbCount>177700)
	 {
	  if(nTbCountTxInt<10 || nTbCountRxInt<10)
	   {TbTxInit();}
	  else {nTbCountRxInt=0;nTbCountTxInt=0;}
	  	 nTbCount=0;
	 }
*/    if(bNewSysRdData && *nTime>300)
     {
	  RdSysData();*nTime=0;
     }                      
    if(bNewSysWrData && *nTime>400)
    {
     WrSysData();*nTime=0;
    }
    if(*nTime>nConstTime)
    {
     nNewSysDataWrPreAdr=0;*nTime=0;
     bNewSysWrData=True;
     WrSysData();
    }
    if(bNewSysWrData==False && bRefurbish==True)
    {
     nNewSysDataWrPreAdr=0;*nTime=0;bNewSysWrData=True;
     WrSysData();
    } 
}/*-------------------------------------*/
Boolean TbTranRdKey()
{
unsigned int i,k,*reg_p;
  reg_p=nTbTxCh;
  *reg_p++=0x6677;
  *reg_p++=8;
  *reg_p++=0;
  *reg_p++=0;
  *reg_p++=0;
  *reg_p++=0;
  *reg_p++=0;
  *reg_p++=0;
  *reg_p++=0;
  *reg_p++=0;
  i=TbSentTxCrc(nTbTxCh,10);
  bNewKey=False;
  if(i==False)
    {reg_p=(unsigned int *)reg_imr;
	 if((*reg_p & 0x0010)==0)
	 {*reg_p |=0x00010;
	 k=reg_sspcr;}
    }
   return(i);
}/*-------------------------------------*/   
void Txtest() 
{                            
unsigned int	a[30],i;
for(i=0;i<20;i++)a[i]=i;
TbTranTxData(0x55aa,10,a,nTbTxCh);
for(i=0;i<0x7ff;i++)
	a[0]=i;
for(i=0;i<0x7ff;i++)
	a[0]=i;
for(i=0;i<0x7ff;i++)
	a[0]=i;
}

⌨️ 快捷键说明

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