This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

trf7960 card not detect

Other Parts Discussed in Thread: TRF7960

i am useing trf7960 reader ic to detect rfid card . i have texas's rfid reader kit .useing my code (after additing only some port pin defination because i use other pin for iar and dataclk) i can detect card on texas refrence kit . but same logic i cant detect card on my board so what should  be the problem???????//

here i attech my schemetic and code file..... please help me....

..

#include <MSP430x22x2.h>     	
#include "hardware.h"


// =======================================================================



#define BUF_LENGTH 100		//Number of characters in a frame
#define EnableInterrupts _EINT()

 char rxdata;			//RS232 RX data byte
 unsigned char buf[BUF_LENGTH];
 signed char RXTXstate;	//used for transmit recieve byte count
 unsigned char flags;	//stores the mask value (used in anticollision)
 unsigned char RXErrorFlag;
 unsigned char RXflag;		//indicates that data is in buffer

 unsigned char i_reg;	//interrupt register

 unsigned char CollPoss;

 unsigned char uid[10];
 unsigned char i;
 unsigned char RXdone;
 unsigned char ENABLE;
 unsigned char POLLING;

unsigned char Register[10];
unsigned char	command[10];
#define BAUD0	0x3A	//baud rate generator = 115200 for 6.78 MHz Clock
#define BAUD1	0x00
#define BAUD0EN 0x2B	//baud rate for DCO = 4.9MHz
#define BAUD1EN 0x00

// =========================================================================
// Main function with init and an endless loop
//
//
void InventoryRequest(unsigned char *mask, unsigned char lenght);
void EnableSlotCounter(void);
void DisableSlotCounter(void);
void WriteSingle(unsigned char *pbuf, unsigned char lenght);
void WriteCont(unsigned char *pbuf, unsigned char lenght);
void ReadSingle(unsigned char *pbuf, unsigned char lenght);
void ReadCont(unsigned char *pbuf, unsigned char lenght);
void DirectCommand(unsigned char *pbuf);
void RAWwrite(unsigned char *pbuf, unsigned char lenght);
void delay_ms(unsigned int n_ms);
void CounterSet(void);

void PARset(void)
{
	

	
        TRFDirOUT;			/* P4 output */
	TRFFunc;
	TRFWrite = 0x00;	/* P4 set to 0 - choose parallel inteface for the TRF796x */

	clkOFF;
	clkPOUTset;			/* DATA_CLK on P3.3 */



	irqPINset;
	irqEDGEset;			/* rising edge interrupt */

	
}	

void InitialSettings(void)
{
	/*~~~~~~~~~~~~~~~~~~~~~~~*/
	unsigned char	command[2];
	/*~~~~~~~~~~~~~~~~~~~~~~~*/

	command[0] = ModulatorControl;
	command[1] = 0x20;   //6.78 MHz
//       command[1] = 0x31;  //13.56 MHz

	WriteSingle(command, 2);
}

void OSCsel(unsigned char mode)
{

  	unsigned int ii1;

  	if(mode == 0x00){               //select crystal oscilator
    		BCSCTL1 |= XTS + XT2OFF;                       // ACLK = LFXT1 HF XTAL
                BCSCTL3 |= LFXT1S1+LFXT1S0;                       // 3 � 16MHz crystal or resonator
		// turn external oscillator on
    		do
    		{
      			IFG1 &= ~OFIFG;                   // Clear OSCFault flag
      			for (ii1 = 0xFF; ii1 > 0; ii1--); // Time delay for flag to set
    		}
    		while ((IFG1 & OFIFG) == OFIFG);    // OSCFault flag still set?
    		BCSCTL2 |= SELM1 + SELM0 + SELS;           //  MCLK = SMCLK = HF LFXT1 (safe)

    		return;
    	}

  	else{                           //select DCO for main clock
    		DCOCTL |= DCO0 + DCO1 + DCO2;
    		BCSCTL1 |= XT2OFF + XTS + RSEL0 + RSEL1 + RSEL2;
   		
		// turn external oscillator on
//    		do
//    		{
//      		IFG1 &= ~OFIFG;                   // Clear OSCFault flag
//      		for (ii1 = 0xFF; ii1 > 0; ii1--); // Time delay for flag to set
//    		}
//    		while ((IFG1 & OFIFG) == OFIFG);    // OSCFault flag still set?
    		BCSCTL2 &= ~(SELM1 + SELM0 + SELS + DCOR);

    		return;
    	}
    	//_BIC_SR(OSCOFF);
}

