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

📄 main.c

📁 用430控制FM1702SL----------------------------好东西
💻 C
📖 第 1 页 / 共 2 页
字号:
#include   <msp430x44x.h>

#define uchar unsigned char
//====================================================================
#define si                        P6IN&BIT0         //P6.6   12
#define sck(a)      a?(P6OUT |=BIT1):(P6OUT &=~BIT1)//p6.5   13
#define so(a)       a?(P6OUT |=BIT2):(P6OUT &=~BIT2)//p6.4   14
#define cs(a)       a?(P6OUT |=BIT3):(P6OUT &=~BIT3)//p6.3   15
#define rst1702(a)  a?(P6OUT |=BIT4):(P6OUT &=~BIT4)//p6.2   23
#define led(a)      a?(P6OUT |=BIT5):(P6OUT &=~BIT5)//p6.5   LED
//;==============================================
//;FM1702SL控制寄存器定义
//;==============================================
#define		Page_Reg		          0x00               //选择寄存器组
#define		Command_Reg		          0x01               //指令寄存器
#define		FIFO_Reg		          0x02               //64ByteFIFO输入输出寄存器
#define		FIFOLength_Reg		          0x04               //当前FIFO内的Byte数
#define		SecondaryStatus_Reg  	          0x05               //各种状态标示位寄存器
#define		InterruptEn_Reg		          0x06               //中断使能/禁止控制寄存器
#define		InterruptRq_Reg		          0x07               //中断请求标示寄存器
#define		Control_Reg		          0x09               //各种控制标示寄存器
#define		ErrorFlag_Reg		          0x0A               //上一条指令结束后错误标示
#define		BitFraming_Reg	     	          0x0F               //调整面向BIT 的特格式
#define		TxControl_Reg		          0x11               //发射器控制寄存器
#define		CwConductance_Reg	          0x12               //选折发射脚TX1和TX2的发射天线阻抗
#define		RxControl2_Reg		          0x1E               //发射器控制寄存器
#define		ChannelRedundancy_Reg	          0x22               //选择数据效验种类格式模式
#define         RxWait_Reg                        0x21               //选择发射发射的时间间隔
//;==============================================
//;FM1702SL发送命令代码
//;==============================================
#define		WriteEE			  0x01                       //从FIFO惠存反读取数据并写入闪存中
#define		LoadKeyE2		  0x0B                       //将密钥从闪存复制到key中
#define         Transmit                  0x1A                       //发送FIFO缓存数据
#define		Transceive		  0x1E                       //发送FIFO缓存数据,发送完后自动激活接收电路
#define		Authent1		  0x0C                       //执行cryptorsuanfa 算法的认证过程的第一步
#define		Authent2		  0x14                       //执行cryptorsuanfa 算法的认证过程的第二步


uchar rf_over;
char ack,retc,m,buff[48],Card_UID[5];
char mm[6]={0xff,0xff,0xff,0xff,0xff,0xff};

////===============================================
//以下为FM1702读写的子程序
//===============================================
char SPIRead(char SpiAddress,char *ramadr,char width);
char SPIWrite(char SpiAddress,char *ramadr,char width);
char SPI_Init();
char FM1702SL_Init();
char Clear_FIFO();
char Write_FIFO(char *ramadr,char width);
char Read_FIFO(char *ramadr);
char Request();
char Command_Send(char comm,char *ramadr,char width);
char Get_UID();
char Select_Tag();
char Load_Key(char n,char *ramadr);
char Load_Key_EE(char n);
char Authentication(char n);
char rdbuff(char sq,char n);
char Read_Block(char n);                    //
char Write_Block(char *ramadr,char n);
///+++++++++++++++++card++++++++++++++++++++++++///
//void wiegend(char *ramadr,char n);

void  inisub();
void  rddel();
void  delay50us();
void delay1ms(unsigned int n);

main()
{
 WDTCTL=WDTPW+WDTHOLD;  //禁止看门狗 
 inisub();//初始化端口
 //led(1);
 while(1)
  {
 delay1ms(40);
 rst1702(0);

 delay1ms(20);
 retc=SPI_Init();
 if(retc) goto cardsub_end1;//错误
 retc=FM1702SL_Init();
 if(retc) goto cardsub_end1;
 retc=Request();
 if(retc)
 {rf_over=0;
 	//led(1);
 	goto cardsub_end1;}
 if(rf_over) goto cardsub_end1;
 retc=Get_UID();
 
 if(retc)
 {delay1ms(10);
 retc=Get_UID();
}
 if(retc) goto cardsub_end1;
  retc=Select_Tag();
  led(1);
 if(retc)goto cardsub_end1;

 //**********寻卡结束********************//
  retc=Load_Key(0x80,mm);//加载购电区的密钥
  if(retc)goto cardsub_end1;//待定
  retc=Load_Key_EE(0x80);//加载购电区的密钥
  if(retc)goto cardsub_end1;//待定
 //***********开始卡操作******************//Load_Key Load_Key_EE

retc=rdbuff(0x7,0x4);//读块0
if(retc){goto cardsub_end1;}
retc=Write_Block(buff,0x4);
if(retc){goto cardsub_end1;}
 rf_over=1;
 led(0);
cardsub_end1:

     rst1702(1);


  	}
}

