#include <stc11f32.h>
#include <stdlib.h>
#include <absacc.h>
#include <stdio.h>
#include "1702slupdate.h"
#include "string.h"
#include "stdio.h"
#define MAXRLEN 18
unsigned char LED_G_flag=0;
unsigned char LED_G_EN=0;
uchar status;
bit ic_card_flag;
unsigned char g_ucTempbuf[20];
sbit SPI_CLK=P1^3;
sbit SPI_SI=P1^4;
sbit SPI_SDO=P1^2;
sbit IC_CS=P1^0;
sbit RST_IC_ID=P1^1;
#define SET_NSS() {IC_CS=1;}
#define CLR_NSS() {IC_CS=0;}
#define SET_RC500RST() {RST_IC_ID=1;}
#define CLR_RC500RST() {RST_IC_ID=0;}
extern struct TranSciveBuffer{
unsigned char MfCommand;
unsigned int MfLength;
unsigned char MfData[64]; //和M1卡通信数据组
};
/*****************************program delay*******************************/
void Delay_1ms(void)
{
uint16 i;
for(i=0; i<1142; i++); //(把1142改为114)
}
void Delay_ms(uint16 n)
{
uint16 i;
// n=n*2.25;
n=n*2;
for(i=0; i<n; i++)Delay_1ms();
}
/******************** SPI Control ***************/
void Delay_1us(void)
{
uchar i=2;
while(i--);
}
void Delay_us(uint16 n)
{
uint x,y;
y=n;
for(x=0;x<y;x++)
{Delay_1us();}
}
/*
uchar SPI_Receive(void)
{
uchar i,j;
//SPI_CLK=0;
j=0;
for(i=0;i<8;i++)
{
SPI_CLK=0;
Delay_1us();
SPI_CLK=1; //(一个上升沿接受到数据)
Delay_1us();
j=j<<1;
if(SPI_SDO) //(难道是在高电平时接受数据)
{j++;} //(接收到的数据放到低位,从高到低)
Delay_1us();
}
//Transmit_byte(j);
return j;
}
void SPI_Transmit(uchar wByte)
{
uchar i;
for(i=0;i<8;i++)
{
if(wByte&0x80){SPI_SI=1;}
else{SPI_SI=0;} //从高位发送
Delay_1us();
wByte=wByte<<1;
SPI_CLK=0; //(一个下降沿把准备好的数据发送出去)
Delay_1us();
SPI_CLK=1; //(在高电平时发送数据)
Delay_1us();
}
}
*/
/////////////////////////////////////////////////////////////////////
//读1702寄存器位
//input:Address=寄存器地址
//ouput:读出的值
/////////////////////////////////////////////////////////////////////
unsigned char ReadRawRC(unsigned char Address)
{
unsigned char i, ucAddr;
unsigned char ucResult=0;
SPI_CLK = 0;
CLR_NSS();
ucAddr =((Address<<1)&0x7E)|0x80;
for(i=8;i>0;i--)
{
SPI_SI = ((ucAddr&0x80)==0x80); //主站送地址到从站MOSI
SPI_CLK = 1;
ucAddr <<= 1;
SPI_CLK = 0;
}
for(i=8;i>0;i--)
{
SPI_CLK = 1; //上升沿接收到数据
ucResult <<= 1;
ucResult|=(bit)SPI_SDO; //主站收到读出数据
SPI_CLK = 0;
}
SET_NSS();
SPI_CLK = 1;
return ucResult;
}
/////////////////////////////////////////////////////////////////////
//写1702寄存器
//input:Address=寄存器地址
// value=要写入的值
/////////////////////////////////////////////////////////////////////
void WriteRawRC(unsigned char Address, unsigned char value)
{
unsigned char i, ucAddr;
SPI_CLK = 0;
CLR_NSS();
ucAddr = ((Address<<1)&0x7E);
for(i=8;i>0;i--)
{
SPI_SI = ((ucAddr&0x80)==0x80);
SPI_CLK = 1;
ucAddr <<= 1;
SPI_CLK = 0;
}
for(i=8;i>0;i--)
{
SPI_SI = ((value&0x80)==0x80);
SPI_CLK = 1;
value <<= 1;
SPI_CLK = 0;
}
SET_NSS();
SPI_CLK = 1;
}
/*
/////////////////////////////////////////////////////////////////////
//读1702寄存器位
//input:Address=寄存器地址
//ouput:读出的值
/////////////////////////////////////////////////////////////////////
unsigned char ReadRawRC(unsigned char Address)
{
unsigned char ucAddr;
uchar ucResult=0;
CLR_NSS();
ucAddr = ((Address<<1)&0x7E)|0x80; //最高位地址设置为1(读地址)
SPI_Transmit(ucAddr);
ucResult=SPI_Receive();
SPI_Transmit(0x00); //(地址归零,还是到idle模式)
//ucResult=SPI_Receive();
SET_NSS();
//Transmit_byte(ucResult);
return ucResult;
}
/////////////////////////////////////////////////////////////////////
//功 能:写1702寄存器
//参数说明:Address[IN]:寄存器地址
// value[IN]:写入的值
/////////////////////////////////////////////////////////////////////
void WriteRawRC(unsigned char Address, unsigned char value)
{
unsigned char ucAddr;
CLR_NSS(); //片选
ucAddr = ((Address<<1)&0x7E); //取六位地址(写地址)
SPI_Transmit(ucAddr);
SPI_Transmit(value);
SET_NSS();
}
*/
/////////////////////////////////////////////////////////////////////
//置1702寄存器位
//input:reg=寄存器地址
// mask=置位值
/////////////////////////////////////////////////////////////////////
void SetBitMask(unsigned char reg,unsigned char mask)
{
char tmp = 0x0;
tmp = ReadRawRC(reg);
WriteRawRC(reg,tmp | mask); // set bit mask
}
/////////////////////////////////////////////////////////////////////
//清1702寄存器位
//input:reg=寄存器地址
// mask=清位值
/////////////////////////////////////////////////////////////////////
void ClearBitMask(unsigned char reg,unsigned char mask)
{
char tmp = 0x0;
tmp = ReadRawRC(reg);
WriteRawRC(reg, tmp & ~mask); // clear bit mask
}
/////////////////////////////////////////////////////////////////////
//通过1702和ISO14443卡通讯
//input: pi->MfCommand = RC1702命令字
// pi->MfLength = 发送的数据长度
// pi->MfData[] = 发送数据
//output:status = 错误字
// pi->MfLength = 接收的数据BIT长度
// pi->MfData[] = 接收数据
/////////////////////////////////////////////////////////////////////
char PcdComTransceive(struct TranSciveBuffer *pi)
{
bit recebyte = 0;
char status;
unsigned char irqEn = 0x00; //(what mean?)
unsigned char waitFor = 0x00; //(what mean?)
unsigned char lastBits;
unsigned char n;
unsigned int i;
switch (pi->MfCommand)
{
case PCD_IDLE:
irqEn = 0x00;
waitFor = 0x00;
break;
case PCD_WRITEE2:
irqEn = 0x11;
waitFor = 0x10;
break;
case PCD_READE2:
irqEn = 0x07;
waitFor = 0x04;
recebyte=1;
break;
case PCD_LOADCONFIG:
case PCD_LOADKEYE2:
case PCD_AUTHENT1: //(Cryptol算法第一步)
irqEn = 0x05;
waitFor = 0x04;
break;
case PCD_CALCCRC:
irqEn = 0x11;
waitFor = 0x10;
break;
case PCD_AUTHENT2:
irqEn = 0x04;
waitFor = 0x04;
break;
case PCD_RECEIVE:
irqEn = 0x06;
waitFor = 0x04;
recebyte=1;
break;
case PCD_LOADKEY:
irqEn = 0x05;
waitFor = 0x04;
break;
case PCD_TRANSMIT:
irqEn = 0x05; //(设置执行该命令时允许开启的中断标志位)
waitFor = 0x04; //(设置的等待时间)
break;
case PCD_TRANSCEIVE:
irqEn = 0x3D;
waitFor = 0x04;
recebyte=1;
break;
default:
pi->MfCommand = MI_UNKNOWN_COMMAND;
break;
}
if (pi->MfCommand != MI_UNKNOWN_COMMAND)
{
WriteRawRC(RegPage,0x00);
WriteRawRC(RegInterruptEn,0x7F); //禁止所有中断
WriteRawRC(RegInterruptRq,0x7F); //将所有中断标志位清零
WriteRawRC(RegCommand,PCD_IDLE); //停止所有命令
SetBitMask(RegControl,0x01); //清fifo
WriteRawRC(RegInterruptEn,irqEn|0x80); //使能IRQEN位
for (i=0; i<pi->MfLength; i++)
{
WriteRawRC(RegFIFOData, pi->MfData[i]); //把数据写入FIFOData内
}
WriteRawRC(RegCommand, pi->MfCommand); //写命