unsigned char FindTags(unsigned char protocol)
{
	
	

	while(1)
	{
	// ISO15693 //
			command[0] = ChipStateControl;	// turn on RF driver
			command[1] = 0x20;
			command[2] = ISOControl;		// set register 0x01 for ISO15693 operation
			command[3] = 0x02;
			WriteSingle(command, 4);




			delay_ms(5);
			flags = 0x06; // 16 slots
                        //flags = 0x26; //1 slot

			command[0] = 0x00;
			InventoryRequest(command, 0);	// send Inventory request //

			command[0] = ChipStateControl;	// turn off RF driver //
			command[1] = 0x01;
			WriteSingle(command, 2);
			delay_ms(1);

			command[0] = IRQStatus;
                        command[1] = IRQMask;	
                        ReadSingle(command, 1);	



	}	/* while */
}		/* FindTags */


void InventoryRequest(unsigned char *mask, unsigned char lenght)	/* host command 0x14 */
{
	/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/
	/* 010800030414(req.packet)[00ff] */
	unsigned char	i = 1, j = 3, NoSlots; 
	unsigned char	*PslotNo, slotNo[17];
	unsigned char	NewMask[8], NewLenght, masksize;
	int				size;
	unsigned int	k = 0;

	/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/



         //added code

	buf[0] = ModulatorControl;
	buf[1] = 0x20;
	WriteSingle(buf, 2);
       //end added code

	slotNo[0] = 0x00;

	if((flags & BIT5) == 0x00)
	{						/* flag bit5 is the number of slots indicator */
		NoSlots = 17;		/* 16 slots if bit is cleared */
		EnableSlotCounter();
	}
	else
		NoSlots = 2;		/* 1 slot if bit is set */

	PslotNo = &slotNo[0];	/* slot number pointer */

	masksize = (((lenght >> 2) + 1) >> 1);	/* masksize is 1 for lenght = 4 or 8 */

	/*
	 * masksize is 2 for lenght = 12 or 16 ;
	 * and so on
	 */
	size = masksize + 3;					/* mask value + mask lenght + command code + flags */


	buf[0] = 0x8f;
	buf[1] = 0x91;						/* send with CRC */
	buf[2] = 0x3d;						/* write continous from 1D */
	buf[3] = (char) (size >> 8);
	buf[4] = (char) (size << 4);
	buf[5] = flags;						/* ISO15693 flags */
	buf[6] = 0x01;						/* anticollision command code */

        //optional AFI should be here


	buf[7] = lenght;					/* masklenght */
	if(lenght > 0)
	{
		for(i = 0; i < masksize; i++) buf[i + 8] = *(mask + i);
	}									/* if */

		command[0] = IRQStatus;
        command[1] = IRQMask;		//Dummy read
       
        ReadCont(command, 1);
	

        CounterSet();						/* TimerA set */
		countValue = count1ms * 20;			/* 20ms */
        irqCLR;							/* PORT2 interrupt flag clear */
		irqON;




      	RAWwrite(&buf[0], masksize + 8);	/* writing to FIFO */

		i_reg = 0x01;
		startCounter;					/* start timer up mode */
		LPM0;							/* wait for end of TX interrupt */

	for(i = 1; i < NoSlots; i++)
	{								/* 1 or 16 available timeslots */
		RXTXstate = 1;				/* prepare the global counter */

		/* the first UID will be stored from buf[1] upwards */
		CounterSet();				/* TimerA set */
		//countValue = count1ms * 20; /* 20ms */
                countValue = 0x4E20;	
                startCounter;				/* start timer up mode */

		k = 0;
		LPM0;

		while(i_reg == 0x01)
		{						/* wait for RX complete */
			k++;

			if(k == 0xFFF0)
			{
				i_reg = 0x00;
				RXErrorFlag = 0x00;
				break;
			}
		}

		command[0] = RSSILevels;	/* read RSSI levels */
		ReadSingle(command, 1);

		if(i_reg == 0xFF)
		{						/* recieved UID in buffer */
			
				
				for(j = 3; j < 11; j++)
				{
					//Put_byte(buf[j]);
				}
				i=0;
				for(j=10; j>=3;j--)
				{
				
				  uid[i]=buf[j];
				  i++;
				}
				
			
			
		}
		else if(i_reg == 0x02)
		{	/* collision occured */
			

			PslotNo++;
			*PslotNo = i;
		}
		else if(i_reg == 0x00)
		{	/* timer interrupt */
			
		}
		else
			;

		command[0] = Reset;			/* FIFO has to be reset before recieving the next response */
		DirectCommand(command);

		if((NoSlots == 17) && (i < 16))
		{					/* if 16 slots used send EOF(next slot) */
			command[0] = StopDecoders;
			DirectCommand(command);
			command[0] = RunDecoders;
			DirectCommand(command);

			//while(1)
                       // {
                        command[0] = TransmitNextSlot;
			DirectCommand(command);
                       // }
		}
		else if((NoSlots == 17) && (i == 16))
		{					/* at the end of slot 16 stop the slot counter */
			DisableSlotCounter();
		}
		else if(NoSlots == 2)
			break;

		
	}						/* for */

	

	NewLenght = lenght + 4; /* the mask lenght is a multiple of 4 bits */

	masksize = (((NewLenght >> 2) + 1) >> 1) - 1;

	while((*PslotNo != 0x00) && (NoSlots == 17))
	{
		*PslotNo = *PslotNo - 1;

		for(i = 0; i < 8; i++) NewMask[i] = *(mask + i);	/* first the whole mask is copied */

		if((NewLenght & BIT2) == 0x00) *PslotNo = *PslotNo << 4;

		
		NewMask[masksize] |= *PslotNo;						/* the mask is changed */

		InventoryRequest(&NewMask[0], NewLenght);			/* recursive call */

		PslotNo--;
	}	/* while */

	irqOFF;
}		/* InventoryRequest */

