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

📄 fm1702slspi.c

📁 C51读写fm1702sl SPI接口的读写程序 IO口模拟SPI接口
💻 C
📖 第 1 页 / 共 2 页
字号:
/*功能: 该函数实现FM1702SL将EE中的密码调入密码缓冲区中 		     */ 
/*								     */
/*输入:                                                              */
/*       N/A							     */
/*                                                                   */
/*输出:                                                              */
/*	FALSE	密码装载执行失败				     */
/*	TRUE	密码装载执行成功			 	     */
/*********************************************************************/
uchar	Load_Key_EE(void)
{
	uchar temp;
	
	temp=Command_Send(2, buffer, LoadKeyE2);	//将待发送数据写入FIFO中,并执行发送接收命令
	if(temp==FALSE)
		return FALSE;
	
	temp=read_reg(ErrorFlag);			//读errorFlag寄存器
	temp=temp&0x40;
	if(temp==0x00)
		return	TRUE;
	return FALSE;
}
/*********************************************************************/
/*名称: Authentication                                               */
/*功能: 该函数实现FM1702SL向存在于其发射范围内的卡片发射认证信号     */ 
/*								     */
/*输入:                                                              */
/*       Block_num, 块号					     */
/*                                                                   */
/*输出:                                                              */
/*	FALSE	三重认证执行失败				     */
/*	TRUE	三重认证执行成功			 	     */
/*********************************************************************/
uchar	Authentication(uchar BlockNum)
{
	uchar	temp,i;
	
	write_reg(ChannelRedundancy,0x0f);		//写ChannelRedundancy寄存器
	buffer[0]=0x60;
	buffer[1]=BlockNum;
	for(i=0;i<4;i++)
		buffer[i+2]=UID[i];
	temp=Command_Send(6, buffer, Authent1);		//将待发送数据写入FIFO中,并执行发送接收命令
	if(temp==FALSE)
		return	FALSE;
	
	temp=read_reg(ErrorFlag);			//读errorFlag寄存器
	temp=temp&0x0e;
	if(temp!=0x00)
		return	FALSE;
	
	temp=Command_Send(0,buffer,Authent2);		//将待发送数据写入FIFO中,并执行发送接收命令
	if(temp==FALSE)
		return	FALSE;
	
	temp=read_reg(ErrorFlag);			//读errorFlag寄存器
	temp=temp&0x0e;
	if(temp!=0x00)
		return	FALSE;
		
	temp=read_reg(Control);				//读Control寄存器
	temp=temp&0x08;
	if(temp!=0x00)
		return	TRUE;
	return	FALSE;
}
/*********************************************************************/
/*名称: Write_Block                                                  */
/*功能: 该函数实现FM1702SL向存在于其发射范围内的卡片发射写块信号     */ 
/*								     */
/*输入:                                                              */
/*       Block_num, 块号					     */
/*                                                                   */
/*输出:                                                              */
/*	FALSE	写块操作执行失败				     */
/*	TRUE	写块操作执行成功			 	     */
/*********************************************************************/
uchar	Write_Block(uchar BlockNum)
{
	uchar	temp;
	
	write_reg(ChannelRedundancy,0x07);		//写ChannelRedundancy寄存器
	
	buffer[16]=buffer[0];
	buffer[17]=buffer[1];
	
	buffer[0]=0xa0;
	buffer[1]=BlockNum;
	temp=Command_Send(2, buffer, Transceive);	//将待发送数据写入FIFO中,并执行发送接收命令
	if(temp==FALSE)
		return	FALSE;
	
	temp=Read_FIFO(buffer);
	if(temp==0x00)
		return FALSE;
	if(temp==0x01)
	{
		if(buffer[0]!=0x0a)
			return	FALSE;
	}
	
	buffer[0]=buffer[16];
	buffer[1]=buffer[17];
	temp=Command_Send(16, buffer, Transceive);	//将待发送数据写入FIFO中,并执行发送接收命令
	if(temp==FALSE)
		return	FALSE;
	
	temp=Read_FIFO(buffer);
	if(temp==0x00)
		return FALSE;
	if(temp==0x01)
	{
		if(buffer[0]!=0x0a)
			return	FALSE;
	}	
	return TRUE;
}
/*********************************************************************/
/*名称: Read_Block                                                   */
/*功能: 该函数实现FM1702SL向存在于其发射范围内的卡片发射读块信号     */ 
/*								     */
/*输入:                                                              */
/*       Block_num, 块号					     */
/*                                                                   */
/*输出:                                                              */
/*	FALSE	读块操作执行失败				     */
/*	TRUE	读块操作执行成功			 	     */
/*********************************************************************/
uchar	Read_Block(uchar BlockNum)
{
	uchar	temp;
	
	write_reg(ChannelRedundancy,0x0f);		//写ChannelRedundancy寄存器
	buffer[0]=0x30;
	buffer[1]=BlockNum;
	temp=Command_Send(2, buffer, Transceive);	//将待发送数据写入FIFO中,并执行发送接收命令
	if(temp==FALSE)
		return	FALSE;
	
	temp=read_reg(ErrorFlag);			//读errorFlag寄存器
	temp=temp&0x0e;
	if(temp!=0x00)
		return	FALSE;
	
	temp=Read_FIFO(buffer);
	if(temp==0x00)
		return	FALSE;
	if(temp==0x10)
		return 	TRUE;
	return	FALSE;
}

