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

📄 main.c

📁 MS430+FM1702y读卡器程序,读写寄存器和卡.
💻 C
📖 第 1 页 / 共 2 页
字号:
#include "msp430x22x4.h"

#define DELTA_1MHZ    244                   // 244 x 4096Hz = 999.4Hz
#define DELTA_2MHZ    488                   // 488 x 4096Hz = ~2MHz
#define DELTA_8MHZ    1953                  // 1953 x 4096Hz = 7.99MHz
#define DELTA_12MHZ   2930                  // 2930 x 4096Hz = 12.00MHz
#define DELTA_16MHZ   3906                  // 3906 x 4096Hz = 15.99MHz

//定义FM1702SL各管脚。采用SPI接口。
#define TI_FM_NSS_PxOUT         P3OUT       //CS管脚采用P3.0
#define TI_FM_NSS_PxDIR         P3DIR
#define TI_FM_NSS_PIN           BIT7
//SPI使用MSP430的USCIB0,P3.1:SIMO;P3.2:SOMI;P3.3:CLK
#define TI_FM_SPI_USCIB0_PxSEL  P3SEL
#define TI_FM_SPI_USCIB0_PxDIR  P3DIR
#define TI_FM_SPI_USCIB0_PxIN   P3IN
#define TI_FM_SPI_USCIB0_SIMO   BIT1
#define TI_FM_SPI_USCIB0_SOMI   BIT2
#define TI_FM_SPI_USCIB0_UCLK   BIT3

//;==============================================
//;FM1702SL控制寄存器定义
//;==============================================
#define		Page_Reg		          0x00
#define		Command_Reg		        0x01
#define		FIFO_Reg		          0x02
#define		FIFOLength_Reg		    0x04
#define		SecondaryStatus_Reg  	0x05
#define		InterruptEn_Reg		    0x06
#define		InterruptRq_Reg		    0x07
#define		Control_Reg		        0x09
#define		ErrorFlag_Reg		      0x0A
#define		BitFraming_Reg	     	0x0F
#define		TxControl_Reg		      0x11
#define		CwConductance_Reg	    0x12
#define		RxControl2_Reg		    0x1E
#define		ChannelRedundancy_Reg	0x22
#define         RxWait_Reg            0x21

char temp[512];
unsigned char ccc;
unsigned char acktemp;
void Delayms(int n)
{//在SMCLK为2MHz时,延时1ms
  char i;
  while(n--)
  for(i=0;i<155;i++);
}

void Set_DCO(unsigned int Delta)            // Set DCO to selected frequency
{
  unsigned int Compare, Oldcapture = 0;

  BCSCTL1 |= DIVA_3;                        // ACLK = LFXT1CLK/8
  TACCTL2 = CM_1 + CCIS_1 + CAP;            // CAP, ACLK
  TACTL = TASSEL_2 + MC_2 + TACLR;          // SMCLK, cont-mode, clear

  while (1)
  {
    while (!(CCIFG & TACCTL2));             // Wait until capture occured
    TACCTL2 &= ~CCIFG;                      // Capture occured, clear flag
    Compare = TACCR2;                       // Get current captured SMCLK
    Compare = Compare - Oldcapture;         // SMCLK difference
    Oldcapture = TACCR2;                    // Save current captured SMCLK

    if (Delta == Compare)
      break;                                // If equal, leave "while(1)"
    else if (Delta < Compare)
    {
      DCOCTL--;                             // DCO is too fast, slow it down
      if (DCOCTL == 0xFF)                   // Did DCO roll under?
        if (BCSCTL1 & 0x0f)
          BCSCTL1--;                        // Select lower RSEL
    }
    else
    {
      DCOCTL++;                             // DCO is too slow, speed it up
      if (DCOCTL == 0x00)                   // Did DCO roll over?
        if ((BCSCTL1 & 0x0f) != 0x0f)
          BCSCTL1++;                        // Sel higher RSEL
    }
  }
  TACCTL2 = 0;                              // Stop TACCR2
  TACTL = 0;                                // Stop Timer_A
  BCSCTL1 &= ~DIVA_3;                       // ACLK = LFXT1CLK
}


/****************************************************************************
* 名称:SetUCB0_SPIMode()
* 功能:初始化与DS1390的SPI接口
* 入口参数:无
* 出口参数:无
****************************************************************************/
void SetUCB0_SPIMode(void)
{
  
  UCB0CTL1 = UCSWRST; 
  TI_FM_NSS_PxDIR |= TI_FM_NSS_PIN;          
  TI_FM_NSS_PxOUT |= TI_FM_NSS_PIN;          //NSS,MSP430 USCIBSET 是最合适的选择,但是为了USCIA作为SPI,USCIBSET复用为USCIBCLK。

  TI_FM_SPI_USCIB0_PxSEL |= TI_FM_SPI_USCIB0_SIMO | TI_FM_SPI_USCIB0_SOMI | TI_FM_SPI_USCIB0_UCLK;
                                            // SPI option select
  TI_FM_SPI_USCIB0_PxDIR |= TI_FM_SPI_USCIB0_SIMO + TI_FM_SPI_USCIB0_UCLK;
                                            // SPI TX out direction
  
 // UCB0CTL0 = UCSYNC + UCMST  + UCMSB;            //8-bit SPI Master **SWRST**
  UCB0CTL0 = UCSYNC + UCMST  + UCMSB;
 //+ UCCKPH
  UCB0CTL1 = UCSSEL_2;              //  
  UCB0BR0 = 0x10;                              //
  UCB0BR1 = 0x00;                              // 
 
  UCB0CTL1 &= ~UCSWRST;                          // Initialize USART state machine 
}

//从SPI接口读入数据
char SPIRead(char SpiAddress,char *ramadr,char width)
{
  char j,adrtemp;
  adrtemp = SpiAddress;
  if((adrtemp&0xc0)==0)
	{adrtemp=((adrtemp<<1)|0x80);
	  TI_FM_NSS_PxOUT &= ~TI_FM_NSS_PIN;          //NSS enable
      IFG2 &= ~UCB0RXIFG;
      UCB0TXBUF = adrtemp;
      while (!(IFG2&UCB0RXIFG));                  // Wait for TX to finish
      IFG2&=~ UCB0RXIFG;  
	  for(j=0;j<width;j++)
	  	    {if(j!=width-1)  adrtemp=(SpiAddress|0x40)<<1;
                      else   adrtemp=0;
                         ramadr[j]=0;
       UCB0TXBUF = adrtemp;
      while (!(IFG2&UCB0RXIFG));                  // Wait for TX to finish
        ;
      IFG2&=~ UCB0RXIFG;            
ramadr[j] = UCB0RXBUF;
	  	    	}
	  	TI_FM_NSS_PxOUT |= TI_FM_NSS_PIN;          //NSS disable
	  	return(0);
	  	}
 else return(1);
}


char SPIWrite(char SpiAddress,char *ramadr,char width)
{
  char j,adrtemp;
  adrtemp=SpiAddress;
  if ((adrtemp & 0xc0) == 0)
  {
    adrtemp = ((adrtemp << 1) & 0x7e);
	TI_FM_NSS_PxOUT &= ~TI_FM_NSS_PIN;          //NSS enable
    UCB0TXBUF = adrtemp;
    while (!(IFG2&UCB0RXIFG));                  // Wait for TX to finish
	for(j = 0; j < width; j++)
	{
      adrtemp= ramadr[j];
      IFG2 &= ~UCB0RXIFG;
      UCB0TXBUF = adrtemp;
      while (!(IFG2&UCB0RXIFG));                  // Wait for TX to finish
	  	    	}
	  	TI_FM_NSS_PxOUT |= TI_FM_NSS_PIN;          //NSS disable
	  	return(0);
	  	}
 else return(1);
}




//从SPI接口写入数据
void WriteRawIO(unsigned char Address, unsigned char value)
{
  TI_FM_NSS_PxOUT &= ~TI_FM_NSS_PIN;          //NSS enable
  IFG2 &= ~ UCB0RXIFG;
  UCB0TXBUF = (Address<<1);
  while (!(IFG2&UCB0RXIFG));                  // Wait for TX to finish
    ;
  IFG2&=~ UCB0RXIFG;
  UCB0TXBUF = value;
  while (!(IFG2&UCB0RXIFG)); 
    ;
  TI_FM_NSS_PxOUT |= TI_FM_NSS_PIN;          //NSS disable
}