void EnableSlotCounter(void)
{
	buf[41] = IRQMask;	/* next slot counter */
	buf[40] = IRQMask;
	ReadSingle(&buf[41], 1);
	buf[41] |= BIT0;	/* set BIT0 in register 0x01 */
	WriteSingle(&buf[40], 2);

}

void DisableSlotCounter(void)
{
	buf[41] = IRQMask;	/* next slot counter */
	buf[40] = IRQMask;
	ReadSingle(&buf[41], 1);
	buf[41] &= 0xfe;	/* clear BIT0 in register 0x01 */
	WriteSingle(&buf[40], 2);
}


				
/*
 =======================================================================================================================
 =======================================================================================================================
 */

void STOPcondition(void)
{
	TRFWrite |= 0x80;	/* stop condition */
	clkON;
	TRFWrite = 0x00;
	clkOFF;
}						/* STOPcondition */

/*
 =======================================================================================================================
 =======================================================================================================================
 */

void STOPcont(void)
{	/* stop condition for continous mode */
	TRFWrite = 0x00;
	TRFDirOUT;
	TRFWrite = 0x80;
	__no_operation();
	TRFWrite = 0x00;
}	/* STOPcond */

/*
 =======================================================================================================================
 =======================================================================================================================
 */

void STARTcondition(void)
{
	TRFWrite = 0x00;
	clkON;
	TRFWrite = 0xff;
	clkOFF;
}	/* STARTcondition */

///////////////////////////////////////////////////////////////

///////////////////////////////////////////////////////////////
/*
 =======================================================================================================================
    Function writes only one register or a multiple number ;
    of registers with specified addresses ;
 =======================================================================================================================
 */
void WriteSingle(unsigned char *pbuf, unsigned char lenght)
{

         
	  STARTcondition();
	    while(lenght > 0)
	  {
		*pbuf = (0x1f &*pbuf);	/* register address */

		/* address, write, single */
		for(i = 0; i < 2; i++)
		{
			TRFWrite = *pbuf;	/* send command and data */
			clkON;
			clkOFF;
			pbuf++;
			lenght--;
		}
	}	/* while */

	STOPcondition();

       
    

        

}		/* WriteSingle */






/*
 =======================================================================================================================
    Function writes a specified number of registers from ;
    a specified address upwards ;
 =======================================================================================================================
 */
void WriteCont(unsigned char *pbuf, unsigned char lenght)
{
     
       	STARTcondition();
	        *pbuf = (0x20 | *pbuf); /* address, write, continous */
        	*pbuf = (0x3f &*pbuf);	/* register address */
	        while(lenght > 0)
        	{
	        	TRFWrite = *pbuf;	/* send command */
		        clkON;
          		clkOFF;
		        pbuf++;
		        lenght--;
        	}						/* while */

	  STOPcont();
     

     

}	/* WriteCont */

/*
 =======================================================================================================================
    Function reads only one register ;
 =======================================================================================================================
 */
void ReadSingle(unsigned char *pbuf, unsigned char lenght)
{


          STARTcondition();
	  while(lenght > 0)
         {
		*pbuf = (0x40 | *pbuf); /* address, read, single */
		*pbuf = (0x5f &*pbuf);	/* register address */

		TRFWrite = *pbuf;		/* send command */
		clkON;
		clkOFF;

		TRFDirIN;				/* read register */
		clkON;
		__no_operation();
		*pbuf = TRFRead;
		clkOFF;

		TRFWrite = 0x00;
		TRFDirOUT;

		pbuf++;
		lenght--;
	}	/* while */

	STOPcondition();
       
/**************************************************************/

}		/* ReadSingle */

/*
 =======================================================================================================================
    Function reads specified number of registers from a ;
    specified address upwards. ;
 =======================================================================================================================
 */
void ReadCont(unsigned char *pbuf, unsigned char lenght)
{
  
	STARTcondition();
	*pbuf = (0x60 | *pbuf); /* address, read, continous */
	*pbuf = (0x7f &*pbuf);	/* register address */
	TRFWrite = *pbuf;		/* send command */
	clkON;
	clkOFF;
	TRFDirIN;				/* read register */

	/*
	 * TRFWrite = 0x00;
	 */
	while(lenght > 0)
	{
		clkON;

		/*
		 * TRFDirIN;
		 */
		__no_operation();
		*pbuf = TRFRead;

		/*
		 * TRFDirOUT;
		 */
		clkOFF;
		pbuf++;
		lenght--;
	}						/* while */

	STOPcont();
      
}	/* ReadCont */

/*
 =======================================================================================================================
    Function DirectCommand transmits a command to the reader chip
 =======================================================================================================================
 */
void DirectCommand(unsigned char *pbuf)
{
  
     
       STARTcondition();
	*pbuf = (0x80 | *pbuf); /* command */
	*pbuf = (0x9f &*pbuf);	/* command code */
	TRFWrite = *pbuf;		/* send command */
	clkON;
	clkOFF;
	STOPcondition();
      



}	/* DirectCommand */

/*
 =======================================================================================================================
    Function used for direct writing to reader chip ;
 =======================================================================================================================
 */
void RAWwrite(unsigned char *pbuf, unsigned char lenght)
{
  
        STARTcondition();
	while(lenght > 0)
	{
		TRFWrite = *pbuf;	/* send command */
		clkON;
		clkOFF;
		pbuf++;
		lenght--;
	}						/* while */

	STOPcont();
  



}	/* RAWwrite */

/*
 =======================================================================================================================
    Direct mode (no stop condition) ;
 =======================================================================================================================
 */






/*
 =======================================================================================================================
 =======================================================================================================================
 */




