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

📄 mss_spi.c

📁 KEIL C上的门禁控制器源代码
💻 C
📖 第 1 页 / 共 3 页
字号:
// 校正传感器SPI命令处理过程
// 发送:CSS
// 返回:CSSS成功
//       CSSF+X失败
///////////////////////////////////////////////////////////////////////////////
bit Cal_sensor()
{
	NewMsgNum();		// 命令号
	SPIbuf[0]='C';		// 校正传感器
	SPIbuf[1]='S';
	SPIbuf[2]='S';
	CommandLen=3;		// 命令体长度

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

	if(ACKReceive()!=ACK)	// 收到指纹模块NAK命令,表示命令体错误或命令不能识别或通信错误
	{
	}	
	else
	{
		if(SPIReceive())		// 接收DSP数据
		{
			Rstwdt();			// 喂狗
	
			if(SPIbuf[SOHptr+7]=='C' && SPIbuf[SOHptr+8]=='S' && SPIbuf[SOHptr+9]=='S'
				&& SPIbuf[SOHptr+10]=='S')
			{
				return OK;
			}
		}
	}	

	if(SPIbuf[SOHptr+11]>'9')
	{	
		pulse=3;						// 蜂鸣三次
		disperr(SPIbuf[SOHptr+11]);
		time_out=100;
		do{}while(time_out!=0);			// 显示延迟
	}

	Rstwdt();			// 喂狗
	return ERROR;
}

///////////////////////////////////////////////////////////////////////////////
// 设置安全等级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;
			}
		}
	}
	
	if(SPIbuf[SOHptr+11]>'9')
	{	
		pulse=3;						// 蜂鸣三次
		disperr(SPIbuf[SOHptr+11]);
		time_out=100;
		do{}while(time_out!=0);			// 显示延迟
	}

	return ERROR;
}

///////////////////////////////////////////////////////////////////////////////
// 删除单个用户信息SPI命令处理过程
// 发送:DSU+用户编号
// 返回:DSUS成功
//       DSUF+X失败
///////////////////////////////////////////////////////////////////////////////
bit Delete_one()
{
	idata uchar i;

	NewMsgNum();		// 命令号

	SPIbuf[0]='D';		// 删除单个用户DSU
	SPIbuf[1]='S';
	SPIbuf[2]='U';

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

	CommandLen=8;				// 命令体长度

	SendMsg();
	Rstwdt();			// 喂狗

	if(ACKReceive()!=ACK)	// 收到指纹模块NAK命令,表示命令体错误或命令不能识别或通信错误
	{
		disperr(100);		// 显示错误
	}	
	else
	{
		if(SPIReceive())		// 接收DSP数据
		{
			Rstwdt();			// 喂狗
	
			if(SPIbuf[SOHptr+7]=='D' && SPIbuf[SOHptr+8]=='S' && SPIbuf[SOHptr+9]=='U'
				&& SPIbuf[SOHptr+10]=='S')
			{
				if(wieformat==1)		// 自定义门禁方式
					white_bill_del();	// 注销白名单

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

				return OK;
			}
			else if(SPIbuf[SOHptr+11]>'9')
			{	
				disperr(SPIbuf[SOHptr+11]);
			}
		}
	}	

	pulse=3;						// 蜂鸣三次
	time_out=100;
	do{}while(time_out!=0);			// 显示延迟

	return ERROR;
}

///////////////////////////////////////////////////////////////////////////////
// 删除所有用户信息SPI命令处理过程
// 发送:DAU
// 返回:DAUS成功
//       DAUF+X失败
///////////////////////////////////////////////////////////////////////////////
bit Erase_user()
{
	NewMsgNum();		// 命令号

	SPIbuf[0]='D';		// 删除全部用户DAU
	SPIbuf[1]='A';
	SPIbuf[2]='U';
	CommandLen=3;		// 命令体长度

	SendMsg();
	Rstwdt();			// 喂狗

	if(ACKReceive()!=ACK)	// 收到指纹模块NAK命令,表示命令体错误或命令不能识别或通信错误
	{
		disperr(100);		// 显示错误
	}	
	else
	{
		if(SPIReceive())		// 接收DSP数据
		{
			Rstwdt();			// 喂狗
	
			if(SPIbuf[SOHptr+7]=='D' && SPIbuf[SOHptr+8]=='A' && SPIbuf[SOHptr+9]=='U'
				&& SPIbuf[SOHptr+10]=='S')
			{
				if(wieformat==1)		// 自定义门禁方式
					erase_bill();		// 清空白名单

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

				return OK;
			}
			else if(SPIbuf[SOHptr+11]>'9')
			{	
				disperr(SPIbuf[SOHptr+11]);
			}
		}
	}	

	pulse=3;						// 蜂鸣三次
	time_out=100;
	do{}while(time_out!=0);			// 显示延迟

	return ERROR;
}

