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

📄 protocol.c.bak

📁 dsp tmslf2407a 汇编,c的原代码,包括i2c,scitimer,fir等的很多程序.
💻 BAK
📖 第 1 页 / 共 5 页
字号:
            	{
            		pcdata[0] = n_b+1+7;
            		pcdata[1] = deviceAddr;
            		pcdata[2] = ISO_MANDATORY_CMD;
            		pcdata[3] = OK;
            		pcdata[4] = n_b;
            		for(i=0;i<(n_b+1);i++) {pcdata[i+5] = viccdata[i+2];}
            		wr_crc_resp();
            	}
            	else                           
            		resp_iso_err();            			
         	}
      	}
   	}   	
}
void invReadMulBlock()	//冲撞读取多块
{   	
   	uchar i,j,k,l;             
   	uchar addr,num_card;
   	uchar flags =0; 
   	uint m; 
   	uint db_n,db_adr;
   
   	addr = pcdata[1];
   	db_adr = pcdata[5];
   	db_n = pcdata[6];
   	myInvOut();     			     		
	if( labeldata[0] != 0 )
	{
		num_card = labeldata[0];		      		
		pcdata[0] = 5+num_card*(1+8+5*(db_n+1))+2;
		pcdata[1] = deviceAddr;
		pcdata[2] = 0xb0;	
		pcdata[3] = OK;
		pcdata[4] = num_card;
			      		
		flags = ISOFlagsSys&0xfb;	// not inventory
		flags |= 0x20;			// address_flag	,no security
		if((ISOModeSys & 0x04) == 0x04) { flags |= 0x40; }// option_flag,TI卡为1才能操作
		for(i=0;i<num_card;i++)	// read multiple blocks
		{
			viccdata[0] = 15;     	//len
			viccdata[1] = flags;    //flags
			viccdata[2] = 0x23;	//cmd
			for(j=0;j<8;j++)	// copy uid		
				viccdata[3+j] = labeldata[i*10+10-j];

			viccdata[11] = db_adr;	//start addr
			viccdata[12] = (db_n+1);// length
			wr_crc_send();                                                    
			
			ISOMode = ISOModeSys&0xe7;	//read ,all				
			m = sendISOCmd();
			CS_RAM_1;
			pcdata[i*((db_n+1)*5+9)+5] = 0x04;	//db-size;
			for(k=0;k<8;k++)
			{
				pcdata[i*((db_n+1)*5+9)+6+k] = labeldata[i*10+3+k];//copy uid
			}
			for(k=0;k<(db_n+1)*5;k++)	//copy block data
			      	pcdata[i*((db_n+1)*5+9)+14+k] = viccdata[2+k];
		} 
		if( deviceAddr == addr )wr_crc_resp();	//本机地址执行返回数据
	}	
	else if( labeldata[0] == 0 )
		resp_no_trns();              //没有标签返回

	else if(globalErrFlag == 0xff)		// iso error
		resp_iso_err();
}
void invGetSysInfor()	//冲撞读取系统信息
{	
   	uchar i,j,k;             
   	uchar addr,num_card;
   	uchar flags =0; 
   	uint m;	
   
   	addr = pcdata[1];
   	myInvOut();     			     		
	if( labeldata[0] != 0 )
	{
		num_card = labeldata[0];			      		
		pcdata[0] = 5+num_card*13+2;//length
		pcdata[1] = deviceAddr;
		pcdata[2] = 0xb0;	//inv get sys infor
		pcdata[3] = OK;
		pcdata[4] = num_card;
			      		
		flags = ISOFlagsSys&0xfb;	// not inventory
		flags |= 0x20;			// address_flag	,no security		
		for(i=0;i<num_card;i++)	// read multiple cards system
		{
			viccdata[0] = 13;     	//len
			viccdata[1] = flags;    //flags
			viccdata[2] = 0x2b;	//get sys infor
			for(j=0;j<8;j++)	// copy uid
			{
				viccdata[3+j] = labeldata[i*10+10-j];
			}			      		
			wr_crc_send();                                                    
			
			mutiBlockWrDelay();
			ISOMode = ISOModeSys&0xe7;	//read ,all				
			m = sendISOCmd();   
			CS_RAM_1;
			if(viccdata[0] == 0x01)break;	//iso error
			pcdata[i*13+5] = viccdata[11];	//dsfid
			for(j=0;j<8;j++)	// copy uid		      	
			      pcdata[i*13+6+j] = viccdata[10-j];

			pcdata[i*13+14] = viccdata[12];		//afi
			pcdata[i*13+15] = viccdata[13]+1;	//mem_size
			pcdata[i*13+16] = viccdata[14]+1;	//mem_size
			pcdata[i*13+17] = viccdata[15];		//ic-ref		      			
		}		
		if( deviceAddr == addr )
		{
			if(viccdata[0] == 0x01){resp_iso_err();return;}	// iso error
			wr_crc_resp();			
		}
	}	
	else if( labeldata[0] == 0 )
		resp_no_trns();              //没有标签返回

	else if(globalErrFlag == 0xff)		// iso error
		resp_iso_err();

}
void invGetMulBloSec() 	//冲撞读取块状态
{	
   	uchar i,j,k,l;            
   	uchar addr,num_card;
   	uchar flags =0; 
   	uint m; 
   	uint db_n,db_adr;
   
   	addr = pcdata[1];
   	db_adr = pcdata[5];
   	db_n = pcdata[6];
   	myInvOut();     		
	if( labeldata[0] != 0 )
	{
		num_card = labeldata[0];		      		
		pcdata[0] = 5+num_card*(8+db_n+1)+2;
		pcdata[1] = deviceAddr;
		pcdata[2] = 0xb0;	//inv read mutiple block
		pcdata[3] = OK;
		pcdata[4] = num_card;
			      		
		flags = ISOFlagsSys&0xfb;	// not inventory
		flags |= 0x20;			// address_flag	,no security		
		for(i=0;i<num_card;i++)		// read multiple blocks status
		{
			viccdata[0] = 15;     	//len
			viccdata[1] = flags;    //flags
			viccdata[2] = 0x2c;	//get multiple block security status
			for(j=0;j<8;j++)	// copy uid
				viccdata[3+j] = labeldata[i*10+10-j];
			viccdata[11] = db_adr;	//start addr
			viccdata[12] = db_n;    // length
			wr_crc_send();                                                    
			
			mutiBlockWrDelay();
			ISOMode = ISOModeSys&0xe7;	//read ,all
			m = sendISOCmd();
			CS_RAM_1;
			if(viccdata[0] == 0x01){break;}	// iso error		      			
			for(k=0;k<8;k++)
				pcdata[i*(8+db_n+1)+5+k] = labeldata[i*10+3+k];//copy uid

			for(k=0;k<(db_n+1);k++)	//copy block security status
				pcdata[i*(8+db_n+1)+13+k] = viccdata[2+k];
		} 
		if( deviceAddr == addr )
		{	
			if(viccdata[0] == 0x01){resp_iso_err();return;}	// iso error
			wr_crc_resp();
		}
	}	
	else if( labeldata[0] == 0 )
		resp_no_trns();              //没有标签返回

	else if(globalErrFlag == 0xff)		// iso error
		resp_iso_err();
}
/***************************************************/
void CPU_reset( )
{
	uchar crc;
	pcdata[0] = 0x06;
	pcdata[1] = deviceAddr;
	pcdata[2] = 0x63;	//cpu reset
	pcdata[3] = OK;
	crc = crc16Calculate(pcdata,pcdata[0]-2);
	pcdata[4] = crc&0xff;
	pcdata[4] = crc>>8;
	
	if(pcdata[1] == deviceAddr)//本机地址执行返回
	{
		for(crc=0;crc<pcdata[0];crc++)
			serialPortOutput1byte(pcdata[crc]);
	}
			
	LedOutput5(1);	
	for(crc=0;crc<6;crc++)
	{
		Delay_100_Milli_Seconds();
	}	//亮600ms
	LedOutput5(0);
	
	WDCR &= 0xbf;
	WDCR |= 0x38;	// write error check bit ,to reset
}
/********************************************************/