void InterruptHandlerReader(unsigned char *Register)
{
	/*~~~~~~~~~~~~~~~~*/
	/*
	 * char phello[20];
	 * //for testing
	 */
	unsigned char	len;
	/*~~~~~~~~~~~~~~~~*/

	/*
	 * Register = Register & 0xF7;
	 * //set the parity flag to 0 ;
	 * parity is not used in 15693 and Tag-It
	 */

	if(*Register == 0xA0)
	{					/* TX active and only 3 bytes left in FIFO */
		i_reg = 0x00;
               

	}

	else if(*Register == BIT7)
	{					/* TX complete */
		i_reg = 0x00;
		*Register = Reset;			/* reset the FIFO after TX */
		DirectCommand(Register);
                //led1on;
                P3OUT ^= BIT0;
                delay_ms(1);

	}

	else if((*Register & BIT1) == BIT1)
	{								/* collision error */
		i_reg = 0x02;				/* RX complete */
                
		*Register = StopDecoders;	/* reset the FIFO after TX */
		DirectCommand(Register);

		CollPoss = CollisionPosition;
		ReadSingle(&CollPoss, 1);

		len = CollPoss - 0x20;		/* number of valid bytes if FIFO */

		

		if((len & 0x0f) != 0x00) len = len + 0x10;	/* add 1 byte if broken byte recieved */
		len = len >> 4;

		if(len != 0x00)
		{
			buf[RXTXstate] = FIFO;					/* write the recieved bytes to the correct place of the
													 * buffer;
													 * */
			ReadCont(&buf[RXTXstate], len);
			RXTXstate = RXTXstate + len;
		}						/* if */

		*Register = Reset;
		DirectCommand(Register);

		*Register = IRQStatus;	/* IRQ status register address */
                 *(Register + 1) = IRQMask;
		//ReadSingle(Register, 2);	/* function call for single address read */
                // ReadCont(Register, 2);
                     ReadSingle(Register, 1);	

		irqCLR;
	}
	else if(*Register == BIT6)
	{	/* RX flag means that EOF has been recieved */
		/* and the number of unread bytes is in FIFOstatus regiter */
		if(RXErrorFlag == 0x02)
		{
			i_reg = 0x02;
			return;
		}

		*Register = FIFOStatus;
		ReadSingle(Register, 1);					/* determine the number of bytes left in FIFO */
//                ReadCont(Register, 1);	
		*Register = (0x0F &*Register) + 0x01;
		buf[RXTXstate] = FIFO;			/* write the recieved bytes to the correct place of the*/
													
												
		ReadCont(&buf[RXTXstate], *Register);
		RXTXstate = RXTXstate +*Register;

		*Register = TXLenghtByte2;					/* determine if there are broken bytes */
	 //       ReadSingle(Register, 1);					/* determine the number of bits */
                  ReadCont(Register, 1);

		if((*Register & BIT0) == BIT0)
		{
			*Register = (*Register >> 1) & 0x07;	/* mask the first 5 bits */
			*Register = 8 -*Register;
			buf[RXTXstate - 1] &= 0xFF << *Register;
		}								/* if */


		*Register = Reset;				/* reset the FIFO after last byte has been read out */
		DirectCommand(Register);
                
		i_reg = 0xFF;					/* signal to the recieve funnction that this are the last bytes */
	}
	else if(*Register == 0x60)
	{									/* RX active and 9 bytes allready in FIFO */
		i_reg = 0x01;
                
		buf[RXTXstate] = FIFO;
		ReadCont(&buf[RXTXstate], 9);	/* read 9 bytes from FIFO */
		RXTXstate = RXTXstate + 9;

		if(irqPORT & irqPIN)
		{
			*Register = IRQStatus;		/* IRQ status register address */
                        *(Register + 1) = IRQMask;
			//ReadSingle(Register, 2);	/* function call for single address read */
                        //ReadCont(Register, 2);
                           
                                ReadSingle(Register, 1);	
			irqCLR;

			if(*Register == 0x40)
			{	/* end of recieve */
				*Register = FIFOStatus;
				ReadSingle(Register, 1);					/* determine the number of bytes left in FIFO */
                                //ReadCont(Register, 1);
				*Register = 0x0F & (*Register + 0x01);
				buf[RXTXstate] = FIFO;						/* write the recieved bytes to the correct place of the*/
															
															
				ReadCont(&buf[RXTXstate], *Register);
				RXTXstate = RXTXstate +*Register;

				*Register = TXLenghtByte2;					/* determine if there are broken bytes */
				ReadSingle(Register, 1);					/* determine the number of bits */
                                //ReadCont(Register, 1);

				if((*Register & BIT0) == BIT0)
				{
					*Register = (*Register >> 1) & 0x07;	/* mask the first 5 bits */
					*Register = 8 -*Register;
					buf[RXTXstate - 1] &= 0xFF << *Register;
				}						/* if */

                                P1OUT |= BIT4;
				i_reg = 0xFF;			/* signal to the recieve funnction that this are the last bytes */
				*Register = Reset;		/* reset the FIFO after last byte has been read out */
				DirectCommand(Register);
			}
			else if(*Register == 0x50)
			{							/* end of recieve and error */
				i_reg = 0x02;

			}
		}
		else
		{
			Register[0] = IRQStatus;
                        Register[1] = IRQMask;
			//ReadSingle(Register, 2);	/* function call for single address read */
                        //ReadCont(Register, 2);
                           
                                 ReadSingle(Register, 1);	
			if(Register[0] == 0x00) i_reg = 0xFF;
		}
	}
	else if((*Register & BIT4) == BIT4)
	{						/* CRC error */
		if((*Register & BIT5) == BIT5)
		{
			i_reg = 0x01;	/* RX active */
			RXErrorFlag = 0x02;
		}
		else
			i_reg = 0x02;	/* end of RX */
	}
	else if((*Register & BIT2) == BIT2)
	{						/* byte framing error */
		if((*Register & BIT5) == BIT5)
		{
			i_reg = 0x01;	/* RX active */
			RXErrorFlag = 0x02;
		}
		else
			i_reg = 0x02;	/* end of RX */
	}
	else if(*Register == BIT0)
	{						/* No response interrupt */
		i_reg = 0x00;

	}
	else
	{						/* Interrupt register not properly set */
		

		i_reg = 0x02;

		*Register = StopDecoders;	/* reset the FIFO after TX */
		DirectCommand(Register);

		*Register = Reset;
		DirectCommand(Register);

		*Register = IRQStatus;		/* IRQ status register address */
                *(Register + 1) = IRQMask;
		//ReadSingle(Register, 2);	/* function call for single address read */
                //ReadCont(Register, 2);
                  
                       ReadSingle(Register, 1);	
		irqCLR;
	}
}	/* InterruptHandlerReader */