///////////////////////////////////////////////////////////////////////////////
// 设置单个用户进入条件SPI命令处理过程
// 发送:CSU+用户编号+开始进入时间时分+终止进入时间时分
// 返回:CSUS成功
//       CSUF+X失败
///////////////////////////////////////////////////////////////////////////////
bit One_enter()
{
	idata uchar i;

	NewMsgNum();
	SPIbuf[0]='C';
	SPIbuf[1]='S';
	SPIbuf[2]='U';

	for(i=0;i<5;i++)SPIbuf[3+i]=User_id[i];
	for(i=0;i<4;i++)SPIbuf[8+i]=Start_time[i];
	for(i=0;i<4;i++)SPIbuf[12+i]=End_time[i];
	CommandLen=16;			// 命令提体长度

	SendMsg();
	Rstwdt();			// 喂狗

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


	return ERROR;
}

///////////////////////////////////////////////////////////////////////////////
// 获取已注册管理员数目SPI命令处理过程
// 发送:GMN
// 返回:GMNS+已注册管理员数目,成功
//       GMNF+X失败
///////////////////////////////////////////////////////////////////////////////
int Get_manager_num()
{
	idata int manager_amount;

	NewMsgNum();				//发送设置命令
	SPIbuf[0]='G';
	SPIbuf[1]='M';
	SPIbuf[2]='N';
	CommandLen=3;

	SendMsg();
	Rstwdt();			// 喂狗

	if(ACKReceive()!=ACK)	// 收到指纹模块NAK命令,表示命令体错误或命令不能识别或通信错误
	{
	}	
	else
	{
		if(SPIReceive())			//接收DSP数据
		{
			Rstwdt();			// 喂狗
	
			if(SPIbuf[SOHptr+7]=='G' && SPIbuf[SOHptr+8]=='M' && SPIbuf[SOHptr+9]=='N'
				&& SPIbuf[SOHptr+10]=='S')
			{
				manager_amount=(SPIbuf[11]-0x30)*100+(SPIbuf[12]-0x30)*10+(SPIbuf[13]-0x30);		
				return manager_amount;
			}
			else
			{
				return -1;
			}
		}
	}
	
	return -1;
}


///////////////////////////////////////////////////////////////////////////////
// 保存日志记录SPI命令处理过程
// 发送:SSR+用户编号+时间+操作类型
// 返回:SSRS成功
//       SSRF+X失败
///////////////////////////////////////////////////////////////////////////////
bit Set_record()
{
	idata uchar i;

	NewMsgNum();		// 命令号
	SPIbuf[0]='S';		// 保存日志记录SSR
	SPIbuf[1]='S';
	SPIbuf[2]='R';

	for(i=0;i<5;i++)SPIbuf[3+i]=User_id[i];		// 用户编号
	read_time();
	for(i=0;i<14;i++)SPIbuf[8+i]=cur_time[i];	// 当前时间年月日时分秒

	CommandLen=22;		// 命令体长度

	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]=='R'
				&& SPIbuf[SOHptr+10]=='S')
			{
				return OK;
			}
			else if(SPIbuf[SOHptr+11]>'9')
			{	
				if(SPIbuf[SOHptr+11]!='E')
					disperr(SPIbuf[SOHptr+11]);
				else
					return ERROR;
			}
		}
	}

	pulse=3;						// 蜂鸣三次
	time_out=100;
	do{}while(time_out!=0);			// 显示延迟

	return ERROR;
}

