RC.h头文件,主要是RC531命令及结构体内如如下:
#ifndef _RC_H
#define _RC_H
#ifndef uchar
#define uchar unsigned char
#endif
#ifndef uint
#define uint unsigned int
#endif
//常量定义
#define FALSE 0
#define TRUE 1
//spi通信端口宏
#define RC531_IRQ 0
#define RC531_PD 1
#define RC531_CS 2
#define RC531_MOSI 3
#define RC531_MISO 4
#define RC531_CLK 5
#define RC531_CS_LOW() {PORTB&=~(1<<RC531_CS);}
#define RC531_CS_HIGN() {PORTB|=(1<<RC531_CS);}
#define RC531_CLK_LOW() {PORTB&=~(1<<RC531_CLK);}
#define RC531_CLK_HIGN() {PORTB|=(1<<RC531_CLK);}
#define RC531_data() {PINB&(1<<RC531_MISO);}
#define RC531_UP() {PORTB|=(1<<RC531_PD);}
#define RC531_DOWN() {PORTB&=~(1<<RC531_PD);}
//卡的命令
#define PICC_REQSTD 0x26
#define PICC_REQALL 0x52
#define PICC_HALT 0x50
#define PICC_ANTICOLL1 0x93
#define PICC_ANTICOLL2 0x95
#define PICC_ANTICOLL3 0x97
#define PICC_AUTHENT1B 0x61
#define PICC_AUTHENT1A 0x60
#define PICC_READ 0x30
#define PICC_WRITE 0xA0
//RF531 set of commands
#define StartUp 0x3f
#define CmdIdle 0x00
#define Transmit 0x1a
#define Receive 0x16
#define CmdTransceive 0x1e
#define WritE2 0x01
#define ReadE2 0x03
#define CmdLoadKeyE2 0x0b
#define CmdLoadKey 0x19
#define CmdAuthent1 0x0c
#define CmdAuthent2 0x14
#define LoadConfig 0x07
#define CalcCRC 0x12
#define RF_TimeOut 0xfff //发送命令延时时间
#define Req 0x01
#define Sel 0x02
//RF531状态宏
#define FIFO_FULL ((PrimaryStatus&0x02)==1?,1:0)
#define FIFO_EMPTY ((PrimaryStatus&0x01)==1?,1:0)
#define PICC_DECREMENT 0xC0 //;decrement value
#define PICC_INCREMENT 0xC1 //;increment value
#define PICC_RESTORE 0xC2 //;restore command code
#define PICC_TRANSFER 0xB0 // ;transfer command code
#define PICC_HALT 0x50 // ;halt
//RF531 set of Registers addresses
#define RegPage 0x00
#define RegCommand 0x01
#define RegFIFOData 0x02
#define RegPrimaryStatus 0x03
#define SecondaryStatus 0x05
#define Int_Req 0x07
#define SPILevel 0x08
#define RegFIFOLevel 0x29
#define RegFIFOLength 0x04
#define RegControl 0x09
#define RegErrorFlag 0x0a
#define CollPos 0x0b
#define TimeValue 0x0c
#define RegCRCResuletLSB 0x0d
#define CRCResuletMSB 0x0e
#define RegBitFraming 0x0f
#define RegCRCPresetLSB 0x23
#define RegCwConductance 0x12
#define RegModConductance 0x13
#define RegRxWait 0x21
#define MFOUTSelect 0x26
#define RegChannelRedundancy 0x22
#define RegTimerClock 0x2a
#define RegTimerControl 0x2b
#define RegTimerReload 0x2c
#define RegInterruptEn 0x06
#define RegTxControl 0x11
#define TypeSH 0x31
#define RegCoderControl 0x14
#define TypeBFraming 0x17
#define RegDecoderControl 0x1a
#define RegClockQControl 0x1f
#define RegBitPhase 0x1B
#define RegRxThreshhold 0x1c
#define RegRxControl1 0x19
#define RegModWidth 0x15
#define RegBPSKDemControl 0x1d
#define RegIRqPinConfig 0x2D
#define RegCWConductance 0x12
#define RegRxControl2 0x1e
#define RegCRCPresetMSB 0x24
//卡片类型定义
#define TYPEA_MODE 0 //TYPEA模式
#define TYPEB_MODE 1 //TYPEB模式
#define SHANGHAI_MODE 2 //上海模式
//射频卡通信命令码定义
#define RF_CMD_REQUEST_STD 0x26
#define RF_CMD_REQUEST_ALL 0x52
#define RF_CMD_ANTICOL 0x93
#define RF_CMD_SELECT 0x93
#define RF_CMD_AUTH_LA 0x60
#define RF_CMD_AUTH_LB 0x61
#define RF_CMD_READ 0x30
#define RF_CMD_WRITE 0xa0
#define RF_CMD_INC 0xc1
#define RF_CMD_DEC 0xc0
#define RF_CMD_RESTORE 0xc2
#define RF_CMD_TRANSFER 0xb0
#define RF_CMD_HALT 0x50
//Status Value
#define ALL 0x01
#define KEYA 0x04
#define KEYB 0x00
#define _AB 0x40
#define CRC_A 1
#define CRC_B 2
#define CEC_OK 0
#define CRC_ERR 1
#define BCC_OK 0
#define BCC_ERR 1
//
#define MIFARE_8K 0 //MIFARE系列8K卡片
#define MIFARE_TOKEN 1 //MIFARE系列1KTOKEN卡片
#define SHANGHAI_8K 2 //上海标准系列8K卡片
#define SHANGHAI_TOKEN 3 // 上海标准系列1KTOKEN卡片
//
#define RC_531_OK 0 //正确
#define RC_531_NOTAGERR 1 //无卡
#define RC_531_CRCERR 2 //卡片CRC校验错误
#define RC_531_EMPTY 3 //数值溢出错误
#define RC_531_AUTHERR 4 //验证不成功
#define RC_531_PARITYERR 5 //卡片奇偶校验错误
#define RC_531_CODEERR 6 //通信错误(BCC)校验错误
#define RC_531_SERNRERR 8 //卡片序列号错误(anti-collison错误)
#define RC_531_SELECTERR 9 //卡片数据长度字节错(SELECT错误)
#define RC_531_NOTAUTHERR 10 //卡片没有通过验证
#define RC_531_BITCOUNTERR 11 //从卡片接受到的位数错误
#define RC_531_BYTECOUNTERR 12 //从卡片接受到的字节错误(仅读函数有效)
#define RC_531_RESTERR 13 //调用restore函数错误
#define RC_531_TRANSERR 14 //调用transfer函数错误
#define RC_531_WRITEERR 15 //调用write函数错误
#define RC_531_INCRERR 16 //调用increment函数错误
#define RC_531_DECRERR 17 //调用decrement函数错误
#define RC_531_READERR 18 //调用resad函数错误
#define RC_531_LOADKEYERR 19 //调用LOADKEY函数错误
#define RC_531_FRAMINGERR 20 //RC_531桢错误
#define RC_531_REQERR 21 //调用req函数错误
#define RC_531_SELERR 22 //调用sel函数错误
#define RC_531_ANTICOLLERR 23 //调用anticoll函数错误
#define RC_531_INTIVALERR 24 //调用初始化函数错误
#define RC_531_READVALERR 25 //调用高级读块值函数错误
#define RC_531_DESELECTERR 26
#define RC_531_CMD_ERR 42 //命令错误
//RF531 set of hanshu
extern void init_port(void);
extern uchar init_RF531(uchar);
extern void SPI_send(uchar temp);
extern uchar SPI_receive();
extern void SPI_write_byte(uchar address,uchar content);
extern uchar SPI_read_byte(uchar address);
extern void rf_reset();
extern void rf_reg_init();
extern void typeA_init(void);
extern void uart_proc();
extern void RequestA(); //;TYPE A卡卡请求RequestA命令
extern void Anticollision(); //;TYPE A卡防冲突Anticollision命令
extern void Select(); //;TYPE A卡选择卡Select命令
extern void CheckEEPROM(); //;TYPE A卡验证EEPROM密码命令
extern void CheckUser(); //;TYPE A卡验证User密码命令
extern void ReadTypeA(); //;TYPE A卡读卡命令
extern void WriteTypeA(); //;TYPE A卡写卡命令
extern void DecTypeA(); //;TYPE A卡钱包减命令
extern void IncTypeA(); //;TYPE A卡钱包加命令
extern void TranTypeA(); //;TYPE A卡Transfer命令
extern void HaltTypeA(); //;TYPE A卡Halt命令
extern void RestroeTypeA(); //;TYPE A卡Restore命令
extern void ReadRC531(); // ;读读卡芯片寄存器
extern void WriteRC531(); // ;写读卡芯片寄存器
extern void ToTypeA(); // ;打开射频信号并设成TYPE A方式
//case 0x0f: ToTypeB();break; //;打开射频信号并设成TYPE B方式
extern void Close(); //;关掉射频信号
#endif
RC531.C源文件,TypeA,TypeB读卡驱动代码如下:
内部包含SPI协议驱动代码。
#include "includes.h"
#include "uart.h"
#include "RC.h"
extern void SetTimerOut(uchar);
void init_port()
{
SFIOR=0x00;
PORTB=0x17;
DDRB=0x2e;
SPCR=0x50;//SPI中断不允许,msb先移出,主机模式,sck闲置时为低,sck时钟下降沿采样,spi的f=fosc/4
SPSR=0x00;
}
//spi 发送一个字节函数
void SPI_send(uchar temp)
{
SPDR=temp;
while(!(SPSR&(1<<7)));
return;
}
uchar SPI_receive()
{
SPDR=0x00;
while(!(SPSR&(1<<7)));
return SPDR;
}
uchar SPI_read_byte(uchar address)
{
uchar temp;
RC531_CS_LOW();
address<<=1;
address|=0x80;
address&=0xfe;
SPI_send(address);
temp=SPI_receive();
RC531_CS_HIGN();
return temp;
}
void SPI_write_byte(uchar address,uchar content)
{
//地址必须满足要求
address<<=1;
address&=0x7f;
RC531_CS_LOW();
__delay_cycles(40680);
SPI_send(address);
SPI_send(content);
RC531_CS_HIGN();
return;
}
void rf_reset()
{
uchar temp;
RC531_UP();
__delay_cycles(40680);
RC531_DOWN();
//_delay_ms(3.0);
//保证RC531正确复位
__delay_cycles(40680);
SPI_write_byte(RegPage,0x00);
nPubTime=40;
TIMSK=0x01; //定时器0中断允许
temp=5;
while(nPubTime>=5)
{
temp=SPI_read_byte(RegCommand);
if(temp==0x00)
{
TIMSK=0x00; //再次禁止定时器0中断
return;
}
}
return;
}
void FlushFIFO()
{
uchar temp;
temp=SPI_read_byte(RegControl);
temp|=0x01;
SPI_write_byte(RegControl,temp);
//_delay_us(100.0);
__delay_cycles(1356);
}
void rf_reg_init()
{
uchar temp;
SPI_write_byte(RegPage,0x00);
SPI_write_byte(RegClockQControl,0x47);
//_delay_us(100.0);//wait approximately 100 us - calibration in progress
__delay_cycles(1356);
// RCALL ClearBitMask // clear bit ClkQCalib for further calibration
temp=SPI_read_byte(RegClockQControl);
temp&=0xbf;
SPI_write_byte(RegClockQControl,temp);
//ADD:1B initialize bit phase,定义接收和发送的相位关系
SPI_write_byte(RegBitPhase,0xad);
//ADD:1C initialize minlevel,定义能分辨的最小信号强度
SPI_write_byte(RegRxThreshhold,0x24);
//ADD:1E ,用q时钟,接收总是aciivate(disable auto power down),内部解调
SPI_write_byte(RegRxControl2,0x01);
//;21
SPI_write_byte(RegRxWait,0x06);
//Depending on the processing speed of the operation environment, the waterlevel
//can be adapted. (not very critical for mifare applications) initialize waterlevel to value 4
//ADD: 29 ,定义使hi(lo)alert置位的FIFO数据数
SPI_write_byte(RegFIFOLevel,0x08);
//ADD: 2B ;定义为当数据传输结束时,定时器开始计时;timer must be stopped manually
SPI_write_byte(RegTimerControl,0x02); //TStopRxEnd=0,TStopRxBeg=0, TStartTxEnd=1,TStartTxBeg=0
//定义timeclock,timerload
SetTimerOut(0x01); //short timeout
//ADD: 2D 当irq置位时,输出引脚irq上点平反转
SPI_write_byte(RegIRqPinConfig,0x03); //interrupt active low enable
return;
}
void typeA_init(void)
{
// GLED_ON ;开指示灯
//ADD: $11
SPI_write_byte(RegTxControl,0x5b);
//ADD 12 ;与调制指数有关
SPI_write_byte(RegCwConductance,0x18);
//ADD 13 ;与调制指数有关
SPI_write_byte(RegModConductance,0x08);
//ADD: $14
SPI_write_byte(RegCoderControl,0x19);
_WDR();
//ADD: $15
SPI_write_byte(RegModWidth,0x13);
//ADD $19
SPI_write_byte(RegRxControl1,0x73);
//ADD $23
SPI_write_byte(RegCRCPresetLSB,0x63);
//ADD 24
SPI_write_byte(RegCRCPresetMSB,0x63);
//ADD 1D
SPI_write_byte(RegBPSKDemControl,0x1e);
//ADD 1A
SPI_write_byte(RegDecoderControl,0x48);
//ADD 1C
SPI_write_byte(RegRxThreshhold,0x44);
//Next if Format of Framing
//ADD 13
SPI_write_byte(RegModConductance,0x3f);
//_delay_ms(10.0); //延时1ms
__delay_cycles(135600);
main_flag&=0xfd;
//putc(0x48);
}
void uart_transmit(uchar length)
{
uchar checksum=0,*p;
putc(0xaa);//;发送数据头
UCSRA|=0x40;//清除串口数据
putc(0xaa);
putc(0xaa);
putc(0x96);
putc(0x0a);
p=pub_buff_content;
while(length--)
{ putc(*p);
checksum=checksum^(*p);
p++;
}
putc(checksum);
}
uchar check()
{
uchar *p1,temp,count;
p1=p.pBuffer+5;
temp=*p1++;
count=*p1++;
temp^=count;
while(count--)
temp=temp^(*p1++);
if(temp==0) return 1;
else return 0;
}
uchar tx_OK()
{
pub_buff_content[0]=0x00;
pub_buff_content[1]=0x04;
pub_buff_content[2]=0x00;
pub_buff_content[3]=0x00;
pub_buff_content[4]=0x90;
return 5;
}
uchar tx_false()
{
uchar temp;
pub_buff_content[0]=0x00;
pub_buff_content[1]=0x04;
pub_buff_content[2]=0x00;
pub_buff_content[3]=0x00;
pub_buff_content[4]=0x41;
temp=5;
return temp;
}
uchar CDRequest(void)
{
uchar temp;
SPI_write_byte(RegChannelRedundancy,0x0f);
FlushFIFO();
SPI_write_byte(RegFIFOData,PICC_HALT);
SPI_write_byte(RegFIFOData,0x00);
temp=SPI_read_byte(RegFIFOLength);
if(temp!=2)
{
temp=tx_false();
return temp;
}
SPI_write_byte(RegCommand,CmdTransceive);
__delay_cycles(13560);
SPI_write_byte(RegCommand,0x00);
//---------initialize------------
SPI_write_byte(RegChannelRedundancy,0x03); //;ADD: 0x22// ;RxCRC,TxCRC disable ;Parity enble
temp=SPI_read_byte(RegControl); //;ADD: 0x09
temp&=0xf7;
SPI_write_byte(RegControl,temp);
FlushFIFO();
SPI_write_byte(RegBitFraming,0x07); // ;ADD:0x1B
// ;set TxLastBits to 7
temp=SPI_read_byte(RegTxControl); // ;ADD: 0x11
temp|=0x03;
SPI_write_byte(RegTxControl,temp); // 确保TX1,TX2引脚输出的信号
SPI_write_byte(RegFIFOData,PICC_REQALL);
temp=SPI_read_byte(RegFIFOLength);
if(temp!=1)
{
temp=tx_false();
return temp;
}
SPI_write_byte(RegCommand,CmdTransceive);
__delay_cycles(27120);
temp=SPI_read_byte(RegFIFOLength);
//此时,缓冲区中存放的是卡返回的内容,如果有卡,缓冲区长度应该是2,没有卡应该是0
if(temp!=2)
{
temp=tx_false();
return temp;
}
pub_buff_content[0]=0x00;
pub_buff_content[1]=0x06;
pub_buff_content[2]=0x00;
pub_buff_content[3]=0x00;
pub_buff_content[4]=0x90;
temp=SPI_read_byte(RegFIFOData);
pub_buff_content[5]=temp;
temp=SPI_read_byte(RegFIFOData);
pub_buff_content[6]=temp;
return 7;
}
uchar CDAnticollision()
{
uchar temp,temp1,checksum=0,i;
temp=SPI_read_byte(RegControl);
temp&=0xf7;
SPI_write_byte(RegControl,temp);
FlushFIFO();
SPI_write_byte(RegChannelRedundancy,0x03);
SPI_write_byte(RegInterruptEn,0x7f);
SPI_write_byte(RegFIFOData,PICC_ANTICOLL1);
SPI_write_byte(RegFIFOData,0x20);
temp=SPI_read_byte(RegFIFOLength);
if(temp!=0x02)
{
temp=tx_false();
return temp;
}
SPI_write_byte(RegCommand,CmdTransceive);
__delay_cycles(27120);
temp=SPI_read_byte(RegFIFOLength);
if(temp!=0x05)
{
temp=tx_false();
return temp;
}
temp1=temp;
pub_buff_content[0]=0x00;
pub_buff_content[1]=0x09;
pub_buff_content[2]=0x00;
pub_buff_content[3]=0x00;
pub_buff_content[4]=0x90;
i=temp1;
while(temp1--)
{
temp=SPI_read_byte(RegFIFOData);
pub_buff_content[i++]=temp;
checksum^=temp;
}
if(checksum!=0)
{
temp=tx_false();
return temp;
}
return 10;
}
void After_op()
{
p.nCount=0;
p.nHead=0;
p.nTail=0;
rsrecv_num=0;
rsrxdat_num=0;
rsrecv_endp=p.pBuffer;
rsrxdat_p=p.pBuffer;
main_flag&=0xe7;
return;
}
uchar CDSelect()
{
uchar i=0,temp;
temp=SPI_read_byte(RegControl);
temp&=0xf7;
SPI_write_byte(RegControl,temp);
FlushFIFO();
SPI_write_byte(RegChannelRedundancy,0x0f);
SPI_write_byte(RegInterruptEn,0x7f);
SPI_write_byte(RegFIFOData,PICC_ANTICOLL1);
SPI_write_byte(RegFIFOData,0x70);
while(i<5)
{
SPI_write_byte(RegFIFOData,*(p.pBuffer+9+i));
i++;
}
temp=SPI_read_byte(RegFIFOLength);
if(temp!=0x07)
{
temp=tx_false();
return temp;
}
SPI_write_byte(RegCommand,CmdTransceive);
for(i=0;i<20;i++)
{
__delay_cycles(135600);
}
temp=SPI_read_byte(RegFIFOLength);
if(temp!=0x01)
{
temp=tx_false();
return temp;
}
pub_buff_content[0]=0x00;
pub_buff_content[1]=0x05;
pub_buff_content[2]=0x00;
pub_buff_content[3]=0x00;
pub_buff_content[4]=0x90;
temp=SPI_read_byte(RegFIFOData);
pub_buff_content[5]=temp;
return 6;
}
//;TYPE A卡卡请求RequestA命令
void RequestA()
{
uchar temp;
if((main_flag&0x10)==0)
{
// After_op();
return;
}
temp=check();
if(temp==0)
{
After_op();
return;
}
temp=CDRequest();
uart_transmit(temp);
After_op();
return;
}
//;TYPE A卡防冲突Anticollision命令
void Anticollision()
{
uchar temp;
if((main_flag&0x10)==0)
{
// After_op();
return;
}
temp=check();
if(temp==0)
{
After_op();
return;
}
temp=CDAnticollision();
uart_transmit(temp);
After_op();
return;
}
// ;TYPE A卡选择卡Select命令
void Select()
{
uchar temp;
if((main_flag&0x10)==0)
{
// After_op();
return;
}
temp=check();
if(temp==0)
{
After_op();
return;
}
temp=CDSelect();
uart_transmit(temp);
After_op();
return;
}
uchar CDAuthenticationE2()
{
uchar temp;
int i,mul,temp1,temp2;
FlushFIFO();
SPI_write_byte(RegCommand,CmdIdle);
temp=*(p.pBuffer+9); //取出扇区号
temp2=temp; //把扇区号 ——存于temp2中
mul=temp*44+128; //根据扇区号计算出E2PROM中该Sector的密码地址
temp=*(p.pBuffer+10); //取出密码类型
temp1=temp; //save密码类型,A或者B
if(temp&0x01)
mul+=12;
SPI_write_byte(RegFIFOData,mul-256*(mul/256)); //低地址
SPI_write_byte(RegFIFOData,mul/256); //高地址
temp=SPI_read_byte(RegFIFOLength);
if(temp!=0x02)
{
temp=tx_false();
return temp;
}
SPI_write_byte(RegCommand,CmdLoadKeyE2);
temp=SPI_read_byte(RegErrorFlag);
if(!(temp&0x40))
{
temp=tx_false();
return temp;
}
__delay_cycles(40680);//3 ms
//把需要的密码放入keybuffer里
if(temp1&0x01)
*(p.pBuffer+9)=PICC_AUTHENT1B;
else
*(p.pBuffer+9)=PICC_AUTHENT1A;
temp2=temp2*4; //r19
*(p.pBuffer+10)=temp2; //保存块号
temp=6;
i=9;
while(temp--)
SPI_write_byte(RegFIFOData,*(p.pBuffer+(i++)));
temp=SPI_read_byte(RegFIFOLength);
if(temp!=0x06)
{
temp=tx_false();
return temp;
}
SPI_write_byte(RegCommand,CmdAuthent1);
temp=SPI_read_byte(RegErrorFlag);
if(temp&0x07)
{
temp=tx_false();
return temp;
}
SPI_write_byte(RegCommand,CmdAuthent2);
__delay_cycles(27120);
temp=SPI_read_byte(RegControl);
if(!(temp&0x08))
{
temp=tx_false();
return temp;
}
temp=tx_OK();
return temp;
}
uchar CDAuthenticationUser()
{
uchar i=11,tim=6,temp1,temp;
int mul;
FlushFIFO();
//转换密码格式
while(tim--)
{
temp=*(p.pBuffer+i);
temp1=temp;
temp&=0xf0;
temp=(temp<<4)|(temp>>4);
temp1=(~temp1)&0xf0;
temp1|=temp;
SPI_write_byte(RegFIFOData,temp1);
temp=temp1=*(p.pBuffer+i);
temp=(temp<<4)|(temp>>4);
temp=(~temp)&0xf0;
temp1&=0x0f;
temp|=temp1;
SPI_write_byte(RegFIFOData,temp);
i++;
}
SPI_write_byte(RegCommand,CmdLoadKey);
temp=SPI_read_byte(RegErrorFlag);
putc(temp);
if(temp&0x40) //;KeyErr is Set?
{
temp=tx_false();
return temp;
}
__delay_cycles(40680);
mul=(*(p.pBuffer+9))*4; //;计算块号
temp=*(p.pBuffer+10);
if(temp&0x01)
SPI_write_byte(RegFIFOData,PICC_AUTHENT1B); //B;第0位为1,B密码
else
SPI_write_byte(RegFIFOData,PICC_AUTHENT1A);//A/;第0位为0,A密码
SPI_write_byte(RegFIFOData,mul);// ;块号
i=17;tim=4;
while(tim--)
{
SPI_write_byte(RegFIFOData,*(p.pBuffer+i));
i++;
}
temp=SPI_read_byte(RegFIFOLength);
if(temp!=0x06)
{
temp=tx_false();
return temp;
}
SPI_write_byte(RegCommand,CmdAuthent1);
__delay_cycles(27120);
temp=SPI_read_byte(RegErrorFlag);
putc(temp);
if(temp&0x07) //;KeyErr is Set?
{
temp=tx_false();
return temp;
}
SPI_write_byte(RegCommand,CmdAuthent2);
__delay_cycles(27120);
temp=SPI_read_byte(RegControl);
putc(temp);
if(!(temp&0x08))
{
temp=tx_false();
return temp;
}
temp=tx_OK();
return temp;
}
uchar CDRead()
{
uchar i,tim,temp;
SPI_write_byte(RegChannelRedundancy,0x0f);
FlushFIFO();
SPI_write_byte(RegFIFOData,PICC_READ);
SPI_write_byte(RegFIFOData,*(p.pBuffer+9));
temp=SPI_read_byte(RegFIFOLength);
putc(temp);
if(temp!=0x02)
{
temp=tx_false();
return temp;
}
SPI_write_byte(RegCommand,CmdTransceive);
__delay_cycles(27120);//;延时>2ms
temp=SPI_read_byte(RegFIFOLength);
putc(temp);
if(temp!=0x10)
{
temp=tx_false();
return temp;
}
pub_buff_content[0]=0x00;
pub_buff_content[1]=0x14;
pub_buff_content[2]=0x00;
pub_buff_content[3]=0x00;
pub_buff_content[4]=0x90;
i=16;tim=5;
while(i--)
{
temp=SPI_read_byte(RegFIFOData);
pub_buff_content[tim++]=temp;
}
return 21;
}
uchar CDWrite()
{
uchar i,tim,temp;
SPI_write_byte(RegChannelRedundancy,0x0f);
FlushFIFO();
SPI_write_byte(RegFIFOData,PICC_WRITE);
SPI_write_byte(RegFIFOData,*(p.pBuffer+9)); //;nBlock
temp=SPI_read_byte(RegFIFOLength);
putc(temp);
if(temp!=0x02)
{
temp=tx_false();
return temp;
}
SPI_write_byte(RegCommand,CmdTransceive);
__delay_cycles(27120);//;延时>2ms
temp=SPI_read_byte(RegFIFOLength);
putc(temp);
if(temp!=0x01)
{
temp=tx_false();
return temp;
}
temp=SPI_read_byte(RegFIFOData); //随机数,所以不用判断是多少
putc(temp);
i=16;tim=10;
while(i--)
{
SPI_write_byte(RegFIFOData,*(p.pBuffer+tim));
tim++;
}
SPI_write_byte(RegCommand,CmdTransceive);
i=5;
while(i--)
{
__delay_cycles(5452);
temp=SPI_read_byte(RegFIFOLength); //等待数据发送完毕
if(temp==0) break;
}
putc(i);
if(i==0)
{
temp=tx_false();
return temp;
}
i=16; //16次循环每次延时0.5ms
while(i--)// ;数据发送完毕,等待返回信息或者超时
{
__delay_cycles(6780);
temp=SPI_read_byte(RegFIFOLength);
if(temp==1) break;
}
temp=SPI_read_byte(RegFIFOData);
putc(temp);
if(temp!=0x0a)
{
temp=tx_false();
return temp;
}
temp=tx_OK();
return temp;
}
uchar CDDecrement()
{
uchar i,tim,temp;
SPI_write_byte(RegChannelRedundancy,0x0f);
FlushFIFO();
SPI_write_byte(RegFIFOData,PICC_DECREMENT);
SPI_write_byte(RegFIFOData,*(p.pBuffer+9));
temp=SPI_read_byte(RegFIFOLength);
putc(temp);
if(temp!=0x02)
{
temp=tx_false();
return temp;
}
SPI_write_byte(RegCommand,CmdTransceive);
__delay_cycles(27120);//;延时>2ms
temp=SPI_read_byte(RegFIFOLength);
putc(temp);
if(temp!=0x01)
{
temp=tx_false();
return temp;
}
temp=SPI_read_byte(RegFIFOData);
FlushFIFO();
tim=4;i=10;
while(tim--)
{
SPI_write_byte(RegFIFOData,*(p.pBuffer+i));
i++;
}
SPI_write_byte(RegCommand,CmdTransceive);
__delay_cycles(27120);//;延时>2ms
temp=SPI_read_byte(RegPrimaryStatus);
putc(temp);
if(temp&0x04)
{
temp=tx_false();
return temp;
}
temp=tx_OK();
return temp;
}
uchar CDIncrement()
{
uchar i,tim,temp;
SPI_write_byte(RegChannelRedundancy,0x0f);
FlushFIFO();
SPI_write_byte(RegFIFOData,PICC_INCREMENT);
SPI_write_byte(RegFIFOData,*(p.pBuffer+9));
temp=SPI_read_byte(RegFIFOLength);
putc(temp);
if(temp!=0x02)
{
temp=tx_false();
return temp;
}
SPI_write_byte(RegCommand,CmdTransceive);
__delay_cycles(27120);//;延时>2ms
temp=SPI_read_byte(RegFIFOLength);
putc(temp);
if(temp!=0x01)
{
temp=tx_false();
return temp;
}
temp=SPI_read_byte(RegFIFOData);
FlushFIFO();
tim=4;i=10;
while(tim--)
{
SPI_write_byte(RegFIFOData,*(p.pBuffer+i));
i++;
}
SPI_write_byte(RegCommand,CmdTransceive);
__delay_cycles(27120);//;延时>2ms
temp=SPI_read_byte(RegPrimaryStatus);
putc(temp);
if(temp&0x04)
{
temp=tx_false();
return temp;
}
temp=tx_OK();
return temp;
}
uchar CDTransfer()
{
uchar i,temp;
SPI_write_byte(RegChannelRedundancy,0x0f);
FlushFIFO();
SPI_write_byte(RegFIFOData,PICC_TRANSFER);
SPI_write_byte(RegFIFOData,*(p.pBuffer+9));//;nBlock
temp=SPI_read_byte(RegFIFOLength);
if(temp!=2)
{
temp=tx_false();
return temp;
}
SPI_write_byte(RegCommand,CmdTransceive);
i=4;
while(i--)
{
__delay_cycles(27120);//;延时>2ms
__delay_cycles(27120);
temp=SPI_read_byte(RegFIFOLength);
if(temp==1) break;
}
if(i==0)
{
temp=tx_false();
return temp;
}
temp=SPI_read_byte(RegFIFOData);
temp=tx_OK();
return temp;
}
uchar CDHalt()
{
uchar temp;
SPI_write_byte(RegChannelRedundancy,0x0f);
FlushFIFO();
SPI_write_byte(RegFIFOData,PICC_HALT);
SPI_write_byte(RegFIFOData,0x00);
temp=SPI_read_byte(RegFIFOLength);
if(temp!=2)
{
temp=tx_false();
return temp;
}
SPI_write_byte(RegCommand,CmdTransceive);
temp=SPI_read_byte(RegPrimaryStatus);
if(temp&0x04)
{
temp=tx_false();
return temp;
}
temp=tx_OK();
return temp;
}
uchar CDRestore()
{
uchar i,tim,temp;
SPI_write_byte(RegChannelRedundancy,0x0f);
FlushFIFO();
SPI_write_byte(RegFIFOData,PICC_RESTORE);
SPI_write_byte(RegFIFOData,*(p.pBuffer+9));// ;nBlock
temp=SPI_read_byte(RegFIFOLength);
if(temp!=2)
{
temp=tx_false();
return temp;
}
SPI_write_byte(RegCommand,CmdTransceive);
__delay_cycles(27120);//;延时>2ms
temp=SPI_read_byte(RegFIFOLength);
if(temp!=0x01)
{
temp=tx_false();
return temp;
}
temp=SPI_read_byte(RegFIFOData);//;不用判断,值不确定
tim=4;i=10;
while(tim--)
{
SPI_write_byte(RegFIFOData,*(p.pBuffer+i));
i++;
}
SPI_write_byte(RegCommand,CmdTransceive);
__delay_cycles(27120);//;延时2ms
temp=SPI_read_byte(RegPrimaryStatus);
if(temp&0x04)
{
temp=tx_false();
return temp;
}
temp=tx_OK();
return temp;
}
// ;TYPE A卡验证EEPROM密码命令
void CheckEEPROM()
{
uchar temp;
if((main_flag&0x10)==0)
{
//After_op();
return;
}
temp=check();
if(temp==0)
{
After_op();
return;
}
temp=CDAuthenticationE2();
uart_transmit(temp);
After_op();
return;
}
//;TYPE A卡验证User密码命令
void CheckUser()
{
uchar temp;
if((main_flag&0x10)==0)
{
//After_op();
return;
}
temp=check();
if(temp==0)
{
After_op();
return;
}
temp=CDAuthenticationUser();
uart_transmit(temp);
After_op();
return;
}
// ;TYPE A卡读卡命令
void ReadTypeA()
{
uchar temp;
if((main_flag&0x10)==0)
{
//After_op();
return;
}
temp=check();
if(temp==0)
{
After_op();
return;
}
temp=CDRead();
uart_transmit(temp);
After_op();
return;
}
// ;TYPE A卡写卡命令
void WriteTypeA()
{
uchar temp;
if((main_flag&0x10)==0)
{
//After_op();
return;
}
temp=check();
if(temp==0)
{
After_op();
return;
}
temp=CDWrite();
uart_transmit(temp);
After_op();
return;
}
//;TYPE A卡钱包减命令
void DecTypeA()
{
uchar temp;
if((main_flag&0x10)==0)
{
//After_op();
return;
}
temp=check();
if(temp==0)
{
After_op();
return;
}
temp=CDDecrement();
uart_transmit(temp);
After_op();
return;
}
// ;TYPE A卡钱包加命令
void IncTypeA()
{
uchar temp;
if((main_flag&0x10)==0)
{
//After_op();
return;
}
temp=check();
if(temp==0)
{
After_op();
return;
}
temp=CDIncrement();
uart_transmit(temp);
After_op();
return;
}
// ;TYPE A卡Transfer命令
void TranTypeA()
{
uchar temp;
if((main_flag&0x10)==0)
{
//After_op();
return;
}
temp=check();
if(temp==0)
{
After_op();
return;
}
temp=CDTransfer();
uart_transmit(temp);
After_op();
return;
}
// ;TYPE A卡Halt命令
void HaltTypeA()
{
uchar temp;
if((main_flag&0x10)==0)
{
//After_op();
return;
}
temp=check();
if(temp==0)
{
After_op();
return;
}
temp=CDHalt();
uart_transmit(temp);
After_op();
return;
}
//;TYPE A卡Restore命令
void RestroeTypeA()
{
uchar temp;
if((main_flag&0x10)==0)
{
//After_op();
return;
}
temp=check();
if(temp==0)
{
After_op();
return;
}
temp=CDRestore();
uart_transmit(temp);
After_op();
return;
}
// ;读读卡芯片寄存器
void ReadRC531()
{
uchar temp;
if((main_flag&0x10)==0)
{
//After_op();
return;
}
temp=check();
if(temp==0)
{
After_op();
return;
}
temp=SPI_read_byte(*(p.pBuffer+9));
pub_buff_content[0]=0x00;
pub_buff_content[1]=0x05;
pub_buff_content[2]=0x00;
pub_buff_content[3]=0x00;
pub_buff_content[4]=0x90;
pub_buff_content[5]=temp;
uart_transmit(6);
After_op();
return;
}
// ;写读卡芯片寄存器
void WriteRC531()
{
uchar temp;
if((main_flag&0x10)==0)
{
//After_op();
return;
}
temp=check();
if(temp==0)
{
After_op();
return;
}
SPI_write_byte(*(p.pBuffer+9),*(p.pBuffer+10));
temp=tx_OK();
uart_transmit(temp);
After_op();
return;
}
//;打开射频信号并设成TYPE A方式
void ToTypeA()
{
uchar temp;
if((main_flag&0x10)==0)
{
//After_op();
return;
}
temp=check();
if(temp==0)
{
After_op();
return;
}
typeA_init();
temp=tx_OK();
uart_transmit(temp);
return;
}
//;关掉射频信号
void Close()
{
uchar temp;
if((main_flag&0x10)==0)
{
//After_op();
return;
}
temp=check();
if(temp==0)
{
After_op();
return;
}
SPI_write_byte(RegTxControl,0x00);
temp=tx_OK();
uart_transmit(temp);
After_op();
return;
}