/*
 =======================================================================================================================
 =======================================================================================================================
 */





void delay_ms(unsigned int n_ms) {
    unsigned int ii1, ii0;
    for(ii0=n_ms; ii0>0; ii0--) {
        ii1 = 0x07FF;                    // Delay
        do (ii1--);
        while (ii1 != 0);
    }
}

void CounterSet(void)
{
	TACTL |= TACLR;
	TACTL &= ~TACLR;			//reset the timerA
	TACTL |= TASSEL0 + ID1 + ID0;		//ACLK, div 8, interrupt enable, timer stoped
	
	TAR = 0x0000;
	TACCTL0 |= CCIE;			//compare interrupt enable
}//CounterSet()

void BaudSet(unsigned char mode)
{
	if(mode == 0x00)
	{
		UCA0BR0 = BAUD0;	/* baud rate register */
		UCA0BR1 = BAUD1;
	}
	else
	{
		UCA0BR0 = BAUD0EN;	/* baud rate register */
		UCA0BR1 = BAUD1EN;
	}
}	/* BaudSet */

  void main(void) {

    // initialize peripherals
    WDTCTL = WDTPW + WDTHOLD;
    P3OUT &=~BIT0;
    P3DIR |= BIT0;
    P2OUT &=~BIT2;
    P3OUT &=~0x06;
    ledselect1;
    ledselect2;
    delay_ms(1);

    PARset();     //Set Port Functions for Parallel Mode


    InitialSettings();                  // Set MCU Clock Frequency to 13.56 MHz and OOK Modulation
 
    /*Now switch from DCO to external 13.56 MHz clock*/

    OSCsel(0x00);       //set the oscilator
    

    EnableInterrupts;                    // General enable interrupts
    delay_ms(10);
    		//set OOK port tristate P2.2 LOW
    //ENABLE = 1;

    //POLLING = 1;
    FindTags(0x00);
}


// === end of main =====================================================

#pragma vector=TIMERA0_VECTOR
__interrupt void TimerAhandler(void)
{	
	
          unsigned char Register[2];

       
	stopCounter;
	
        Register[0] = IRQStatus;	/* IRQ status register address */
        Register[1] = IRQMask;		//Dummy read	
	
        
        ReadCont(Register, 2);
      

        uid[0]=*Register;

        *Register = *Register & 0xF7;	//set the parity flag to 0

	
	
        if(*Register == 0x00 || *Register == 0x80) //added code
          	
			i_reg = 0x00;
	else
		i_reg = 0x01;
	
	__low_power_mode_off_on_exit();
	
}//TimerAhandler

#pragma vector = PORT2_VECTOR
__interrupt void Port_B (void)		/* interrupt handler */
{
	
         P3OUT ^= BIT2;
         
	stopCounter;					/* stop timer mode */

	do
	{
		irqCLR;						/* PORT2 interrupt flag clear */
		Register[0] = IRQStatus;	/* IRQ status register address */
        	Register[1] = IRQMask;		//Dummy read	
            //    ReadSingle(Register, 2);	/* function call for single address read */
                
                  ReadSingle(Register, 1);	/* function call for single address read */

		/* IRQ status register has to be read */

		if(*Register == 0xA0)
		{	/* TX active and only 3 bytes left in FIFO */
			goto FINISH;
		}


		InterruptHandlerReader(&Register[0]);
	} while((irqPORT & irqPIN) == irqPIN);
FINISH:
	__low_power_mode_off_on_exit();
}


**Attention** This is a public forum