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