📄 fm1702slspi.c
字号:
#include <reg51.h> //51寄存器定义头文件
#include "main.h" //主程序头文件
#include "globe.h" //全局变量定义头文件
#include <absacc.h>
#include <intrins.h>
sbit sck = P1 ^ 1; //接FM1702SL的SCK
sbit si = P1 ^ 2; //接FM1702SL的MOSI
sbit so = P1 ^ 3; //接FM1702SL的MISO
sbit spi_cs=P1 ^ 4; //接FM1702SL的NSS
sbit MFRST = P1 ^ 0; //接FM1702SL的RSTPD
/****************************************************************/
/*名称: SPI_Init */
/*功能: 该函数实现对FM1702SL SPI总线方式的选择 */
/* */
/*输入: */
/* N/A */
/* */
/*输出: */
/* TRUE, 总线选择成功 */
/* FALSE, 总线选择失败 */
/****************************************************************/
uchar SPI_Init(void)
{
uchar temp;
temp=read_reg(Command);
if(temp!=0x00)
return FALSE;
write_reg(Page_Sel,0x80);
temp=read_reg(Command);
if(temp==0x00)
{
write_reg(Page_Sel,0x00);
return TRUE;
}
else
return FALSE;
}
/****************************************************************/
/*名称: FM1702SL_Init */
/*功能: 该函数实现初始化FM1702SL各相关寄存器 */
/* */
/*输入: */
/* N/A */
/* */
/*输出: */
/* TRUE, 初始化FM1702SL各寄存器成功 */
/* FALSE, 初始化FM1702SL各寄存器失败 */
/****************************************************************/
void FM1702SL_Init(void)
{
write_reg(InterruptEn,0x7f); //禁止所有中断
write_reg(Int_Req,0x7f); //中断标识清零
write_reg(TxControl,0x5B); //设置发射控制寄存器
write_reg(Rxcontrol2,0x01); //设置接收控制寄存器
write_reg(RxWait,0x07); //设置接收延时控制寄存器
}
/****************************************************************/
/*名称: Clear_FIFO */
/*功能: 该函数实现清空FIFO寄存器 */
/* */
/*输入: */
/* N/A */
/* */
/*输出: */
/* TRUE, FIFO寄存器清空成功 */
/* FALSE, FIFO寄存器清空失败 */
/****************************************************************/
uchar Clear_FIFO(void)
{
uchar temp;
uint i;
temp=read_reg(Control); //清空FIFO
temp=(temp | 0x01);
write_reg(Control, temp);
for(i = 0; i < RF_TimeOut; i++) //检查FIFO是否被清空
{
temp=read_reg(FIFO_Length);
if(temp==0)
return TRUE;
}
return FALSE;
}
/****************************************************************/
/*名称: Write_FIFO */
/*功能: 该函数实现写FIFO寄存器 */
/* */
/*输入: */
/* count, 待写入数据的长度 */
/* buff, 指向待写入数据的指针 */
/* */
/*输出: */
/* N/A */
/****************************************************************/
void Write_FIFO(uchar count,uchar idata *buff)
{
uchar i;
for(i = 0; i < count; i++)
write_reg(FIFO,*(buff + i));
}
/****************************************************************/
/*名称: Read_FIFO */
/*功能: 该函数实现读FIFO寄存器 */
/* */
/*输入: */
/* buff, 指向读出数据的指针 */
/* */
/*输出: */
/* 0代表读出数据长度为0 */
/* 非0代表读出FIFO的数据长度 */
/****************************************************************/
uchar Read_FIFO(uchar idata *buff)
{
uchar temp;
uchar i;
temp=read_reg(FIFO_Length);
if (temp==0)
{
return FALSE;
}
if (temp >= 64)
return FALSE;
for(i = 0;i < temp; i++)
{
*(buff + i)=read_reg(FIFO);
}
return temp;
}
/****************************************************************/
/*名称: Command_Send */
/*功能: 该函数实现发送接收数据 */
/* */
/*输入: */
/* count, 待发送命令集的长度 */
/* buff, 指向待发送数据的指针 */
/* Comm_Set, 命令码 */
/* */
/*输出: */
/* TRUE, 命令被正确执行 */
/* FALSE, 命令执行错误 */
/****************************************************************/
uchar Command_Send(uchar count,uchar idata * buff,uchar Comm_Set)
{
uint j;
uchar idata temp;
write_reg(Command, 0x00);
Clear_FIFO();
if (count != 0)
Write_FIFO(count, buff);
write_reg(Command, Comm_Set);
for(j = 0; j< RF_TimeOut; j++)
{
temp=read_reg(Command);
if(temp == 0x00)
return TRUE;
}
return FALSE;
}
/****************************************************************/
/*名称: Request */
/*功能: 该函数实现FM1702SL向空间发送request信号 */
/* */
/*输入: */
/* N/A */
/* */
/*输出: */
/* FALSE request命令执行失败 */
/* TRUE request命令执行成功 */
/****************************************************************/
uchar Request(void)
{
uchar temp;
write_reg(Bit_Frame,0x07); //写bitframing寄存器
temp=read_reg(Control); //写control寄存器
temp=temp&0xf7;
write_reg(Control,temp);
write_reg(ChannelRedundancy,0x03); //写ChannelRedundancy寄存器
buffer[0]=0x52;
temp=Command_Send(1, buffer, Transceive); //将待发送数据写入FIFO中,并执行发送接收命令
if(temp==FALSE)
return FALSE;
temp=Read_FIFO(buffer); //从FIFO中读取应答信息
if(temp==0x00)
return FALSE;
if(temp==0x02) //进行回读数据的判断
{
if(buffer[0]!=0x04)
return FALSE;
if(buffer[1]!=0x00)
return FALSE;
return TRUE;
}
return FALSE;
}
/********************************************************************/
/*名称: Get_UID */
/*功能: 该函数实现FM1702SL向存在于其发射范围内的卡片发射GET_UID信号 */
/* */
/*输入: */
/* N/A */
/* */
/*输出: */
/* FALSE GET_UID命令执行失败 */
/* TRUE GET_UID命令执行成功 */
/********************************************************************/
uchar Get_UID(void)
{
uchar temp,i;
write_reg(ChannelRedundancy,0x03); //写ChannelRedundancy寄存器
buffer[0]=0x93;
buffer[1]=0x20;
temp=Command_Send(2, buffer, Transceive); //将待发送数据写入FIFO中,并执行发送接收命令
if(temp==FALSE)
return FALSE;
temp=Read_FIFO(buffer); //读出FIFO寄存器的内容
if(temp==0x00)
return FALSE;
if(temp==0x05) //保存得到的5位UID号
{
for(i=0;i<5;i++)
UID[i]=buffer[i];
}
temp=Check_UID();
return temp;
}
/*********************************************************************/
/*名称: Select_Tag */
/*功能: 该函数实现FM1702SL向存在于其发射范围内的卡片发射选择卡片信号 */
/* */
/*输入: */
/* N/A */
/* */
/*输出: */
/* FALSE 选择卡片执行失败 */
/* TRUE 选择卡片执行成功 */
/*********************************************************************/
uchar Select_Tag(void)
{
uchar temp,i;
write_reg(ChannelRedundancy,0x0f); //写ChannelRedundancy寄存器
buffer[0]=0x93;
buffer[1]=0x70;
for(i=0;i<5;i++)
buffer[i+2]=UID[i];
temp=Command_Send(7, buffer, Transceive); //将待发送数据写入FIFO中,并执行发送接收命令
if(temp==FALSE)
return FALSE;
temp=Read_FIFO(buffer);
if(temp==0x00)
return FALSE;
if(temp==0x01)
{
if(buffer[0]==0x08)
return TRUE;
}
return FALSE;
}
/*********************************************************************/
/*名称: Load_Key_EE */
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -