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

📄 mcu.c

📁 读卡程序.rar
💻 C
字号:
#include "main.h"

//---------------spi interface initialize----------------------------
void SPI_Initialize()
{   
	while (!(P3IN & 0x08));              // If clock sig from mstr stays low,
                                         // it is not yet in SPI mode
	P3SEL |= BIT1 + BIT2 + BIT3;         // P3.1,3.2,3.3 UCB0SIMO,UCB0SOMI,UCBOCLK option select
	UCB0CTL1 |= UCSWRST;                 // Disable USCI first
	UCB0CTL0 |= UCCKPL + UCMSB + UCSYNC; // 3-pin, 8-bit SPI slave
	UCB0CTL1 &= ~UCSWRST;    
	//IE2 |= UCB0RXIE;
	//__bis_SR_register(LPM4_bits + GIE);       // Enter LPM4, enable interrupts
}

//---------------initialize system clock-----------------------------
void OSCsel(void)
{
    unsigned int ii1;

    BCSCTL1 |= XTS + XT2OFF;                       // ACLK = LFXT1 HF XTAL
    BCSCTL3 |= LFXT1S1;                       // 3 ?16MHz crystal or resonator
		
    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)
}

//---------------delay(using DCO)---------------------------------------
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);
    }
}

//---------------initialize system--------------------------------------
void Initialize(void)
{
	WDTCTL = WDTPW + WDTHOLD;
	SPI_Initialize();

	EN_Set;
	TRFDisable;
	delay_ms(1);
	TRFEnable;
	delay_ms(1);

	PARset(); 
	
        LED_Set;
        
    SetTRF();
    InitialTRF7960();
    OSCsel();
    EnableInterrupts; 
}

//---------------SPI send 1 byte data------------------------------------
void Put_byte(unsigned char abyte)
{
	//SlaveSelectLOW;
	UCB0TXBUF = abyte;
	//SlaveSelectHIGH;

}

//---------------operate the interrupt data------------------------------
void InterruptHandlerReader(unsigned char *Register)
{   
	if(*Register == 0xA0)// TX active and only 3 bytes left in FIFO 
		i_reg = 0x00;

	else if(*Register == BIT7)//no response interrupt
	{					/* TX complete */
		i_reg = 0x00;
		*Register = Reset;			/* reset the FIFO after TX */
		DirectCommand(Register);
    }	
 
 	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)
	{
        buf[RXTXstate] = FIFO;
		ReadCont(&buf[RXTXstate], 9);
		RXTXstate = RXTXstate + 9;

		if(irqPORT & irqPIN)
		{
			*Register = IRQStatus;
			ReadSingle(Register, 1);
			irqCLR;

			if(*Register == 0x40)
			{
				*Register = FIFOStatus;
				ReadSingle(Register, 1);
				*Register = 0x0F & (*Register + 0x01);//indicates how many bytes are loaded in FIFO were not read out yet
				buf[RXTXstate] = FIFO;

				ReadCont(&buf[RXTXstate], *Register);//read out the left bytes
				RXTXstate = RXTXstate + *Register;

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

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

				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)
				i_reg = 0x02;
		}

		else
		{
			IrqReset();
			if(Register[0] == 0x00) //receive end
			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;
	}

	else if((*Register & BIT2) == BIT2)//Byte framing or EOF error
	{
		if((*Register & BIT5) == BIT5)
		{
			i_reg = 0x01;	/* RX active */
			RXErrorFlag = 0x02;
		}
		else
			i_reg = 0x02;
	}

	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);

		IrqReset();
     	
		irqCLR;
	}
}


//-------------------external interrupt--------------------------------------
#pragma vector = PORT2_VECTOR
__interrupt void Port_B (void)		/* interrupt handler */
{
	unsigned char Register[4];
					
	do
	{
		irqCLR;						/* PORT2 interrupt flag clear */
		Register[0] = IRQStatus;
		Register[1] = IRQMask;
		ReadCont(Register, 2);
		if(*Register == 0xA0)
			__low_power_mode_off_on_exit();
             
		InterruptHandlerReader(&Register[0]);				
	}
	while((irqPORT & irqPIN) == irqPIN);
}

//----------------parallel interface initialize------------------------------
void PARset(void)
{
	EN_Set;
	TRFDirOUT;			/* P4 output */
	TRFFunc;
	TRFWrite = 0x00;	/* P4 set to 0 - choose parallel inteface for the TRF796x */

	clkOFF;
	clkPOUTset;			/* DATA_CLK on P1.2 */

	irqPINset;
	irqEDGEset;			/* rising edge interrupt */
}						

⌨️ 快捷键说明

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