////////////////////延时////////////////////
void  rddel()
{        _NOP();
	 _NOP();
	 _NOP();
         _NOP();
	 _NOP();
	}

/////////////////////////////////////////////////////////////////
void delay1ms(unsigned int n)
{
    unsigned int i,j;
    for(i=0;i<n;i++)
    {
        for(j=0;j<150;j++);             // 按一指令1us来计算
    }
}
//////////////////////////////////////////////////////////////////

void  delay50us()
{int i;
	for (i=3;i>0;i--)
	    rddel();
	}

////////////////初始化//////////////////////////////////
void inisub()
{
    P6DIR=0x00;   
 
 P6DIR |=BIT1;  //           P6.1为SCK输出
 P6DIR |=BIT2;  //           P6.2为SI输出
 P6DIR |=BIT3;  //           P6.3为SPI-CS输出
 P6DIR |=BIT4;  //           P6.4为RST1702输出
 P6DIR |=BIT5;  //           P6.5为LED指示灯输出
 P6DIR &=~BIT0; //           P6.0为信号输入     FM1702为SO输出
 P6SEL = 0;
}

////////////////SPI读//////////////////////////////////////
char SPIRead(char SpiAddress,char *ramadr,char width)
{  char i,j,adrtemp;

	adrtemp=SpiAddress;
	if((adrtemp&0xc0)==0)
	  {adrtemp=((adrtemp<<1)|0x80);
	  	cs(0);
	  	for(i=0;i<8;i++)
	  	{if((adrtemp<<i)&0x80)
                             so(1);
	  		else so(0);
	  		sck(1);
                        _NOP();
                        _NOP();
                        _NOP();
                        _NOP();
	  		sck(0);
//	  		adrtemp=adrtemp<<1;
	  		}

	  	for(j=0;j<width;j++)
	  	    {if(j!=width-1)  adrtemp=(SpiAddress|0x40)<<1;
                      else   adrtemp=0;
                         ramadr[j]=0;
	  	    	for(i=0;i<8;i++)
	  	    	   {if((adrtemp<<i)&0x80)
                                so(1);
	  		   else so(0);
	  		        sck(1);
	  		        ramadr[j]=ramadr[j]<<1;
	  		        if(si)ramadr[j]+=0x1;

	  		        sck(0);
//	  		        adrtemp=adrtemp<<1;
	  	    	   	}

	  	    	}
	  	cs(1);
	  	return(0);
	  	}
 else return(1);
}
//=======================================================
//SPI写入程序
//入口:
//SpiAddress:	要写到FM1702SL内的寄存器地址[0x01~0x3f]
//*ramadr   要写入的数据在Ram中的首地址
//width:    要写入的字节数
//出口: 0:成功,1:失败
//作者: 张
//====================================================
char SPIWrite(char SpiAddress,char *ramadr,char width)
{char i,j,adrtemp;
	adrtemp=SpiAddress;
	if((adrtemp&0xc0)==0)
	  {adrtemp=((adrtemp<<1)&0x7e);
	  	cs(0);
	  	for(i=0;i<8;i++)
	  	{if((adrtemp<<i)&0x80)
                        so(1);
	  	   else so(0);
	  		sck(1);
                        _NOP();
                        _NOP();
                        _NOP();
	  		sck(0);
//	  		adrtemp=adrtemp<<1;
	  		}

	  	for(j=0;j<width;j++)
	  	    {adrtemp= ramadr[j];
	  	    		for(i=0;i<8;i++)
	  	    	   {if((adrtemp<<i)&0x80)
                                so(1);
	  		   else so(0);
	  		        sck(1); 
                                _NOP();
                                _NOP();
                                _NOP();
	  		        sck(0);
//	  		        adrtemp=adrtemp<<1;
	  	    	   	}
	  	    	}
	  	cs(1);
	  	return(0);
	  	}
 else return(1);
	}
char SPI_Init()
{
		char acktemp,temp[1];
		acktemp=SPIRead(Command_Reg,temp,1);
		if(acktemp) return(1);
		if(temp[0]) return(1);
		 else
		  { temp[0]=0x80;
		  	acktemp=SPIWrite(Page_Reg,temp,1);
		   	if(acktemp) return(1);
		   	acktemp=SPIRead(Command_Reg,temp,1);
		    if(acktemp) return(1);
		    if(temp[0]) return(1);
		    acktemp=SPIWrite(Page_Reg,temp,1);
		   	if(acktemp) return(1);
		   	return(0);
		   	}

}
char FM1702SL_Init()
{char acktemp,temp[1];
	temp[0]=0x7f;
	acktemp=SPIWrite(Interru tEn_Reg,temp,1);
	if(acktemp) return(1);
  temp[0]=0x7f;
	acktemp=SPIWrite(InterruptRq_Reg,temp,1);

	if(acktemp) return(1);
	temp[0]=0x5b;

⌨️ 快捷键说明

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