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

📄 mss_spi.c

📁 KEIL C上的门禁控制器源代码
💻 C
📖 第 1 页 / 共 3 页
字号:
	}
}

///////////////////////////////////////////////////////////////////////////////
// MSS上电复位函数
// MSS电源芯片采用TPS70145,该芯片具备可编程供电能力,当使能端为低电平时,MSS
// 上电,MSS上电后进入自检状态,当自检完成后向HOST申请中断,发送自检结果信息。
// MSS自检成功发送'HHHF0'信息,否则发送'HHHFX',X表示MSS模块硬件故障代码。
// MSS自检成功后,HOST设置MSS系统安全等级。
// 当MSS在10秒内不能完成自检,置MSS故障标志。
///////////////////////////////////////////////////////////////////////////////
void TURN_ON()
{
	idata uint  i;
	idata uchar count=3;

	MSS_INT=1;					// 清MSS中断位
	MSS_PWR_ON=1;				// 清MSS电源使能位

	Rstwdt();					// 喂狗

init_again:
	MSS_PWR_ON=0;				// 打开MSS电源

	for(i=0;i<50;i++)
	{
		Wait10ms();				// 等待500ms
		Rstwdt();				// 喂狗
	}
						
	for(i=0;i<3;i++)			// 检测3次低电平中断,目的是防止MSS上电时误发送低电平
	{
		do
		{
			Rstwdt();			// 喂狗
			if(count==0)
			{
				HandwareErr=ERROR;	// MSS不能正常工作
				return;
			}
		}while(MSS_INT);		// 检测MSS中断
		Rstwdt();				// 喂狗
		Wait10ms();				// 等待10毫秒
	}

	if(!SPIReceive())
	{
		goto power_off;			// 重新对MSS上电
	}

	if(SPIbuf[SOHptr+7]=='H'&&SPIbuf[SOHptr+8]=='H'&&SPIbuf[SOHptr+9]=='H'
		&&SPIbuf[SOHptr+10]=='F'&&SPIbuf[SOHptr+11]=='0')
	{
		for(i=0; i<BUFSIZE; i++)
			SPIbuf[i]=0;

		HandwareErr=OK;		// MSS工作正常
		return;
	}

	if(count==0)
	{
		HandwareErr=ERROR;		// MSS不能正常工作
		return;
	}
	
power_off:
	MSS_PWR_ON=1;				// 清MSS电源使能
	OneSecond();
	count--;
	goto init_again;
}

///////////////////////////////////////////////////////////////////////////////
// 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]);	// 显示错误
					break;
				case 'S' : 
					pulse=1;
					if(wieformat==1)		// 自定义门禁方式
						white_bill_reg();	// 注册白名单

					Wait10ms();
					Wait10ms();
					Wait10ms();
					Wait10ms();

					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{}while(time_out!=0);
					time_out=0;
					return OK;
					break;
				default:
					HandwareErr=ERROR;		// MSS不能正常工作
					break;
				}
			}
		}
	}

	time_out=100;
	do{}while(time_out!=0);
	time_out=0;
	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]);
					break;
				default:
					HandwareErr=ERROR;		// MSS不能正常工作
					break;
				}	
			}
		}
	}

	time_out=50;
	do{}while(time_out!=0);
	time_out=0;
	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]);
					break;
				default:
					HandwareErr=ERROR;		// MSS不能正常工作
					break;
				}		
			}
		}
	}

	time_out=50;
	do{}while(time_out!=0);
	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;
				case 'M':
					GLCD_Locate(16,32);
					dprintf(Liftf,5);// 抬手指
					goto liftget_identify;
					break;
				case 'F':		// 错误返回
					pulse=3;
					disperr(SPIbuf[SOHptr+11]);
					break;
				default:
					HandwareErr=ERROR;		// MSS不能正常工作
					break;
				}		
			}
		}
	}

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

///////////////////////////////////////////////////////////////////////////////

⌨️ 快捷键说明

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