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

📄 tda8007_routines.c

📁 NXP公司芯片TDA8007控制程序
💻 C
📖 第 1 页 / 共 2 页
字号:
         {
            AUXR = INT_XRAM;
            P15  = 1;
            #ifndef UCRD
            if(Tx_pointer<buffer_length)  // buffer_length needs to be 256
               ch = data_exch_buff[Tx_pointer++];
            else
               ch = exceed_buff[Tx_pointer++];
            #else
            ch = data_exch_buff[Tx_pointer++];
            #endif
            AUXR = EXT_XRAM;
            P15  = 0;

            Tx_counter --;
            Get_One_Byte = 0;
         }
         user_byte = *ptr_msr;  //update MSR register
         TX_mode = (*ptr_ucr1 & 0x08);
         if(alarm == card_selected)       //alarm on working card
         {                                //wayout in case of parity error
            gen_flag = 0;
            gen_flag = 1;
            
            P15 = 1;
            AUXR = INT_XRAM;
            return(!OK);
         }
      }while((MSR_TBE==0)&& TX_mode);     //wait for transmit one byte 
      
      if(card_comm_error==TX_ERR_PARITY)  //if no parity error then proceed next byte
      {
         gen_flag = 0;
         gen_flag = 1;
         gen_flag = 0;
         gen_flag = 1;
         P15  = 1;            
         AUXR = INT_XRAM;
         return(!OK);
      }

      Get_One_Byte = 1;
   
   }while(Tx_counter);

   if (protocol_type==1)   
   {
   	// load timers with CWT value in T=1
		*ptr_tor1 = (uchar)(CWT); 
      *ptr_tor2 = (uchar)(CWT>>8);
      *ptr_tor3 = 0; 
   }
   P15  = 1;            
   AUXR = INT_XRAM;
   return(OK);
}

void load_timers(uchar value_TOR3,uchar value_TOR2,uchar value_TOR1)
{
   write_register(TOR3,value_TOR3);
   write_register(TOR2,value_TOR2);
   write_register(TOR1,value_TOR1);
}
/*****************************************************************/

void start_timers(uchar mode, uchar tor3, uchar tor2, uchar tor1)
{

   load_timers(tor3, tor2, tor1);
   write_register(TOC, mode);      // start timers
}


bit flag_UX;
bit flag_T15;
bit flag_T14;


uchar active_card(unsigned int ptr,uchar V3_V5)
{

   unsigned int 			i;
   uchar						nb_hist;
   uchar 					value;

   bit                  fSetBaudRate=1;

   write_bit(RIU,0);
   write_bit(RIU,1);
   
   write_bit(SAN, 0);
   
   write_bit(TXRX, 0);
	write_bit(DIS_AUX, 1);				 
   write_bit(DIS_TXRX, 1);
   flag_ATR 		= 0;
   end_APDU 		= 0;
   flag_APDU 		= 0;
   flag_ATR_error = 0;
 
   if(V3_V5 == V3)                           //power on 3V or 5V
      write_bit(V3V5,1);
   else
      write_bit(V3V5,0);
      
   write_register(FCR, 0x07);                // setting 1 parity error and fifo = 8
   synchro = 0;
   deactive = 0;
   set_baud_rate_2(0x11, 0, 0);              //default FiDi
   set_clock_card(0x02);                     //xtal/4
   flag_timer3 = 0;
   write_bit(RSTIN,0);

   if(!check_pres_card())       
   {
      card_comm_error = CARD_ABSENT;
      return(0);
   }

   if(emv)
      start_timers(0x65, 0x00, 0x6C, 0xC0);  // 19200 ETU's with T1, T2+3: soft for 108 etus
   else
      start_timers(0x61, 0x00, 0x6C, 0xC0);  // T1 stop, T2+3: soft for 108
      
   flag_FiDi_error 	= 0;
   card_comm_error 	= 0;
   alarm 				= 0;
   count_rep 			= 0;
   T0_accept 	  		= OK;
   T1_accept 			= 0;
   flag_T15 			= 0;
	flag_T14 			= 0;
   TA2_flag 			= 0;
   flag_TB1 			= 0;
   flag_TB3 			= 0;            
   flag0 				= 0;
   flag1 				= 0;
   flag2 				= 0;
   Rblock_flag 		= 0;
   flag_UX 				= 0;
   has_replied 		= 0;
   ifsc = ifsd   		= 32;          // TA2 default value
   old_ifsc 			= 32;
   protocol_type 		= PROT_T0;
   asser_mode_flag 	= 0;

   write_bit(PROT,PROT_T0);         
	write_bit(AUTOCN,0);             
   write_bit(SS,1);

   TA2 					= 0;
   TC1 					= 0;
   WI 					= 10;
   WTX 					= 1;
   BWI 					= 4;           // BWI = 4 par defaut     (28.11.00)
   CWT 					= 8203;        //CWI = 13 par defaut
	UX  					= 1;				//Classe 5V, Clock stop not supported

   nb_last_bytes_ATR          = 2;  // at least TS + T0
   End_ATR                    = 0;
   RestartTimerSoft           = 1;               
   nb_loop1 = 100;                  // 100 * 192 = 19200;

// counter2 + 3 SW are used to check 9600 ETUs between each byte
// counter1 Auto is used to check 19200 ETUs of ATR
//      --> counter 2 & 3 are SW triggered  (MODE2 = 2)
//      --> counter 1 is in autoreload mode (MODE1 = 1)

   write_bit(START,1);              // VCC ON

   while(flag_timer3==0)
   {
      if(alarm)
         return(0);                 // wait for 108 etus count
   }                                // before rising RST
   flag_timer3 = 0;
   
   flag_ATR = 1;
   
	empty_fifo();
   write_bit(RSTIN,1);

   if(emv)             
      start_timers(0x65, 0x00, 0x78, 0xC0);  // 19200 ETU's with T1, T2+3: soft 
   else                                      // for 108 + 12 etus
      start_timers(0x61, 0x00, 0x78, 0xC0);  // T1 stop, T2+3: soft for 108 + 12 etus

   if ( rcv_card(1,ptr) != OK)               // receive TS
        return(0);                                                      

   // CAREFUL!
   // With the C2 version, we do not need to reset SS bit within UCR1 and
   // we must not change AUTOC\ bit within UCR2
   
   checksum = 0;          // checksum is calculated from TO to TCK not include

   if (rcv_card(1,ptr+1) != OK)        		//receive T0
      return(0);

   process_nb_bytes_ATR(data_exch_buff[ptr+1]);  // compute T0
   
   nb_hist = data_exch_buff[ptr+1] & 0x0F;   // nb of historical bytes
   
   if(nb_hist)
      flag0 = 1;
      
   nb_last_bytes_ATR += nb_hist;

   // if only one byte to receive then setting EATR
   if(nb_last_bytes_ATR==1)
   {
      write_bit(EATR, 1);
      End_ATR          = 0;
      RestartTimerSoft = 0;
      nb_last_bytes_ATR = 0;
   }   

   i = process_ATR(data_exch_buff[ptr+1],ptr+2);

   // after process_ATR() we should receive historical bytes and eventually TCK.
   End_ATR = 1;
   
   if((i == 0xFF))
   {
      flag0 = 0;
      return(0);
   }
   
   i = i + 2;                                // TS, T0
   
   if( TA2_flag ==1)                         // if TA2 present then specific mode
   {
      if( (protocol_type != 0) && (protocol_type != 1) ) 
      {
         card_comm_error = NO_T0_NO_T1;
         return(0);
      }           
   }
  
   // If T=0 and flag_T15 or flag_T14 present then ATR contains a TCK,
   // if T=1 then ATR always contains a TCK
   // ================================================================
   if( ((T0_accept == 1) && ((flag_T15 == 1)||(flag_T14 == 1))) || (T1_accept == 1) )
   {
      nb_hist++;                             // adding one more byte for TCK
      if(flag0)                              // if yet done in process_nb_bytes_ATR()
         nb_last_bytes_ATR ++;
   }

   if(nb_hist==0)                            
      stop_timers();

   if(rcv_card(nb_last_bytes_ATR, ptr+i) != OK)         //receive TCK
      return(0);

   flag_ATR = 0;

   i = i + nb_hist;

   if(flag_ATR_error == 1)
      return(0);

   write_bit(PROT,PROT_T0);   

   // Checking checksum if present ((T=0 with flag_T15 or flag_T14) or (T=1))
   // ===========================
   if( ((T0_accept == 1) && ((flag_T15 == 1)||(flag_T14 == 1))) || (T1_accept == 1) )
   {
      if( checksum != 0)
      {
         card_comm_error = CHECKSUM_ERROR;
         deactive = 1;
         return(0);
      }     
   } 
   if( (T0_accept == 0) && (T1_accept == 0) )
   {
      card_comm_error = NO_T0_NO_T1;
      return(0);
   }    
   value = data_exch_buff[ptr];
   
   // if error in specific mode then return error
   if((flag_FiDi_error==1) && TA2_flag)
   {
      card_comm_error = BAD_FiDi;
      flag_FiDi_error = 0;
      return(0);
   }
      
   if( !((value == 0x3F)  || (value == 0x3B)) ) 
   {
      card_comm_error = TS_ERROR;
      deactive = 1;
      return(0);
   }

   if((T1_accept == OK) && (T0_accept != OK) )
   {
      if((flag_TB3 == 0)&&(emv))
      {
         card_comm_error = TB3_ABSENT;
         return(0);
      } 
      protocol_type = PROT_T1;
      write_bit(PROT,PROT_T1);
   }
   else
   {
      protocol_type = PROT_T0;
      write_bit(PROT,PROT_T0);
   }         

   if(TA2_flag == 1)                         //then specific mode
   {
      if( protocol_type == PROT_T1)
      { 
         if((flag_TB3 == 0)&&(emv))
         {
            deactive = 1;
            card_comm_error = TB3_ABSENT;
            return(0);
         }
         T1_accept = OK;
         T0_accept = !OK;
         write_bit(PROT,PROT_T1);
      } 
      else 
      { 
         if( (TA2 & 0x0F) == PROT_T0)
            T0_accept = OK;
         if( (TA2 & 0x10) != 0 )    
         {
            card_comm_error =WRONG_b5_TA2;   //b5 de TA2 egal 1
            return(0);
         }
      }         
      if( (T1_accept != OK) && (T0_accept != OK) ) 
      {
         card_comm_error = NO_T0_NO_T1;
         return(0);
      }
        
      if(set_baud_rate_2(FiDi, 0, 0) != OK)       //specific mode so setting FiDi
      { 
         //FiDi  not accepted
         card_comm_error = PARAM_ERROR;
         return(0);
      } 
      fSetBaudRate = 0;                      // 28/11/00
 
   }
   if(emv)
   { 
      if(!flag_warm_reset)
      {
      	if((flag_TB1 == 0) )    
      	{       
         	card_comm_error = TB1_NOT_PRESENT;
         	return(0);
      	} 
      	if((TB1 != 0 ) )
      	{
         	card_comm_error = TB1_NOT_ZERO;
         	return(0);
      	}
      }
   }
   set_guard_time(TC1);
   if (fSetBaudRate)                         
   {
      set_BWT(0x11);
      WWT = (960 * WI) + 1;
 	
   }

   return(i);                  
}


void init_system(unsigned int length)
{

   uchar card;
   buffer_length = length;

   write_bit(RIU, 0);
   write_bit(RIU, 1);
   
   // card 3 do not have PCR register
   
   select_card(2);                //select card 2 reset 礐
   write_register(PCR, 0xF0);     //dectivate card 2

   select_card(1);                //select card 1
   write_register(PCR, 0xF0);     //deactivate card 1

   write_register(FCR,0x07);      //FIFO size = 8  compteur d'erreurs de parit

⌨️ 快捷键说明

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