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

📄 mss_spi.c

📁 一个SPI通讯方面的源代码
💻 C
📖 第 1 页 / 共 3 页
字号:
	{
		HandwareErr=ERROR;		// MSS不能正常工作
		return;
	}
	
power_off:
	MSS_PWR_ON=1;				// 清MSS电源使能

	for(i=0;i<20;i++)
	{
		Wait10ms();				// 等待200ms
		Rstwdt();				// 喂狗
	}

	count--;

	goto init_again;
}

///////////////////////////////////////////////////////////////////////////////
// 显示公共错误信息
///////////////////////////////////////////////////////////////////////////////
void disperr(uchar id)
{
	Rstwdt();			// 喂狗

	GLCD_Locate(0,32);
	dprintf("              ",14);			// 清行
	reverse=1;
	GLCD_Locate(16,32);
	dprintf(failure,12);					// 失败			
	reverse=0;

	GLCD_Locate(0,48);
	dprintf("              ",14);			// 清行
	GLCD_Locate(16,48);

	if(id<'A')
	{
		dprintf(disp_err[id-0x30],12);	// 显示正常错误信息
	}
	else
	{
		if((id=='A')||(id=='B'))
		{
			dprintf(disp_err[10],12);	// 显示模块复位
		}
		else if(id==100)
		{
			dprintf(disp_err[11],12);	// 显示ACK错误
		}
	}
}

///////////////////////////////////////////////////////////////////////////////
// 设置安全等级SPI命令处理过程
// 发送:SSS+安全等级
// 返回:SSSS成功
//       SSSF+X失败
///////////////////////////////////////////////////////////////////////////////
bit Set_class()
{
	NewMsgNum();		// 命令号
	SPIbuf[0]='S';		// 设置安全等级SSS
	SPIbuf[1]='S';
	SPIbuf[2]='S';
	SPIbuf[3]=Security_level+0x30;	// 安全等级
	CommandLen=4;				// 命令体长度

	SendMsg();			// 发送命令
	Rstwdt();			// 喂狗

	if(ACKReceive()!=ACK)	// 收到指纹模块NAK命令,表示命令体错误或命令不能识别或通信错误
	{
		disperr(100);		// 显示错误
	}	
	else
	{
		if(SPIReceive())		// 接收DSP数据
		{
			Rstwdt();			// 喂狗
	
			if(SPIbuf[SOHptr+7]=='S' && SPIbuf[SOHptr+8]=='S' && SPIbuf[SOHptr+9]=='S'
				&& SPIbuf[SOHptr+10]=='S')
			{
				return OK;
			}
		}
		else
		{
			disperr(100);		// 显示错误
		}
	}
	
	if(SPIbuf[SOHptr+7]=='S' && SPIbuf[SOHptr+8]=='S' && SPIbuf[SOHptr+9]=='S'
				&& SPIbuf[SOHptr+10]=='F'&&(SPIbuf[SOHptr+11]>'9'))
	{	
		pulse=3;						// 蜂鸣三次
		disperr(SPIbuf[SOHptr+11]);
		time_out=100;
		do{Rstwdt();}while(time_out!=0);			// 显示延迟
		HandwareErr=ERROR;						// 模块复位
	}

	if(HandwareErr==ERROR)
		do{}while(TRUE);	// 系统复位

	return ERROR;
}

