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

📄 protocol.c.bak

📁 dsp tmslf2407a 汇编,c的原代码,包括i2c,scitimer,fir等的很多程序.
💻 BAK
📖 第 1 页 / 共 5 页
字号:
#include "typedef.h"       
#include "f2407regs_c.h" 
#include "global.h"  

void mutiBlockWrDelay(void);
void rfDelay20ms(void);


extern uchar  status_rx;
extern uchar pcdata[Len]; 
extern uchar viccdata[256];
extern uint cfgdata[128]; 
extern uchar labeldata[350];  
extern uchar ISOModeSys; 
extern uchar ISOFlagsSys;
extern uchar ISOMode;  

extern uchar bFlashError;
extern uchar deviceAddr; 

/**具体命令解析***/ 
uchar initRfPara(void)
{ 
	uint temp,iso_option;
	uint level;
   	
   	temp = cfgdata[66] >> 8;  
   	iso_option = (cfgdata[67]>>10)&0x03; 	
   	level = cfgdata[25] >> 8;
   	
   	ISOModeSys = 0;
   	ISOFlagsSys = 0;
   	
   	if(temp&0x01)	ISOModeSys |= 0x01;	// '1':fast mode;		'0':normal mode;
   	if(temp&0x02)	ISOModeSys |= 0x02;	// '1':10% modulation;		'0':100% modulation;   	 	
   	   	
   	if(temp&0x04)	{ISOFlagsSys |= 0x01;ISOModeSys |= 0x20;}	// '1':fsk,two subcarriers;	'0':ask,a single subcarriers
   	if(temp&0x08)	ISOFlagsSys |= 0x02;	// '1':high data rate		'0':low data rate 
   	
   	if(iso_option == 0x02){ISOModeSys &= 0xfb;}
   	else {ISOModeSys |= 0x04;}  
   	
   	//将高速模式屏蔽
   	if( (temp&0x04) == 0x04 )  	//fsk
   	{
   		ISOFlagsSys |= 0x01;
   		ISOModeSys &= 0xfe;
   		ISOFlagsSys &= 0xfd;
   	}
   	else						//ask
   	{
   		ISOModeSys &= 0xfe;
   		ISOModeSys &= 0xfd;
   		ISOFlagsSys &= 0xfd;
   	}							//20051205
   	
   	if( (level>=0x0c) && (level<= 0x29) )
   		adjustX9c503(1,level);	//向上调节
   	else
   		adjustX9c503(1,0x0c);		//默认为0.5W
}                                            
/***********************************************************/    
void resp_no_trns(void)                //没有标签的存在
{
   	uint m;
   	pcdata[0] = 0x06; 
   	pcdata[1] = deviceAddr;              
   	pcdata[2] = ISO_MANDATORY_CMD; 
   	pcdata[3] = NO_TRNS;
   	m = ~crc16Calculate(pcdata,4);
   	pcdata[4] = m&0x00ff;
   	pcdata[5] = m>>8;
   	send_resp();
}
/***********************************************************/             
void resp_iso_err(void)                  //标签执行ISO错误
{
   	uint m;
   	pcdata[0] = 0x07;
   	pcdata[1] = deviceAddr;
   	pcdata[2] = ISO_MANDATORY_CMD;
   	pcdata[3] = ISO_ERR;	//0x95
   	pcdata[4] = viccdata[2];
   	m = ~crc16Calculate(pcdata,5);
   	pcdata[5] = m&0x00ff;
   	pcdata[6] = m>>8;
   	send_resp();
}
/***********************************************************/             
void resp_para_err(void)
{
   	uint m;
   	pcdata[0] = 0x06;
   	pcdata[1] = deviceAddr;
   	pcdata[2] = ISO_MANDATORY_CMD;
   	pcdata[3] = PARA_OV;
   	m = ~crc16Calculate(pcdata,4);
   	pcdata[4] = m&0x00ff;
   	pcdata[5] = m>>8;
	send_resp();   
}
/***********************************************************/
void wr_crc_resp(void)
{
   	uint m;
   	uchar len;
   	len = pcdata[0];     
   	len -= 2;
   	m = ~crc16Calculate(pcdata,len);
   	pcdata[len++] = m&0x00ff;
   	pcdata[len] = m>>8;
   	send_resp();   
}                                                   
/***********************************************************/
void wr_crc_send(void)
{
   	uint m;           
   	uchar len;
   	len = viccdata[0];     
   	len -= 3;
   	m = crc16Calculate(viccdata+1,len);      //
   	len ++;
   	viccdata[len++] = m&0x00ff;             //crc_low
   	viccdata[len] = m>>8;                 //crc_high
}      
/***********************************************************/
static  ulong curSlot[16] = {0};
static  ulong curSlot1[16] = {0};
static uchar invUid[145];
static uchar collFlag0[16]={0};
static uchar collFlag1[16]={0};
/*
static uchar collFlag2[16]={0};
static uchar collFlag3[16]={0};
static uchar collFlag4[16]={0};
static uchar collFlag5[16]={0};
static uchar collFlag6[16]={0};
static uchar collFlag7[16]={0};
*/
void invStayQuiet()
{
	uchar flags = 0;
	uchar i,m,num;
	
	num = invUid[0];
	if(num>0)	//keep quiet 
	{
		for(m=0;m<num;m++)
		{
			flags = ISOFlagsSys|0x0020;		//address_flag 
		    viccdata[0] = 0x0d;             //len
		    viccdata[1] = flags;         	//flags
		    viccdata[2] = Stay_quit_cmd;	//cmd
		    for(i=0;i<8;i++) { viccdata[3+i] = invUid[m*8+8-i]; }//copy uid
		    wr_crc_send();      
		      	
		    ISOMode = ISOModeSys;		   
		    sendISOCmd();
		    CS_RAM_1;	
		}		     
	}	
	for(i=0;i<145;i++)
		invUid[i] = 0;	// clr to 0  	
}
uchar globalErrFlag = 0;
void myInvOut()
{
	int i,ii,m,j,slotCounter,num_card;
	uchar flags =0; 
	
	labeldata[0]=0;	
	invUid[0] = 0;
/////////////////////////////1///////////////////////////////		
	for(slotCounter=0;slotCounter<16;slotCounter++)
	{
		flags = ISOFlagsSys | 0x0004;	//inventory_flag
		viccdata[0] = 0x06;             //len
		viccdata[1] = flags;            //flags
		viccdata[2] = 0x01;        		//cmd
		viccdata[3] = 0;                //mask length		
		wr_crc_send();					//without optional afi	
		
		ISOMode = ISOModeSys&0xe7;      //read all,read,wr_op	
		if(slotCounter!=0)ISOMode |= 0x80;	//next slot		
		m = sendISOCmd();  
		CS_RAM_1;
		
		if(viccdata[0] == 1)globalErrFlag = 0xff;	// iso error
		
		if(m==2)	{collFlag0[slotCounter]=0xaa;}	//collision flag		
		else if(m==1)
		{
			labeldata[0] += 1;
			invUid[0] += 1;
			labeldata[ (labeldata[0]-1)*10 + 1 ] = 0x03;	//tr-type
			labeldata[ (labeldata[0]-1)*10 + 2 ] = viccdata[2];//dsfid
			for(j=0;j<8;j++)
			{
				labeldata[ (labeldata[0]-1)*10+3+j ] = viccdata[10-j];//uid
				invUid[ (invUid[0]-1)*8+1+j ] = viccdata[10-j];
			}			
		}	
	}
	invStayQuiet();
/////////////////////////////2//////////////////////////////////////
	for(i=0;i<16;i++)
	{
		if(collFlag0[i] == 0xaa)
		{
			collFlag0[i] = 0x0;					// clr collision flag			
			for(slotCounter=0;slotCounter<16;slotCounter++)
			{		
				flags = ISOFlagsSys|0x04;	//inventory_flag
				viccdata[0] = 0x07;         	//len
				viccdata[1] = flags;            //flags
				viccdata[2] = 0x01;        		//cmd
				viccdata[3] = 0x04;				//mask length
				viccdata[4] = i;                //mask value				
				wr_crc_send();					//without optional afi		
				
				ISOMode = ISOModeSys&0xe7; 		//read all,read,wr_op	
				if(slotCounter!=0)ISOMode |= 0x80;	//next slot				
				m = sendISOCmd();
				CS_RAM_1;
				
				if(viccdata[0] == 1)globalErrFlag = 0xff;	// iso error
								
				if(m==2){collFlag1[i] = 0xaa;curSlot[slotCounter] = (slotCounter<<4) | i;}				
				else if(m==1)
				{					
					labeldata[0] += 1;
					invUid[0] += 1;
					labeldata[ (labeldata[0]-1)*10 + 1 ] = 0x03;	//tr-type
					labeldata[ (labeldata[0]-1)*10 + 2 ] = viccdata[2];//dsfid
					for(j=0;j<8;j++)
					{
						labeldata[ (labeldata[0]-1)*10+3+j ] = viccdata[10-j];//uid						
						invUid[ (invUid[0]-1)*8+1+j ] = viccdata[10-j];										
					}					
				}
				else {;}		
			}
			invStayQuiet();
/////////////////////////3/////////////////////////////////////////////////
			for(ii=0;ii<16;ii++)
			{				
				if(collFlag1[ii] == 0xaa)			
				{
					collFlag1[ii] = 0x0;					
					for(slotCounter=0;slotCounter<16;slotCounter++)
					{		
						flags = ISOFlagsSys | 0x0004;	//inventory_flag
						viccdata[0] = 0x07;          	//len
						viccdata[1] = flags; 			//flags
						viccdata[2] = 0x01;        		//cmd
						viccdata[3] = 0x04;				//mask length
						viccdata[4] = curSlot[ii];      //mask value				
						wr_crc_send();					//without optional afi		
						
						ISOMode = ISOModeSys&0xe7;		//read all,read,wr_op	
						if(slotCounter!=0)ISOMode |= 0x80;	//next slot						
						m = sendISOCmd();
						CS_RAM_1;
						
						if(viccdata[0] == 1)globalErrFlag = 0xff;	// iso error
										
						if(m==2){collFlag1[i] = 0xaa;curSlot1[slotCounter] = (ii<<8) | curSlot[ii];}				
						else if(m==1)
						{					
							labeldata[0] += 1;
							invUid[0] += 1;
							labeldata[ (labeldata[0]-1)*10 + 1 ] = 0x03;	//tr-type
							labeldata[ (labeldata[0]-1)*10 + 2 ] = viccdata[2];//dsfid
							for(j=0;j<8;j++)
							{
								labeldata[ (labeldata[0]-1)*10+3+j ] = viccdata[10-j];//uid								
								invUid[ (invUid[0]-1)*8+1+j ] = viccdata[10-j];						
							}							
						}
						else {;}		
					}
					//invStayQuiet();
				}
			}
///////////////////////////////////4//////////////////////////////////////////////////////							
		}
	}
/////////////////////////////////////	
	viccdata[0] = 5;
	viccdata[1] = ISOFlagsSys;
    viccdata[2] = Reset_rdy_cmd;
    wr_crc_send();
    ISOMode = ISOModeSys;	    
	sendISOCmd();	// active all cards    
	CS_RAM_1;	
}
void inventory_pro(void)
{
   	uchar i,j;           
   	uchar addr,num_card;
   	uint m;    	
   
   	addr = pcdata[1];   	
   	
   	if(pcdata[1] == deviceAddr)	//本机地址执行
   	{
   		myInvOut();
   		if(m==0){resp_no_trns(); }	 //没有标签返回 
	      	else
	      	{	      					
	      		if( labeldata[0]!=0 )
	      		{	      			
	      			num_card = labeldata[0]; 
	      			pcdata[0] = 5+num_card*10+2;
	      			pcdata[1] = deviceAddr;
	      			pcdata[2] = 0xb0;
	      			if(pcdata[0]<=0xff)pcdata[3] = OK;
	      			else		pcdata[3] = 0x94;	//more data	      			
	      			pcdata[4] = num_card;
	      			for(i=0;i<num_card;i++)
	      			{
	      				pcdata[10*i+5] = labeldata[10*i+1];
	      				pcdata[10*i+6] = labeldata[10*i+2];
	      				for(j=0;j<8;j++)
	      				{
	      					pcdata[10*i+7+j] = labeldata[10*i+3+j];
	      				}	      					
	      			}
	      			wr_crc_resp();                  //返回ISO执行数据	      				
	      		}
	      		else if(viccdata[0]==1)resp_iso_err();	//ISO错误返回            			
	            else	resp_no_trns();              	//没有标签返回
	      	}
   	}
} 
/***************************************************/
void stay_quiet_pro(void)
{
   	uchar i,j,addr;
   	uchar flags;
   
   	i = pcdata[4] & 0x07;
   	if(i == 0x01)                 		//ADDRED 模式
   	{      		
      	flags = ISOFlagsSys|0x0020;		//address_flag      		
      
      	viccdata[0] = 0x0d;             //len
      	viccdata[1] = flags;         	//flags
      	viccdata[2] = Stay_quit_cmd;	//cmd
      	for(i=3,j=12;i<11;) { viccdata[i++] = pcdata[j--]; }
      	wr_crc_send();      
      		
      	ISOMode = ISOModeSys;      	
      	sendISOCmd();		//本机地址执行 
      	CS_RAM_1;
      		
      	if(pcdata[1] == deviceAddr)	//本机地址返回
      	{
      		pcdata[0] = 6;
      		pcdata[1] = deviceAddr;
      		pcdata[2] = 0xb0;
      		pcdata[3] = OK;
      		wr_crc_resp();
      	}
   	}
   	else                          // 错误参数模式
   	{ 
      	if( pcdata[1] == deviceAddr )   //只有本机地址响应      	
         	resp_para_err();
   	}
}