///////////////////////////////////////////////////////////////////////////////
// HOST接收MSS数据,按照标准信息包进行检查
// 如果接收错误向MSS发送NAK,如果3次发送错误返回失败
// 如果接收成功向MSS发送ACK
// 如果.2秒内不能检测到MSS的数据发送中断,那么MSS可能故障
///////////////////////////////////////////////////////////////////////////////
bit SPIReceive1()
{
	idata uchar temp;		// 临时变量
	idata uchar NAKcounter;	// NAK计数器
	idata uint  R_BUF;		// 接收缓冲区指针
	idata uint  i;			// 计数器

	for(R_BUF=0; R_BUF<BUFSIZE; R_BUF++)
		SPIbuf[R_BUF]=0;	// 接收缓冲区清零

	time_out=100;			// 如果1000ms内MSS无数据返回退出错误
	do
	{
		Rstwdt();			// 喂狗
		if(time_out==0)
		{
			HandwareErr=ERROR;		// MSS可能故障
			time_out=0;
			return ERROR;	// 返回
		}
	}while(MSS_INT);		// 检测MSS通信中断

	NAKcounter=3;		// NAK计数器
	do
	{	
		R_BUF=0;		// 接收缓冲区计数
		SOHptr=0;
		ETXptr=0;
		MSS=1;

		time_out=50;				// 500msSPI数据传输一个包时间
		do
		{
			do
			{	
				if(time_out==0)
				{
					HandwareErr=ERROR;		// MSS可能故障
					return ERROR;	// 返回
				}
				temp=SPItrans(0);	// 接收数据
			}while(temp==0);

			SPIbuf[R_BUF++]=temp;	// 非零数据存入缓冲区

			if(R_BUF>BUFSIZE)break;	// 缓冲区满

			if(time_out==0)
			{
				HandwareErr=ERROR;		// MSS可能故障
				return ERROR;	// 返回
			}
	  	}while(temp!=EOT);			// 通信结束

		i=0;
		do
		{
			if(SPIbuf[i]==SOH)		// 定位数据头
			{
				SOHptr=i;
				break;			
			}
			i++;
			Rstwdt();				// 喂狗
		}while(i<R_BUF);

		if(SOHptr==R_BUF)
		{
			goto SPIerr1;			// 缓冲区满,数据错误
		}
		else if(SPIbuf[SOHptr+6]!=STX)
		{
			goto SPIerr1;			// STX错误
		}
		else if(SPIbuf[R_BUF-4]!=ETX)
		{
			goto SPIerr1;			// ETX错误
		}
		else
		{
			MSG=SPIbuf[SOHptr+5];	// 保存信息号
			ETXptr=R_BUF-4;
			Rstwdt();				// 喂狗
			CSH=SPIbuf[ETXptr+1];
			CSL=SPIbuf[ETXptr+2];
			HEX_CS();								
			testchecksum=0;

			for(i=0;i<ETXptr-SOHptr+1;i++)	// 计算校验和
			{
				Rstwdt();				// 喂狗
				testchecksum+=SPIbuf[SOHptr+i];	
			}

			temp=testchecksum+checksum;
			temp=temp&0xff;
			if(temp!=0)
				goto SPIerr1;			// 校验

			SendNACK(ACK);				// 发送 ACK

			return OK;
		}
SPIerr1:
		Rstwdt();
		SendNACK(NAK);					// 发送 NAK 重新接收DSP数据														
		NAKcounter--;
	}while(NAKcounter>0);

	HandwareErr=ERROR;		// MSS可能故障
	return ERROR;
}

///////////////////////////////////////////////////////////////////////////////
// 直接转发上位机SPI命令处理过程
// 发送:SPIbuf数据
// 返回:SPIbuf数据
///////////////////////////////////////////////////////////////////////////////
bit Send_spi()
{
	idata uint i=0;

	COMDISABLE;		// 禁止串口通信

	while(SPIbuf[i]!=EOT)
	{
		SPItrans(SPIbuf[i]);
		i++;
	}
	SPItrans(SPIbuf[i]);

	if(ACKReceive()!=ACK)	// 收到指纹模块NAK命令,表示命令体错误或命令不能识别或通信错误
	{
	}	
	else
	{
		if(SPIReceive1())		// 接收DSP数据
		{
			return OK;
		}
	}

	return ERROR;
}

⌨️ 快捷键说明

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