///////////////////////////////////////////////////////////////////////////////
// HOST向MSS发送不同的命令,发送完成后HOST等待接收MSS的ACK或NAK数据,如果HOST
// 接收到ACK,表示MSS正确接收可识别的命令包;如果HOST接收到NAK,表示MSS没有
// 正确接收到可识别的命令包。
// HOST接收到MSS的ACK后,HOST继续等待MSS的数据
///////////////////////////////////////////////////////////////////////////////
// 指纹注册SPI命令处理过程
// 发送:ETF+管理分类+应用分类+用户编号+密码
// 返回:ETFS成功
//       ETFF+X失败
//       ETFM提醒用户抬起手指
//       ETFR提醒用户按下手指
///////////////////////////////////////////////////////////////////////////////
bit Enroll()
{
	idata uchar i;		// 计数器

	NewMsgNum();		// 信息号

	SPIbuf[0]='E';		// 注册用户ETF
	SPIbuf[1]='T';
	SPIbuf[2]='F';

	SPIbuf[3]=ManageClass;	// 管理员或普通用户
	SPIbuf[4]=AppClass;		// 指纹或密码用户

	for(i=0;i<5;i++) SPIbuf[5+i]=User_id[i];

	if(AppClass=='P')
	{
		for(i=0;i<6;i++)
			SPIbuf[10+i]=Password[i];	// 密码用户输入密码
	}
	else
	{
		for(i=0;i<6;i++)
			SPIbuf[10+i]=Password[i];	// 密码用户发送用户输入的密码
	}

	CommandLen=16;			// 命令体长度

	SendMsg();	// 发送命令
	Rstwdt();			// 喂狗

	if(AppClass=='F')
	{
		GLCD_Locate(40,32);
		dprintf(User_id,5);		// 显示用户名
		GLCD_Locate(16,48);
		dprintf(Putf,12);		// 按下手指
	}

	if(ACKReceive()!=ACK)	// 收到指纹模块NAK命令,表示命令体错误或命令不能识别或通信错误
	{
		disperr(100);		// 显示错误
	}	
	else
	{
liftget_enroll:
		if(SPIReceive())		// 接收DSP数据
		{
			Rstwdt();			// 喂狗

			if(SPIbuf[SOHptr+7]=='E' && SPIbuf[SOHptr+8]=='T' && SPIbuf[SOHptr+9]=='F')
			{

				switch(SPIbuf[SOHptr+10])
				{
				case 'M' :
					GLCD_Locate(16,48);
					dprintf(Liftf,12);		// 抬起手指
					goto liftget_enroll;
					break;
				case 'R' :
					GLCD_Locate(16,48);
					dprintf(Putf,12);		// 按下手指
					goto liftget_enroll;
					break;
				case 'F' :
					pulse=3;
					disperr(SPIbuf[SOHptr+11]);	// 显示错误
					if(SPIbuf[SOHptr+11]=='A' || SPIbuf[SOHptr+11]=='B')
						HandwareErr=ERROR;		// MSS可能故障

					break;
				case 'S' : 
					pulse=1;
					if(wieformat==1)		// 自定义门禁方式
					{
						white_bill_reg();	// 注册白名单

						for(i=0; i<5; i++)
							Wait10ms();
					}

					Rstwdt();				// 喂狗

					GLCD_Locate(16,32);
					dprintf(success,12);	// 成功				
					GLCD_Locate(0,48);
					dprintf("               ",15);
					GLCD_Locate(24,48);
					dprintf(welcome,4);	// 欢迎				
					GLCD_Locate(72,48);
					dprintf(User_id,5);	// 用户名				
					time_out=100;
					do{Rstwdt();}while(time_out!=0);
					time_out=0;
					return OK;
					break;
				default:
					break;
				}
			}
		}
		else
		{
			disperr(100);		// 显示错误
		}
	}

	time_out=100;
	do{Rstwdt();}while(time_out!=0);
	time_out=0;

	if(HandwareErr==ERROR)
		TURN_ON();

	return ERROR;
}

///////////////////////////////////////////////////////////////////////////////
// 指纹1:1比对SPI命令处理过程
// 发送:VTF+管理分类+应用分类+用户编号+密码+当前时间时分
// 返回:VTFS成功
//       VTFF+X失败
//       VTFM提醒用户抬起手指
///////////////////////////////////////////////////////////////////////////////
bit Verify()
{
	idata uchar i;		// 计数器

	NewMsgNum();		// 信息号

	SPIbuf[0]='V';		// 1:1匹配VTF
	SPIbuf[1]='T';
	SPIbuf[2]='F';

	SPIbuf[3]=ManageClass;	// 管理员或普通用户
	SPIbuf[4]=AppClass;		// 指纹或密码用户

	for(i=0;i<5;i++) SPIbuf[5+i]=User_id[i];

	if(AppClass=='P')
	{
		for(i=0;i<6;i++)
			SPIbuf[10+i]=Password[i];	// 密码用户发送用户输入的密码
	}
	else
	{
		for(i=0;i<6;i++)
			SPIbuf[10+i]=Password[i];	// 密码用户发送用户输入的密码
	}

	read_time();		// 获取当前时间
	SPIbuf[16]=cur_time[8];			// 当前用户允许进入时间
	SPIbuf[17]=cur_time[9];
	SPIbuf[18]=cur_time[10];
	SPIbuf[19]=cur_time[11];

	CommandLen=20;				// 命令体长度

	SendMsg();			// 发送命令
	Rstwdt();			// 喂狗

	if(AppClass == 'F')
	{
		GLCD_ClearScreen ();
		GLCD_Locate(16,32);
		dprintf(Putf,12);		// 提示用户在传感器上按下手指
	}

	if(ACKReceive()!=ACK)	// 收到指纹模块NAK命令,表示命令体错误或命令不能识别或通信错误
	{
		disperr(100);		// 显示错误
	}	
	else
	{
liftget_verify:
		if(SPIReceive())		// 接收DSP数据
		{
			Rstwdt();			// 喂狗
	
			if(SPIbuf[SOHptr+7]=='V' && SPIbuf[SOHptr+8]=='T' && SPIbuf[SOHptr+9]=='F')
			{
				switch(SPIbuf[SOHptr+10])
				{
				case 'S':    	// 比对成功
					pulse=1;
					if(!managemode)		// 管理操作不需要开门
					{
						switch(wieformat)
						{
						case 1:
							normal_send();		// 自定义韦根发送
							break;
						case 2:
							send26();			// 26位韦根
							break;
						case 3:
							send34();			// 34位韦根
							break;
						default:
							break;
						}

						GLCD_ClearScreen ();
						GLCD_Locate(24,32);
						dprintf(welcome,4);	// 欢迎				
						GLCD_Locate(72,32);
						dprintf(User_id,5);	// 用户名				
					}

					return OK;
				case 'M':
					GLCD_Locate(16,32);
					dprintf(Liftf,12);	// 抬手指
					goto liftget_verify;
					break;
				case 'F':		// 错误返回
					pulse=3;
					if(AppClass=='P')
						GLCD_ClearScreen ();

					disperr(SPIbuf[SOHptr+11]);

					if(SPIbuf[SOHptr+11]=='A' || SPIbuf[SOHptr+11]=='B')
						HandwareErr=ERROR;

					break;
				default:
					break;
				}	
			}
		}
		else
		{
			disperr(100);		// 显示错误
		}
	}

	time_out=50;
	do{Rstwdt();}while(time_out!=0);
	time_out=0;

	if(HandwareErr==ERROR)
		TURN_ON();

	return ERROR;
}

