📄 fm1702slspi.c
字号:
/*功能: 该函数实现FM1702SL将EE中的密码调入密码缓冲区中 */
/* */
/*输入: */
/* N/A */
/* */
/*输出: */
/* FALSE 密码装载执行失败 */
/* TRUE 密码装载执行成功 */
/*********************************************************************/
uchar Load_Key_EE(void)
{
uchar temp;
temp=Command_Send(2, buffer, LoadKeyE2); //将待发送数据写入FIFO中,并执行发送接收命令
if(temp==FALSE)
return FALSE;
temp=read_reg(ErrorFlag); //读errorFlag寄存器
temp=temp&0x40;
if(temp==0x00)
return TRUE;
return FALSE;
}
/*********************************************************************/
/*名称: Authentication */
/*功能: 该函数实现FM1702SL向存在于其发射范围内的卡片发射认证信号 */
/* */
/*输入: */
/* Block_num, 块号 */
/* */
/*输出: */
/* FALSE 三重认证执行失败 */
/* TRUE 三重认证执行成功 */
/*********************************************************************/
uchar Authentication(uchar BlockNum)
{
uchar temp,i;
write_reg(ChannelRedundancy,0x0f); //写ChannelRedundancy寄存器
buffer[0]=0x60;
buffer[1]=BlockNum;
for(i=0;i<4;i++)
buffer[i+2]=UID[i];
temp=Command_Send(6, buffer, Authent1); //将待发送数据写入FIFO中,并执行发送接收命令
if(temp==FALSE)
return FALSE;
temp=read_reg(ErrorFlag); //读errorFlag寄存器
temp=temp&0x0e;
if(temp!=0x00)
return FALSE;
temp=Command_Send(0,buffer,Authent2); //将待发送数据写入FIFO中,并执行发送接收命令
if(temp==FALSE)
return FALSE;
temp=read_reg(ErrorFlag); //读errorFlag寄存器
temp=temp&0x0e;
if(temp!=0x00)
return FALSE;
temp=read_reg(Control); //读Control寄存器
temp=temp&0x08;
if(temp!=0x00)
return TRUE;
return FALSE;
}
/*********************************************************************/
/*名称: Write_Block */
/*功能: 该函数实现FM1702SL向存在于其发射范围内的卡片发射写块信号 */
/* */
/*输入: */
/* Block_num, 块号 */
/* */
/*输出: */
/* FALSE 写块操作执行失败 */
/* TRUE 写块操作执行成功 */
/*********************************************************************/
uchar Write_Block(uchar BlockNum)
{
uchar temp;
write_reg(ChannelRedundancy,0x07); //写ChannelRedundancy寄存器
buffer[16]=buffer[0];
buffer[17]=buffer[1];
buffer[0]=0xa0;
buffer[1]=BlockNum;
temp=Command_Send(2, buffer, Transceive); //将待发送数据写入FIFO中,并执行发送接收命令
if(temp==FALSE)
return FALSE;
temp=Read_FIFO(buffer);
if(temp==0x00)
return FALSE;
if(temp==0x01)
{
if(buffer[0]!=0x0a)
return FALSE;
}
buffer[0]=buffer[16];
buffer[1]=buffer[17];
temp=Command_Send(16, buffer, Transceive); //将待发送数据写入FIFO中,并执行发送接收命令
if(temp==FALSE)
return FALSE;
temp=Read_FIFO(buffer);
if(temp==0x00)
return FALSE;
if(temp==0x01)
{
if(buffer[0]!=0x0a)
return FALSE;
}
return TRUE;
}
/*********************************************************************/
/*名称: Read_Block */
/*功能: 该函数实现FM1702SL向存在于其发射范围内的卡片发射读块信号 */
/* */
/*输入: */
/* Block_num, 块号 */
/* */
/*输出: */
/* FALSE 读块操作执行失败 */
/* TRUE 读块操作执行成功 */
/*********************************************************************/
uchar Read_Block(uchar BlockNum)
{
uchar temp;
write_reg(ChannelRedundancy,0x0f); //写ChannelRedundancy寄存器
buffer[0]=0x30;
buffer[1]=BlockNum;
temp=Command_Send(2, buffer, Transceive); //将待发送数据写入FIFO中,并执行发送接收命令
if(temp==FALSE)
return FALSE;
temp=read_reg(ErrorFlag); //读errorFlag寄存器
temp=temp&0x0e;
if(temp!=0x00)
return FALSE;
temp=Read_FIFO(buffer);
if(temp==0x00)
return FALSE;
if(temp==0x10)
return TRUE;
return FALSE;
}
uchar Check_UID(void)
{
uchar temp;
uchar i;
temp=0x00;
for(i=0;i<5;i++)
{
temp=temp^UID[i];
}
if(temp==0)
return TRUE;
return FALSE;
}
void delay1(unsigned char dlength)
{
uchar i;
for (i=0;i<dlength;i++)
{
_nop_();
}
}
unsigned char rev(unsigned char tem)
{
uchar idata i;
unsigned char idata var=0,var_snt=0;
var=0;
for (i=0;i<8;i++) // 8位字节带进位左移
{
var_snt=tem&0x80; // 选择高位
if (var_snt==0x80) si=1; // 输出高位
else si=0;
tem<<=1;
var<<=1;
CY=so;
if (CY==1)
var+=1; // 带进位左移
sck=1; // 产生SCK脉冲
delay1(1);
sck=0;
}
return(var); // 返回
}
void Send(unsigned char var)
{
unsigned char data i,tem;
for (i=0;i<8;i++) // 8位字节输出
{
delay1(1); // 使SCK为低电平
tem=var&0x80; // 选择高位
if (tem==0x80) si=1; // 输出高位
else si=0;
delay1(1);
sck=1; // 使SCK为1
var<<=1;
delay1(1);
sck=0; // 左移1位
}
}
unsigned char read_reg(uchar idata SpiAddress)
{
uchar idata rdata;
SpiAddress=SpiAddress<<1;
SpiAddress=SpiAddress | 0x80;
spi_cs=0;
Send(SpiAddress);
rdata=rev(0);
spi_cs=1;
return(rdata);
}
void read_mult_dat(uchar idata SpiAddress,uchar *dat,uchar n )
{
uchar i;
SpiAddress=SpiAddress<<1;
SpiAddress=SpiAddress | 0x80;
spi_cs=0;
Send(SpiAddress);
for(i=0;i<n-1;i++)
dat[i]=rev(SpiAddress);
dat[n-1]=rev(0);
spi_cs=1;
}
void write_mult_dat(uchar idata SpiAddress,uchar *dat,uchar n)
{
uchar i;
SpiAddress=SpiAddress<<1;
SpiAddress=SpiAddress&0x7f;
spi_cs=0;
so=0;
Send(SpiAddress);
for(i=0;i<n;i++)
{
Send(dat[i]);
}
spi_cs=1;
}
void write_reg(uchar idata SpiAddress,uchar dat)
{
SpiAddress=SpiAddress<<1;
SpiAddress=SpiAddress &0x7f;
spi_cs=0;
so=0;
Send(SpiAddress);
Send(dat);
spi_cs=1;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -