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

📄 protocol.c.bak

📁 dsp tmslf2407a 汇编,c的原代码,包括i2c,scitimer,fir等的很多程序.
💻 BAK
📖 第 1 页 / 共 5 页
字号:
	               		pcdata[5] = viccdata[3];
	               		pcdata[6] = viccdata[4];
	               		pcdata[7] = viccdata[5];	               				
               		}
               		wr_crc_resp();
            	}
            	else                                 //标签执行指令ISO错误
            	{
               		resp_iso_err();
            	}
         	}
      	}
   	}
}
/***************************************************/
void wr_sgl_blk_pro(void)     //Write Single Block 
{
   	uchar flags,addr;
   	uchar i,j;
   	uchar flag =0; 
   
   	addr = pcdata[1];
   	flags = pcdata[4]&0x07;
   	if( (flags==0)||(flags==2) )
   	{  
		if(flags==0) { flags = ISOFlagsSys&0xcf;}
      	else         { flags = ISOFlagsSys|0x10;}	//select_flag
      	flags |= 0x40;		//option_flag        		
      	if(pcdata[5] >64) { flag = 1;} 
      	else
      	{
         	viccdata[0] = 10;
         	viccdata[1] = flags;
         	viccdata[2] = 0x21;
         	viccdata[3] = pcdata[5] ;
         	viccdata[4] = pcdata[7];
         	viccdata[5] = pcdata[8];
         	viccdata[6] = pcdata[9];
         	viccdata[7] = pcdata[10];
         	wr_crc_send();
      	}
   	}
   	else if(flags==1)
   	{      		
      	flags = ISOFlagsSys|0x20;	//address_flag
      	flags |= 0x40;		//option_flag      		
      	if(pcdata[13] >64) { flag = 1;}
      	else
      	{
         	viccdata[0] = 18;
         	viccdata[1] = flags;
         	viccdata[2] = 0x21;
         	for(i=3,j=12;i<11;i++,j--) { viccdata[i]= pcdata[j]; }
         	viccdata[11] = pcdata[13] ;
         	viccdata[12] = pcdata[15];
         	viccdata[13] = pcdata[16];
         	viccdata[14] = pcdata[17];
         	viccdata[15] = pcdata[18];
         	wr_crc_send();
      	}
   	}
   	else { flag = 1;}//mode error
   
   	if(flag == 1)                      //块号参数超出标签允许值
   	{ 
      	if( deviceAddr == pcdata[1] )   //本机响应
      	{
         	resp_para_err();
      	}
   	}
   	else
   	{
      	ISOMode = ISOModeSys | 0x10; //write        	   		
      	i = sendISOCmd();  
      	CS_RAM_1;
      	if( deviceAddr == pcdata[1] )   //本机响应
      	{
         	if(i==0)
         	{
            	resp_no_trns();
         	}
         	else
         	{
            	if(viccdata[1] == 0)
            	{
               		pcdata[0] = 6;
               		pcdata[1] = deviceAddr;
               		pcdata[2] = ISO_MANDATORY_CMD;
               		pcdata[3] = OK;
               		wr_crc_resp();
            	}
            	else
            	{
               		resp_iso_err();
            	}
         	}
      	}         
   	}
}
/***************************************************/
void lock_mul_blk_pro(void)
{
   	uchar flags,addr,n_b;
   	uchar i,j,l;
   	uchar flag = 0; 
   
   	addr = pcdata[1];  

   	flags = pcdata[4]&0x07;
   	if( (flags==0)||(flags==2) )	//不带uid
   	{  
      	if(flags==0) { flags = ISOFlagsSys&0xcf;}
      	else         { flags = ISOFlagsSys|0x10;}	//select_flag
      	flags |= 0x40;			//option_flag  
      	      
      	n_b = pcdata[6] ; 	//db_n
      	if(pcdata[5] >63) { flag = 1;}  //db_adr ,首地址不能超过63
      	if(n_b > 32) { flag = 1;}   	//一次锁定的块数不能超过32
      	if(flag == 0)
      	{
        	ISOMode = ISOModeSys | 0x10;	// write
        	for(l=0;l<(n_b+1);l++)
        	{
        		viccdata[0] = 6;
        		viccdata[1] = flags;
        		viccdata[2] = 0x22;
        		viccdata[3] = pcdata[5];
        		wr_crc_send();                 			       			
        		j = sendISOCmd();   
        		CS_RAM_1;         			
        		if((j==0)||(viccdata[1]!=0))  {break;} //跳出循环并返回错误地址
        		else { pcdata[5] ++ ; }
        		mutiBlockWrDelay();
        	}
         
        	if( deviceAddr == pcdata[1] )   //本机地址返回
         	{
            	if(j==0)                        //无返
            	{
            		pcdata[0] = 7;
            		pcdata[1] = deviceAddr;
            		pcdata[2] = 0xb0;  
            		pcdata[3] = 0x03;               //no response
            		pcdata[4] = pcdata[5];
            		wr_crc_resp();
            	}
            	else if(viccdata[1]!=0)
            	{
            		pcdata[0] = 8;
               		pcdata[1] = deviceAddr;
               		pcdata[2] = ISO_MANDATORY_CMD;
               		pcdata[3] = ISO_ERR;             //iso err 0x95
               		pcdata[4] = viccdata[2];         //iso err code
               		pcdata[5] = pcdata[5];       //err block addr
               		wr_crc_resp();
            	}
            	else
            	{
               		pcdata[0] = 6;
               		pcdata[1] = deviceAddr;
               		pcdata[2] = ISO_MANDATORY_CMD;
               		pcdata[3] = OK;                   // OK 
               		wr_crc_resp();
            	}
         	}
      	}
      	else
      	{
        	if( deviceAddr == pcdata[1])   ////本机地址返回 块数和地址错误        	
        		resp_para_err();     
      	}
   	}
   	else if(flags==1)	//带uid模式
   	{
		n_b = pcdata[14];               //块长度 
      	flags = ISOFlagsSys|0x20; 	// address_flag
      	flags |= 0x40;			// option_flag      		
	     
      	if(pcdata[13] >63) { flag = 1;}   //首地址不能超过63
      	if(n_b >32) { flag = 1; }   //一次锁定的块数不能超过32
      	if(flag == 0)
      	{
        	for(l=0;l<(n_b+1);l++)
        	{         			
        		viccdata[0] = 14;
            	viccdata[1] = flags;
            	viccdata[2] = 0x22;
            	ISOMode = ISOModeSys | 0x10;	// write            			
            	for(i=3,j=12;i<11;i++,j--) { viccdata[i] = pcdata[j];}
            	viccdata[11] = pcdata[13];	//block number
            	wr_crc_send();             			       			
            	j = sendISOCmd();     
            	CS_RAM_1;       			
            	if((j==0)||(viccdata[1]!=0))  {break;} //跳出循环并返回错误地址/
            	else { pcdata[13] ++ ; }            			
  			}
	         
			if( deviceAddr == pcdata[1] )   //本机执行返回
	        {
	        	if(j==0)                        //无返
	        	{
	            	pcdata[0] = 7;
	            	pcdata[1] = deviceAddr;
	            	pcdata[2] = ISO_MANDATORY_CMD;  
	            	pcdata[3] = 0x03;               //no response
	            	pcdata[4] = pcdata[13];
	            	wr_crc_resp();
	            }
	            else if(viccdata[1]!=0)
	            {
	            	pcdata[0] = 8;
	            	pcdata[1] = deviceAddr;
	            	pcdata[2] = ISO_MANDATORY_CMD;
	            	pcdata[3] = ISO_ERR;             //iso err 
	            	pcdata[4] = viccdata[2];         //iso err code
	            	pcdata[5] = pcdata[13];      //err block addr
	            	wr_crc_resp();
	            }
	            else
	            {
	            	pcdata[0] = 6;
	               	pcdata[1] = deviceAddr;
	               	pcdata[2] = ISO_MANDATORY_CMD;
	               	pcdata[3] = OK;                   // OK 
	               	wr_crc_resp();
	            }
			}
		}
	    else
	    {
	    	if( deviceAddr == pcdata[1] )   //块数和地址错误
	        	resp_para_err();
	    }
   	}
   	else	//mode错误
   	{
   		if( deviceAddr == pcdata[1] )
       		resp_para_err();
   	}
}
/***************************************************/
void rd_mul_blk_pro(void)  
{
   	uchar flags,len,n_b,addr;
   	uchar i,j,k;
   	uchar flag = 0; 
   
   	addr = pcdata[1];
   	flags = pcdata[4]&0x07;
   	if( (flags==0)||(flags==2) )	//不带uid
   	{
      	if(pcdata[5] >63) { flag = 1;} 		// 块地址不超过64
      	if(pcdata[6] >32) { flag = 1;}       	// 最多一次读取32个块
      	if(flag == 0)
      	{
        	n_b = pcdata[6];    //块长度        	
        	if(flags==0) { flags = ISOFlagsSys&0xcf;}
      		else         { flags = ISOFlagsSys|0x10;}	//select_flag
      		if((ISOModeSys & 0x04) == 0x04) { flags |= 0x40; }	//option_flag  	
        	viccdata[0] = 7;
        	viccdata[1] = flags;
        	viccdata[2] = Rd_multiB_cmd;
        	viccdata[3] = pcdata[5];
        	viccdata[4] = pcdata[6];
      	}
   	}
   	else if(flags==1)	//带uid
   	{
      	if(pcdata[13] >63) { flag = 1;}		// 块地址不超过64
      	if(pcdata[14] >32) { flag = 1;}		// 最多一次读取32个块
      	if(flag == 0)
      	{
        	n_b = pcdata[14];    
        	flags = ISOFlagsSys | 0x20;	//address_flag     		
        	if((ISOModeSys & 0x04) == 0x04) { flags |= 0x40; }// option_flag,TI卡为1才能操作
        	
        	viccdata[0] = 15;
        	viccdata[1] = flags;
        	viccdata[2] = Rd_multiB_cmd;
        	for(i=3,j=12;i<11;i++,j--) {viccdata[i] = pcdata[j];}
        	viccdata[11] = pcdata[13];
        	viccdata[12] = pcdata[14];
      	}
   	}
   	else { flag = 1;}	//mode error
   
   	if( deviceAddr == pcdata[1] )    //本机执行返回
   	{
      	if(flag ==1) { resp_para_err(); }
      	else
      	{
        	wr_crc_send();
	    	ISOMode = ISOModeSys; 	       		    		
        	i = sendISOCmd();    
        	CS_RAM_1;     		
        	if(i==0) { resp_no_trns(); }
        	else
        	{
        		if(viccdata[1] ==0)
        		{       
        			if((ISOModeSys & 0x04) == 0x04)	//含有块状态信息  
        			{   				
	        			pcdata[0]=6+(n_b+1)*5+2;
	               		pcdata[1]=deviceAddr;
	               		pcdata[2]=ISO_MANDATORY_CMD;
	               		pcdata[3]=OK;
	               		if( (pcdata[4]&0x07) == 0x01)pcdata[4]=pcdata[14];//uid
	               		else pcdata[4]=pcdata[6];	// no uid	               				
	               		pcdata[5]=0x04;
	               		for(i=0;i<(n_b+1)*5;i++)	               		
	               			pcdata[6+i] = viccdata[2+i];//读取db_n+1块,	               	
	               	}
	               	else	//不含有块状态信息
	               	{
	               		pcdata[0]=6+(n_b+1)*4+2;
	               		pcdata[1]=deviceAddr;
	               		pcdata[2]=ISO_MANDATORY_CMD;
	               		pcdata[3]=OK;
	               		if( (pcdata[4]&0x07) == 0x01)pcdata[4]=pcdata[14];//uid
	               		else pcdata[4]=pcdata[6];	// no uid	               				
	               		pcdata[5]=0x04;
	               		for(i=0;i<(n_b+1)*4;i++)	               		
	               			pcdata[6+i] = viccdata[2+i];//读取db_n+1块,	               	
	               	}
               		wr_crc_resp();
            	}
            	else          	
               		resp_iso_err();
         	}
      	}
   	}
}
/***************************************************/
void wr_mul_blk_pro(void)
{
	
	uchar flags,addr,n_b,db_addr;
	uchar i,j,ii,jj;
	uchar f_resp;
	uchar flag =0; 
   
   	addr = pcdata[1];
   	flags = pcdata[4]&0x07;	//mode
   	if( (flags==0)||(flags==2) )	//不带uid
   	{
      	if(pcdata[5] >63) { flag = 1;} 
      	if(pcdata[6] >32) { flag = 1;}  
      	if(flag == 0)
      	{
         	db_addr = pcdata[5];
         	n_b = pcdata[6];         	
         	if(flags==0) { flags = ISOFlagsSys&0xcf;}
      		else         { flags = ISOFlagsSys|0x10;}	//select_flag
      		flags |= 0x40; 			//option_flag  
         	for(i=0;i<(n_b+1);i++)
         	{
            	viccdata[0] = 10;
            	viccdata[1] = flags;
            	viccdata[2] = 0x21;
            	viccdata[3] = db_addr;             			
            	for(j=0;j<4;j++)
         			viccdata[4+j] = pcdata[8+4*i+j];	//copy block data
        
            	wr_crc_send();              			
            	ISOMode = ISOModeSys | 0x10;	//write            			
            	f_resp = sendISOCmd();    
            	CS_RAM_1;        			
            	if((f_resp==0)||(viccdata[1]!=0)){ break;}
            	else   { db_addr ++; }
            	mutiBlockWrDelay();
            	feedWatchDog();
         	} 
		}
   	}
   	else if(flags==1)	//带uid
   	{
      	if(pcdata[13] >63) { flag = 1;}
      	if(pcdata[14] >32) { flag = 1;} //040311
        
        db_addr = pcdata[13];
      	n_b = pcdata[14];                		
      	flags = ISOFlagsSys|0x20; 	// address_flag
      	flags |= 0x40;			//option_flag      		
           		
      	ISOMode = ISOModeSys | 0x10;	//write      		
      	for(i=0;i<(n_b+1);i++)
      	{
      		viccdata[0] = 18;
        	viccdata[1] = flags;
        	viccdata[2] = 0x21;	//write a single block
        	for(ii=3,jj=12;ii<11;ii++,jj--) { viccdata[ii] = pcdata[jj]; }//copy uid         	
      	
        	viccdata[11] = db_addr; 
        	for(j=0;j<4;j++)        
        	{
        		viccdata[12+j] = pcdata[16+4*i+j];	//copy block data
        	}		
        	wr_crc_send();  
        	ISOMode = ISOModeSys | 0x10;	//write            		  		
        	f_resp = sendISOCmd();     
        	CS_RAM_1;
        	db_addr ++;      		
        	if((f_resp==0)||(viccdata[1]!=0)){ break;}         		       	
        	mutiBlockWrDelay(); 
        	feedWatchDog(); 		
      	}       		
   	}
   	else { flag = 1;}
   
   	if( deviceAddr == pcdata[1] )   //本机执行
   	{
      	if(flag == 1)                      //块号参数超出标签允许值
         	resp_para_err();
      	else
      	{
         	if(f_resp==0)                        //无返
         	{
            	pcdata[0] = 7;
            	pcdata[1] = deviceAddr;
            	pcdata[2] = ISO_MANDATORY_CMD;  
            	pcdata[3] = 0x03;               //no response
            	pcdata[4] = db_addr;
            	wr_crc_resp();
			}
			else if(viccdata[1]!=0)
         	{
            	pcdata[0] = 8;
            	pcdata[1] = deviceAddr;
            	pcdata[2] = ISO_MANDATORY_CMD;
            	pcdata[3] = ISO_ERR;             //iso err 
            	pcdata[4] = viccdata[2];         //iso err code
            	pcdata[5] = db_addr;       //err block addr
            	wr_crc_resp();
         	}
         	else
         	{
            	pcdata[0] = 6;
            	pcdata[1] = deviceAddr;
            	pcdata[2] = ISO_MANDATORY_CMD;
            	pcdata[3] = OK;                   //OK 
            	wr_crc_resp();
         	}
      	}
   	}
}
/***************************************************/
void sel_tag_pro(void)
{
   	uchar flags,addr;
   	uchar i,j;
   
   	addr = pcdata[1];
   	flags = pcdata[4]&0x07;

⌨️ 快捷键说明

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