///////////////////////////////////////////////////////////////////////////////
// 指纹1:N比对SPI命令处理过程
// 发送:ITF+当前时间时分
// 返回:ITFS+用户编号,成功
//       ITFF+X失败
//       ITFM提醒用户抬起手指
///////////////////////////////////////////////////////////////////////////////
bit Identify()
{
	idata uchar i;

	for(i=0;i<6;i++)User_id[i]=0;	// 清用户编号

	NewMsgNum();		// 信息号

	SPIbuf[0]='I';		// 1:N匹配VTF
	SPIbuf[1]='T';
	SPIbuf[2]='F';

	read_time();		// 获取当前时间
	SPIbuf[3]=cur_time[8];				// 当前用户允许进入时间
	SPIbuf[4]=cur_time[9];
	SPIbuf[5]=cur_time[10];
	SPIbuf[6]=cur_time[11];
	Rstwdt();			// 喂狗

	CommandLen=7;				// 命令体长度

	SendMsg();			// 发送命令
	Rstwdt();			// 喂狗

	GLCD_ClearScreen ();
	GLCD_Locate(16,32);
	dprintf(Putf,12);		// 提示用户在传感器上按下手指

	if(ACKReceive()!=ACK)	// 收到指纹模块NAK命令,表示命令体错误或命令不能识别或通信错误
	{
		disperr(100);		// 显示错误
	}	
	else
	{
liftget_identify:
		if(SPIReceive())		// 接收DSP数据
		{
			Rstwdt();			// 喂狗
	
			if(SPIbuf[SOHptr+7]=='I' && SPIbuf[SOHptr+8]=='T' && SPIbuf[SOHptr+9]=='F')
			{
				switch(SPIbuf[SOHptr+10])
				{
				case 'S':    	// 比对成功
					pulse=1;
					if(!managemode)		// 管理操作不需要开门
					{
						for(i=0;i<5;i++) User_id[i]=SPIbuf[SOHptr+11+i];
						switch(wieformat)
						{
						case 1:
							normal_send();		// 自定义韦根发送
							break;
						case 2:
							send26();			// 26位韦根
							break;
						case 3:
							send34();			// 34位韦根
							break;
						default:
							break;
						}

						GLCD_ClearScreen ();
						GLCD_Locate(24,32);
						dprintf(welcome,4);	// 欢迎				
						GLCD_Locate(72,32);
						dprintf(User_id,5);	// 用户名				
					}

					return OK;
				case 'M':
					GLCD_Locate(16,32);
					dprintf(Liftf,5);// 抬手指
					goto liftget_identify;
					break;
				case 'F':		// 错误返回
					pulse=3;
					disperr(SPIbuf[SOHptr+11]);
					if(SPIbuf[SOHptr+11]=='A' || SPIbuf[SOHptr+11]=='B')
						HandwareErr=ERROR;
					break;
				default:
					break;
				}		
			}
		}
		else
		{
			disperr(100);		// 显示错误
		}
	}

	time_out=50;
	do{Rstwdt();}while(time_out!=0);
	if(HandwareErr==ERROR)
		TURN_ON();

	return ERROR;
}

///////////////////////////////////////////////////////////////////////////////
// 指纹1:G比对SPI命令处理过程
// 发送:GTF+分组信息+当前时间时分
// 返回:GTFS+用户编号,成功
//       GTFF+X失败
//       GTFM提醒用户抬起手指
///////////////////////////////////////////////////////////////////////////////
bit GroupIdentify()
{
	idata uchar i;

	for(i=0;i<6;i++)User_id[i]=0;	// 清用户编号

	NewMsgNum();		// 信息号

	SPIbuf[0]='G';		// 1:G匹配GTF
	SPIbuf[1]='T';
	SPIbuf[2]='F';

	SPIbuf[3]=groupclass;	// 分组信息

	read_time();		// 获取当前时间
	SPIbuf[4]=cur_time[8];				// 当前用户允许进入时间
	SPIbuf[5]=cur_time[9];
	SPIbuf[6]=cur_time[10];
	SPIbuf[7]=cur_time[11];
	Rstwdt();			// 喂狗

	CommandLen=8;				// 命令体长度

	SendMsg();			// 发送命令
	Rstwdt();			// 喂狗

	GLCD_ClearScreen ();
	GLCD_Locate(16,32);
	dprintf(Putf,12);		// 提示用户在传感器上按下手指

	if(ACKReceive()!=ACK)	// 收到指纹模块NAK命令,表示命令体错误或命令不能识别或通信错误
	{
		disperr(100);		// 显示错误
	}	
	else
	{
liftget_identify:
		if(SPIReceive())		// 接收DSP数据
		{
			Rstwdt();			// 喂狗
	
			if(SPIbuf[SOHptr+7]=='G' && SPIbuf[SOHptr+8]=='T' && SPIbuf[SOHptr+9]=='F')
			{
				switch(SPIbuf[SOHptr+10])
				{
				case 'S':    	// 比对成功
					pulse=1;
					if(!managemode)		// 管理操作不需要开门
					{
						for(i=0;i<5;i++) User_id[i]=SPIbuf[SOHptr+11+i];
						switch(wieformat)
						{
						case 1:
							normal_send();		// 自定义韦根发送
							break;
						case 2:
							send26();			// 26位韦根
							break;
						case 3:
							send34();			// 34位韦根
							break;
						default:
							break;
						}

						GLCD_ClearScreen ();
						GLCD_Locate(24,32);
						dprintf(welcome,4);	// 欢迎				
						GLCD_Locate(72,32);
						dprintf(User_id,5);	// 用户名				
					}

					return OK;

⌨️ 快捷键说明

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