/***************************************************/
void rd_sgl_blk_pro(void)   
{
   	uchar flags,addr;
   	uchar flag=0;   
   	uchar i,j;
   
   	addr = pcdata[1];
   	flags = pcdata[4]&0x07;
   	if( (flags==0)||(flags==2) )
   	{   
      	if(flags==0) { flags = ISOFlagsSys&0xcf;}
      	else         { flags = ISOFlagsSys|0x10;}	//select_flag
      	if((ISOModeSys & 0x04) == 0x04) { flags |= 0x40; }	//option_flag  
      	
      	if(pcdata[5] >64) { flag = 1; }      //目前先调试64块以内数据
      	else
      	{
         	viccdata[0] = 6;
         	viccdata[1] = flags;
         	viccdata[2] = 0x20;
         	viccdata[3] = pcdata[5];
	       	wr_crc_send();
      	} 
   	}
   	else if(flags==1)
   	{
      	if(pcdata[13] >63) { flag = 1;}
      	else
      	{
      		flags = ISOFlagsSys|0x20;	//address_flag
      		if((ISOModeSys & 0x04) == 0x04) {flags |= 0x40;}	//option_flag 
         	viccdata[0] = 14;
         	viccdata[1] = flags;
         	viccdata[2] = 0x20;
         	for(i=3,j=12;i<11;i++,j--) { viccdata[i] = pcdata[j];}
         	viccdata[11] = pcdata[13] ;
         	wr_crc_send();
      	}
   	}
   	else { flag = 1;}
   

   	if( deviceAddr == pcdata[1] )   //本机响应   
   	{
      	if(flag == 1)                      //块号参数超出标签允许值
      	{ 
         	resp_para_err();
      	}
      	else
      	{
         	ISOMode = ISOModeSys;          	      		
         	i = sendISOCmd();
         	CS_RAM_1;	      
         	if(i==0)                                //没有标签的存在
         	{ 
            	resp_no_trns();
         	}
         	else
         	{ 
            	if(viccdata[1]==0)                   //标签正确执行ISO指令
            	{
            		if((ISOModeSys & 0x04) == 0x04)	//含有块状态信息
            		{
	               		pcdata[0] = 11;
	               		pcdata[1] = deviceAddr;
	               		pcdata[2] = 0xb0;
	               		pcdata[3] = OK;
	               		pcdata[4] = viccdata[2];
	               		pcdata[5] = viccdata[3];
	               		pcdata[6] = viccdata[4];
	               		pcdata[7] = viccdata[5];
	               		pcdata[8] = viccdata[6];
               		}
               		else	//不含有块状态信息
               		{
               			pcdata[0] = 10;
	               		pcdata[1] = deviceAddr;
	               		pcdata[2] = 0xb0;
	               		pcdata[3] = OK;
	               		pcdata[4] = viccdata[2];

⌨️ 快捷键说明

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