#include "fm1702.h"
#include "stm320518_eval_spi_sd.h"
#include "delay.h"
#include "usart.h"
uchar RevBuffer[20];//={0xcc,0xcc,0xcc,0xcc,0xcc,0xcc,0xcc,0xcc,0xcc,0xcc,0xcc,0xcc,0xcc,0xcc,0xcc,0xcc,0xcc,0xcc,0xcc,0xcc}; /* FM1702命令发送接收缓冲区 */
uchar tagtype[2]; /* 卡片标识字符 */
uchar cardtype;
uchar UID[5]={0,0,0,0,0};//卡号
uchar UIDBackup[50];//卡号备份
uchar UidBuffer0[5];
uchar UidFlag0=0;
uchar CardFlag;//卡是否离开过标志1卡离开0卡未离开
uchar DO_num=0,DO_OK=0;//数卡次数和标志
uchar Fm1702DelayBit=0;
//extern uchar tim15_count;
/****************************************************************
名称: SPI1_Init
功能: SPI1初始化
输入: SpiAddress地址,SpiData数据
输出: 无
****************************************************************/
void SPI1_Init(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
SPI_InitTypeDef SPI_InitStructure;
/*!< SD_SPI_CS_GPIO, SD_SPI_MOSI_GPIO, SD_SPI_MISO_GPIO, SD_SPI_DETECT_GPIO
and SD_SPI_SCK_GPIO Periph clock enable */
RCC_AHBPeriphClockCmd(SD_CS_GPIO_CLK | SD_SPI_MOSI_GPIO_CLK | SD_SPI_MISO_GPIO_CLK |
SD_SPI_SCK_GPIO_CLK | SD_DETECT_GPIO_CLK, ENABLE);
/*!< SD_SPI Periph clock enable */
RCC_APB2PeriphClockCmd(SD_SPI_CLK, ENABLE);
/*!< Configure SD_SPI pins: SCK */
GPIO_InitStructure.GPIO_Pin = SD_SPI_SCK_PIN;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;
GPIO_Init(SD_SPI_SCK_GPIO_PORT, &GPIO_InitStructure);
/*!< Configure SD_SPI pins: MISO */
GPIO_InitStructure.GPIO_Pin = SD_SPI_MISO_PIN;
GPIO_Init(SD_SPI_MISO_GPIO_PORT, &GPIO_InitStructure);
//GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AN;
/*!< Configure SD_SPI pins: MOSI */
GPIO_InitStructure.GPIO_Pin = SD_SPI_MOSI_PIN;
GPIO_Init(SD_SPI_MOSI_GPIO_PORT, &GPIO_InitStructure);
/*!< Configure SD_SPI_RF_RST pin: PC4 OUT */
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;
GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOC, &GPIO_InitStructure);
/*!< Configure SD_SPI_CS_PIN pin: SD Card CS pin */
GPIO_InitStructure.GPIO_Pin = SD_CS_PIN;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;
GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(SD_CS_GPIO_PORT, &GPIO_InitStructure);
/*!< Configure SD_SPI_DETECT_PIN pin: SD Card detect pin */
GPIO_InitStructure.GPIO_Pin = SD_DETECT_PIN;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN;
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;
GPIO_Init(SD_DETECT_GPIO_PORT, &GPIO_InitStructure);
/* Connect PXx to SD_SPI_SCK */
GPIO_PinAFConfig(SD_SPI_SCK_GPIO_PORT, SD_SPI_SCK_SOURCE, SD_SPI_SCK_AF);
/* Connect PXx to SD_SPI_MISO */
GPIO_PinAFConfig(SD_SPI_MISO_GPIO_PORT, SD_SPI_MISO_SOURCE, SD_SPI_MISO_AF);
/* Connect PXx to SD_SPI_MOSI */
GPIO_PinAFConfig(SD_SPI_MOSI_GPIO_PORT, SD_SPI_MOSI_SOURCE, SD_SPI_MOSI_AF);
/*!< SD_SPI Config */
SPI_InitStructure.SPI_Direction = SPI_Direction_2Lines_FullDuplex;
SPI_InitStructure.SPI_Mode = SPI_Mode_Master;
SPI_InitStructure.SPI_DataSize = SPI_DataSize_8b;
SPI_InitStructure.SPI_CPOL = SPI_CPOL_Low;
SPI_InitStructure.SPI_CPHA = SPI_CPHA_1Edge;
SPI_InitStructure.SPI_NSS = SPI_NSS_Soft;
SPI_InitStructure.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_128;
SPI_InitStructure.SPI_FirstBit = SPI_FirstBit_MSB;
SPI_InitStructure.SPI_CRCPolynomial = 7;
SPI_Init(SD_SPI, &SPI_InitStructure);
SPI_RxFIFOThresholdConfig(SPI1, SPI_RxFIFOThreshold_QF);
SPI_Cmd(SD_SPI, ENABLE); /*!< SD_SPI enable */
}
/****************************************************************
名称: SPIWrite1702
功能: 向SPI总线写入数据
输入: SpiAddress地址,SpiData数据
输出: 无
****************************************************************/
void SPIWrite1702(uchar SpiAddress,uchar SpiData)
{
//uchar i,k,temp;
SpiAddress=_crol_(SpiAddress,1);
SpiAddress=SpiAddress &0x7e;
// RF_SCK_L();
//RF_SCK_LOW();
SD_CS_LOW(); //片选
//Send SpiAddress
/*!< Send dummy byte SpiAddress */
SD_WriteByte(SpiAddress);
/*!< Send dummy byte data */
SD_WriteByte(SpiData);
SD_CS_HIGH(); //片选
delay_us(100);
// return;*/
}
/****************************************************************
名称: SPIRead1702
功能: 向SPI总线写读出数据
输入: SpiAddress地址
输出: 数据
****************************************************************/
uchar SPIRead1702(uchar SpiAddress)
{
uchar rdata=0xff;
SpiAddress=SpiAddress<<1;
SpiAddress=SpiAddress | 0x80;
SD_CS_LOW(); //片选
SD_WriteByte(SpiAddress);
rdata=SD_WriteByte(0X00);
SD_CS_HIGH(); //片选
return(rdata);
}
/****************************************************************
名称: Init_FM1702
功能: 该函数实现对FM1702初始化操作
输入: mode:工作模式, 0:TYPEA模式
1:TYPEB模式
2:上海模式
输出: N/A
****************************************************************/
void Init_FM1702(uchar mode)
{
ulong i;
//static uint highcount=0;
//static uchar lowcount=0;
SD_CS_HIGH();
RF_RST_LOW();
RF_SCK_HIGH();
RF_RST_HIGH();
delay_us(50);
RF_RST_LOW(); /* FM1702复位 */
delay_us(50);
//delay_ms(150);
////////////////////////////////////////////////////////////////////////////
//if(Fm1702DelayBit==1)
{
i=0xfff;
while(SPIRead1702(Command)!=FM1702_OK&&i>3)
{
i--; /* 等待Command = 0,FM1702复位成功 */
asm("nop");
}
////////////////////////////////////////////////////////////////////////////
SPIWrite1702(Page_Sel,0x80); //初始化SPI接口
if(SPIRead1702(Command)==FM1702_OK)//切换到线性寻址方式
SPIWrite1702(Page_Sel,0x00);
i = 0x0000fff;
while( SPIRead1702(Command)!= FM1702_OK&&i>3) //等待Command = 0,FM1702复位成功
{
i--;
asm("nop");
}
//USART1_SendByte(0XFc);
//SD_CS_LOW(); //片选
//USART1_SendByte(SD_ReadByte());
//SD_CS_HIGH(); //片选
//USART1_SendByte(0XFF);
//USART1_SendByte(SPIRead1702(ErrorFlag));
// P2 = SPIRead(TimerClock); //for debug
SPIWrite1702(TimerClock,0x0b); //address 2AH 定时器周期设置寄存器
SPIWrite1702(TimerControl,0x02); //address 2BH 定时器控制寄存器
SPIWrite1702(TimerReload,0x42); //address 2CH 定时器初值寄存器
SPIWrite1702(InterruptEn,0x7f); //address 06H 中断使能/禁止寄存器
SPIWrite1702(Int_Req,0x7f); //address 07H 中断请求标识寄存器
//USART1_SendByte(SPIRead1702(Int_Req)); // SPISendByte(MFOUTSelect,0x02); //address 26H mf OUT 选择配置寄存器
//设置调制器的输入源为内部编码器, 并且设置TX1和TX2
SPIWrite1702(TxControl,0x5b); //address 11H 发送控制寄存器
//USART1_SendByte(SPIRead1702(TxControl));
SPIWrite1702(RxControl2,0x01); //address 1EH
//USART1_SendByte(SPIRead1702(RxControl2));
// SPIWrite(RxControl1,0x73);
SPIWrite1702(RxWait,0x05); //address 21H
//USART1_SendByte(SPIRead1702(RxWait));
if(mode ==2)
SPIWrite1702(TypeSH,0x01);
else
SPIWrite1702(TypeSH,0x00); //address 31H
}
}
/****************************************************************
名称: Write_FIFO
功能: 该函数实现向FM1702的FIFO中写入x bytes数据
输入: length, 待写入字节的长度
buff, 指向待写入数据的指针
输出: N/A
****************************************************************/
void Write_FIFO(uchar length, uchar *buff)
{
uchar i;
for(i = 0; i < length; i++)
{
SPIWrite1