uchar Check_UID(void)
{
	uchar temp;
	uchar i;
	
	temp=0x00;
	for(i=0;i<5;i++)
	{
		temp=temp^UID[i];
	}
	if(temp==0)
		return TRUE;
	return FALSE;
}

void delay1(unsigned char dlength)
{ 
  uchar i;
  for (i=0;i<dlength;i++)
  {
       _nop_();
  }
}

unsigned char rev(unsigned char tem)
{
	uchar idata i;
	unsigned char idata var=0,var_snt=0;
	
		var=0; 
		for (i=0;i<8;i++)          // 8位字节带进位左移
		{ 
			
			var_snt=tem&0x80;            // 选择高位
			if (var_snt==0x80) si=1;     // 输出高位
      			else si=0;	
      			tem<<=1;	
      			var<<=1;
      			CY=so;
			if (CY==1) 
				var+=1;         // 带进位左移
				
			sck=1;                 // 产生SCK脉冲	
			delay1(1);		
			sck=0;	 
	 	}	
	return(var);          // 返回
	 	
} 

void Send(unsigned char var) 
{ 
	unsigned char data i,tem;
	 
	for (i=0;i<8;i++)          		// 8位字节输出
	{
		delay1(1);	                // 使SCK为低电平
		tem=var&0x80;            	// 选择高位
		if (tem==0x80) si=1;     	// 输出高位
      		else si=0;
      		delay1(1);
		sck=1;                   	// 使SCK为1
		var<<=1;	
		delay1(1);	
		sck=0; 				// 左移1位
	}  
}                  

unsigned char read_reg(uchar idata SpiAddress)
{
	uchar idata rdata;
	SpiAddress=SpiAddress<<1;
	SpiAddress=SpiAddress | 0x80; 
	spi_cs=0;	
	Send(SpiAddress);
	rdata=rev(0);
	spi_cs=1;		
	return(rdata);

}

void read_mult_dat(uchar idata SpiAddress,uchar *dat,uchar n )
{
		uchar i;
		SpiAddress=SpiAddress<<1;
		SpiAddress=SpiAddress | 0x80; 
		spi_cs=0;		
		Send(SpiAddress);
		for(i=0;i<n-1;i++)
			dat[i]=rev(SpiAddress);
		dat[n-1]=rev(0);		
		spi_cs=1;		
	
}

void write_mult_dat(uchar idata SpiAddress,uchar *dat,uchar n)
{
		uchar i;
		SpiAddress=SpiAddress<<1;
		SpiAddress=SpiAddress&0x7f;
		spi_cs=0; 
		so=0;
		Send(SpiAddress);	
		for(i=0;i<n;i++)
		{
			Send(dat[i]);
		}
		spi_cs=1;	
}

void write_reg(uchar idata SpiAddress,uchar dat)
{
		SpiAddress=SpiAddress<<1;
		SpiAddress=SpiAddress &0x7f;
		spi_cs=0; 
		so=0;
		Send(SpiAddress);		
		Send(dat);	
		spi_cs=1;
}

⌨️ 快捷键说明

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