//从SPI接口读出数据
unsigned char ReadRawIO(unsigned char Address)
{
  unsigned char c_R;
  c_R = (Address<<1)|0x80;
  TI_FM_NSS_PxOUT &= ~TI_FM_NSS_PIN;          //NSS enable
  IFG2 &= ~UCB0RXIFG;
  UCB0TXBUF = c_R;
 while (!(IFG2&UCB0RXIFG));                  // Wait for TX to finish
  IFG2 &= ~UCB0RXIFG;                         // Clear flag set during last write
  UCB0TXBUF = 0;                              // Dummy write so we can read data
  //UCB0TXBUF =(Address<<1)|0x80;
  while (!(IFG2&UCB0RXIFG));                  // Wait for RX to finish
  c_R = UCB0RXBUF;
  IFG2 &= ~UCB0RXIFG;
  TI_FM_NSS_PxOUT |= TI_FM_NSS_PIN;          //NSS disable
  return c_R;
}

///////////////////////////////////////////////////////////////////////////////
//          G E N E R I C    W R I T E
///////////////////////////////////////////////////////////////////////////////
void WriteIO(unsigned char Address, unsigned char value)
{
   WriteRawIO(Address,value);                 // write value at the specified 
                                              // address
}

///////////////////////////////////////////////////////////////////////////////
//          G E N E R I C    R E A D
///////////////////////////////////////////////////////////////////////////////
unsigned char ReadIO(unsigned char Address)
{
    unsigned char c;
   c = ReadRawIO(Address);                    // read value at the specified 
                                           // address
   return c;
}  

#define SEC_NO_MICORE
#ifndef SEC_NO_MICORE
///////////////////////////////////////////////////////////////////////////////
//     W R I T E   S E V E R A L   M E M O R Y   L O C A T I O N S 
///////////////////////////////////////////////////////////////////////////////
void WriteIOBlock(unsigned char *Addr_Data, unsigned short len)
{
    unsigned short cnt;

   for (cnt = 0; cnt < len; cnt++)
   {
        // write value at the specified address
       WriteRawIO(Addr_Data[cnt*2],Addr_Data[cnt * 2 + 1]); 
   }
}

///////////////////////////////////////////////////////////////////////////////
//     R E A D   S E V E R A L   M E M O R Y   L O C A T I O N S 
///////////////////////////////////////////////////////////////////////////////
void ReadIOBlock(unsigned char* Addr_Data, unsigned short len)
{
   unsigned short cnt;

   for (cnt = 0; cnt < len; cnt)
   {
       Addr_Data[cnt*2 + 1] = ReadRawIO(Addr_Data[cnt*2]);// read value at the 
                                                      // specified address
   }
}  
#endif
char FM1702SL_Init()
{char temp[1];

	temp[0]=0x7f;
	WriteIO(InterruptEn_Reg,temp[0]);
  WDTCTL = WDTPW+WDTCNTCL+WDTSSEL;            // wdt 定时1S 
  acktemp = ReadRawIO(InterruptEn_Reg);
  Delayms(50);                                // 延时,等待DCO稳定
  Delayms(50);
  temp[0]=0x7f;
	WriteIO(InterruptRq_Reg,temp[0]);
  WDTCTL = WDTPW+WDTCNTCL+WDTSSEL;            // wdt 定时1S 
acktemp = ReadRawIO(InterruptEn_Reg);
  Delayms(50);                                // 延时,等待DCO稳定
  Delayms(50);
  WDTCTL = WDTPW+WDTCNTCL+WDTSSEL;            // wdt 定时1S 
acktemp = ReadRawIO(InterruptEn_Reg);
  Delayms(50);                                // 延时,等待DCO稳定
  Delayms(50);
	temp[0]=0x5b;
	WriteIO(TxControl_Reg,temp[0]);
  WDTCTL = WDTPW+WDTCNTCL+WDTSSEL;            // wdt 定时1S 
acktemp = ReadRawIO(InterruptEn_Reg);
  Delayms(50);                                // 延时,等待DCO稳定
  Delayms(50);
	temp[0]=0x1;
	WriteIO(RxControl2_Reg,temp[0]);
  WDTCTL = WDTPW+WDTCNTCL+WDTSSEL;            // wdt 定时1S 
Delayms(50);
  acktemp =ReadRawIO (InterruptEn_Reg);
  Delayms(50);                                // 延时,等待DCO稳定
  Delayms(50);
	temp[0]=0x7;
	WriteIO(RxWait_Reg,temp[0]);
Delayms(50);
  acktemp = ReadRawIO(RxWait_Reg);
  Delayms(50);                                // 延时,等待DCO稳定
  Delayms(50);
//   acktemp=SPIRead(RxWait_Reg,temp,1);
//	    if(acktemp) return(1);
	return(0);
	}

void ResetFM()
{
  P1DIR |= BIT2;

⌨️ 快捷键说明

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