?? mss_spi.c
字號:
// 校正傳感器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 + -