?? 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 + -