📄 mss_spi.c
字号:
}
}
///////////////////////////////////////////////////////////////////////////////
// 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 + -