/*******************************************************/
void Detec_Baud_pro(void)			
{
   	if(pcdata[1] == deviceAddr)//本机地址执行返回
   	{
   		pcdata[0] = 6;
      	pcdata[1] = deviceAddr;
      	pcdata[2] = DETE_BAUDRATE_CMD;
      	pcdata[3] = 0;
   		wr_crc_resp(); 
   	}
}
/*******************************************************/
void Get_DevInf_pro(void)				
{
   	uchar i ;
   
   	i = pcdata[1];
  	pcdata[0] = 13;
   	pcdata[1] = deviceAddr;
   	pcdata[2] = GET_DEVINFO_CMD;
   	pcdata[3] = 0;
   	pcdata[4] = 0;
   	pcdata[5] = 00;
   	pcdata[6] = 5;
   	pcdata[7] = 0x0f;                
   	pcdata[8] = 0x41;                 //PRR8036
   	pcdata[9] = 0;
   	pcdata[10] = 0x08;                //支持iso15693卡片
   	if(pcdata[1] == deviceAddr)wr_crc_resp(); //本机地址执行返回  
}
/****************************************************/
void getNoiseLevel()
{
	#define NOISE	30
	
	uint i,j,data = 0;
	uint max,min,aver;
	uint result[NOISE];
	uint sum = 0;
	
	for(j=0;j<5;j++)
	{
		ADCCTRL1 = 0x0030;
		asm(" nop");
		ADCCTRL2 = 0x6000;
		CHSELSEQ1 = 0x0C;				
		MAXCONV = 0x00;			
		asm(" CLRC     SXM");		
			
		data = RESULT0;	
		data = data >> 6;
		result[j] = data;
	}	//清除开机产生的误差数据
	
	for(j=0;j<NOISE;j++)
	{
		ADCCTRL1 = 0x0030;
		asm(" nop");
		ADCCTRL2 = 0x6000;
		CHSELSEQ1 = 0x0C;				
		MAXCONV = 0x00;			
		asm(" CLRC     SXM");		
			
		data = RESULT0;	
		data = data >> 6;
		result[j] = data;
	}
	max = min = result[0];	
	for(i=0;i<NOISE;i++)
	{
		if(result[i]>=max)max=result[i];	//找最大值
		if(result[i]<=min)min=result[i];	//找最小值
		sum += result[i];
	}
	aver = sum/NOISE;
	if(pcdata[1] == deviceAddr)
	{
		pcdata[0] = 0x0c;
		pcdata[1] = deviceAddr;
		pcdata[2] = 0x6d;
		pcdata[3] = OK;
		pcdata[4] = (min>>8)&0x03;
		pcdata[5] = min&0xff;
		pcdata[6] = (aver>>8)&0x03;
		pcdata[7] = aver&0xff;;
		pcdata[8] = (max>>8)&0x03;;
		pcdata[9] = max&0xff;;
		wr_crc_resp(); //本机地址执行返回 
	}				
}
void Reset_RF_pro(void)			
{
   	uchar i;
   	uint level;
   	level = cfgdata[25] >> 8;
   	
	setX9c503ToLowest();	//关闭RF
   	rfDelay20ms();    	//20ms	
   	adjustX9c503(1,level);	//打开RF
   	
   	if( pcdata[1]==deviceAddr )	//本机地址执行返回
   	{
      	pcdata[0] = 0x06;
      	pcdata[1] = deviceAddr;
      	pcdata[2] = RST_RF_CMD;
      	pcdata[3] = 0x00;
      	wr_crc_resp();
   	}
}
/****************************************************/
void RF_OnOff_pro(void)	   		
{
   	uchar status=0;
   	uint level;
   	level = cfgdata[25] >> 8;
   	
   	if     (pcdata[3] == 0x00) { setX9c503ToLowest();status = 0;}
   	else if(pcdata[3] == 0x01) 
   	{ 
   		setX9c503ToLowest();
   		adjustX9c503(1,level);
   		status = 0;
   	}
   	else status = 0x11;            	//参数值超出变化范围
   	if( pcdata[1]==deviceAddr )  	//本机地址执行返回
   	{
      	pcdata[0] = 0x06;
      	pcdata[1] = deviceAddr;
      	pcdata[2] = CTL_RF_CMD;
      	pcdata[3] = status;
      	wr_crc_resp();
   	}
}
/*****************************************************/
void readerDiagnostic()
{
	uchar j;
	uchar mode;
	uint level;
	uint result[5],data;
	
	mode = pcdata[3]&0x03;
	level = (cfgdata[25]>>8)&0x3f;
	if( pcdata[1]==deviceAddr )  	//本机地址执行返回
	{
		if(mode == 0x01)
		{
			//read detailed information
		}
		else if(mode == 0x02)
		{
			for(j=0;j<2;j++)	//剔出开机误差
			{
				ADCCTRL1 = 0x0030;
				asm(" nop");
				ADCCTRL2 = 0x6000;
				CHSELSEQ1 = 0x0d;	//温度输入			
				MAXCONV = 0x00;			
				asm(" CLRC     SXM");		
			
				data = RESULT0;	
				data = data >> 6;
				result[j] = data;
			}
			
			for(j=0;j<5;j++)	
			{
				ADCCTRL1 = 0x0030;
				asm(" nop");
				ADCCTRL2 = 0x6000;
				CHSELSEQ1 = 0x0d;	//温度输入			
				MAXCONV = 0x00;			
				asm(" CLRC     SXM");		
			
				data = RESULT0;	
				data = data >> 6;
				result[j] = data;
			}
			data = (result[0]+result[1]+result[2]+result[3]+result[4])/5;
			pcdata[0]=0x09;
			pcdata[1]=deviceAddr;
			pcdata[2]=0x6e;
			pcdata[3]=OK;
			pcdata[4]=level;
			pcdata[5]=0x14;	//20%
			pcdata[6]=data;
		}
		else
		{
			pcdata[0]=0x06;
			pcdata[1]=deviceAddr;
			pcdata[2]=0x6e;
			pcdata[3]=0x11;	//parameter error		
		}		
		wr_crc_resp();
	}	
}
void setOutput()
{
}
void getInput()	
{
	uint in,temp;	
	uchar inputs = 0;
	
	in = (cfgdata[10]>>8) & 0x07;
	inputs |= in;
	temp = (deviceAddr<<4)&0xf0;
	inputs |= temp;
		
   	if( pcdata[1]==deviceAddr )  	//本机地址执行返回
   	{
      	pcdata[0] = 7;
   		pcdata[1] = deviceAddr;
   		pcdata[2] = 0x74;
   		pcdata[3] = OK;
   		pcdata[4] = inputs;
      	wr_crc_resp();
   	}
	
}
/******************************************************/
void Read_Cfg_pro(void)			
{   
   	uint *p_cfg;
   	uchar i;
   	uchar loc;
   	   	
   	pcdata[3] &= 0x3f;
   	loc = pcdata[3];
   	if(  (pcdata[3]==0x01)||(pcdata[3]==0x02)||(pcdata[3]==0x03)
   	   ||(pcdata[3]==0x05)||(pcdata[3]==0x08)||(pcdata[3]==0x0a)
   	   ||(pcdata[3]==0x0b)||(pcdata[3]==0x0c)||(pcdata[3]==0x0d)
   	  )	//cfg_adr命令正确
	{
		if( (pcdata[1] == 0xff) || (pcdata[1] == deviceAddr) )//广播地址或者本机地址执行
		{

⌨️ 快捷键说明

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