#ifndef __RC522_H__
#define __RC522_H__

#include "iocc2530.h"
#include "public.h"

//#define IC_SDA  P2_0
//#define IC_SCK  P0_7
//#define IC_MOSI P0_6
//#define IC_MISO P0_5
//#define IC_RST  P0_4

#define IC_SDA_PIN        P2_0 //��������
#define IC_SDA_NUM        GPIO_0
#define IC_SDA_PORT       P2DIR    //���÷��� ���뻹�����
#define IC_SDA_PIN_MODE   P2INP    //��������ģʽ  �������� ��̬  ��������̬   P10P11������������ģʽ 
//�������������
#define IC_SDA_PIN_OUT() { IC_SDA_PORT |= IC_SDA_NUM; asm("NOP");IC_SDA_PIN_MODE&=~IC_SDA_NUM; } 

#define IC_SCK_PIN        P1_7 //��������
#define IC_SCK_NUM        GPIO_7
#define IC_SCK_PORT       P1DIR    //���÷��� ���뻹�����
#define IC_SCK_PIN_MODE   P1INP    //��������ģʽ  �������� ��̬  ��������̬   P10P11������������ģʽ 
//�������������
#define IC_SCK_PIN_OUT() { IC_SCK_PORT |= IC_SCK_NUM; asm("NOP");IC_SCK_PIN_MODE&=~IC_SCK_NUM; } 

#define IC_MOSI_PIN        P1_6 //��������
#define IC_MOSI_NUM        GPIO_6
#define IC_MOSI_PORT       P1DIR    //���÷��� ���뻹�����
#define IC_MOSI_PIN_MODE   P1INP    //��������ģʽ  �������� ��̬  ��������̬   P10P11������������ģʽ 
//�������������
#define IC_MOSI_PIN_OUT() { IC_MOSI_PORT |= IC_MOSI_NUM; asm("NOP");IC_MOSI_PIN_MODE&=~IC_MOSI_NUM; } 


#define IC_MISO_PIN        P1_5 //��������
#define IC_MISO_NUM        GPIO_5
#define IC_MISO_PORT       P1DIR    //���÷��� ���뻹�����
#define IC_MISO_PIN_MODE   P1INP    //��������ģʽ  �������� ��̬  ��������̬   P10P11������������ģʽ 
//�������������
#define IC_MISO_PIN_OUT() { IC_MISO_PORT |= IC_MISO_NUM; asm("NOP");IC_MISO_PIN_MODE&=~IC_MISO_NUM; } 


#define IC_RST_PIN         P1_4 //��������
#define IC_RST_NUM         GPIO_4
#define IC_RST_PORT        P1DIR    //���÷��� ���뻹�����
#define IC_RST_PIN_MODE    P1INP    //��������ģʽ  �������� ��̬  ��������̬   P10P11������������ģʽ 
//�������������
#define IC_RST_PIN_IN() { IC_RST_PORT &=~IC_RST_NUM; asm("NOP");IC_RST_PIN_MODE&=~IC_RST_NUM; } 

char PcdRead(unsigned char addr,unsigned char *pData);
void SPIWriteByte(unsigned char infor);
unsigned char SPIReadByte(void);
unsigned char ReadRawRC(unsigned char Address);
void WriteRawRC(unsigned char Address, unsigned char value);
void SetBitMask(unsigned char reg,unsigned char mask)  ;
void ClearBitMask(unsigned char reg,unsigned char mask)  ;
void PcdAntennaOn(void);
void PcdAntennaOff(void);
void PcdReset(void);
void M500PcdConfigISOType(unsigned char type);
char PcdComMF522(unsigned char Command, 		//RC522������
                 unsigned char *pInData, 		//ͨ��RC522���͵���Ƭ������
                 unsigned char InLenByte,		//�������ݵ��ֽڳ���
                 unsigned char *pOutData, 		//���յ��Ŀ�Ƭ��������
                 unsigned int  *pOutLenBit)	;
char PcdRequest(unsigned char req_code,unsigned char *pTagType);
char PcdAnticoll(unsigned char *pSnr);
void CalulateCRC(unsigned char *pIndata,unsigned char len,unsigned char *pOutData);
char PcdSelect(unsigned char *pSnr);
char PcdAuthState(unsigned char auth_mode,unsigned char addr,unsigned char *pKey,unsigned char *pSnr);
char PcdWrite(unsigned char addr,unsigned char *pData);
char PcdRead(unsigned char addr,unsigned char *pData);
char PcdHalt(void);
extern void PcdReset(void);//��λ
extern void M500PcdConfigISOType(unsigned char type);//������ʽ
extern char PcdRequest(unsigned char req_code,unsigned char *pTagType);//Ѱ��
extern char PcdAnticoll(unsigned char *pSnr);//������
extern void RC522_HAL_Init(void);

/////////////////////////////////////////////////////////////////////
//MF522������
/////////////////////////////////////////////////////////////////////
#define PCD_IDLE              0x00               //ȡ����ǰ����
#define PCD_AUTHENT           0x0E               //��֤��Կ
#define PCD_RECEIVE           0x08               //��������
#define PCD_TRANSMIT          0x04               //��������
#define PCD_TRANSCEIVE        0x0C               //���Ͳ���������
#define PCD_RESETPHASE        0x0F               //��λ
#define PCD_CALCCRC           0x03               //CRC����

/////////////////////////////////////////////////////////////////////
//Mifare_One��Ƭ������
/////////////////////////////////////////////////////////////////////
#define PICC_REQIDL           0x26               //Ѱ��������δ��������״̬
#define PICC_REQALL           0x52               //Ѱ��������ȫ����
#define PICC_ANTICOLL1        0x93               //����ײ
#define PICC_ANTICOLL2        0x95               //����ײ
#define PICC_AUTHENT1A        0x60               //��֤A��Կ
#define PICC_AUTHENT1B        0x61               //��֤B��Կ
#define PICC_READ             0x30               //����
#define PICC_WRITE            0xA0               //�
#define PICC_DECREMENT        0xC0               //�ۿ�
#define PICC_INCREMENT        0xC1               //��ֵ
#define PICC_RESTORE          0xC2               //�������ݵ�������
#define PICC_TRANSFER         0xB0               //���滺����������
#define PICC_HALT             0x50               //����

/////////////////////////////////////////////////////////////////////
//MF522 FIFO���ȶ���
/////////////////////////////////////////////////////////////////////
#define DEF_FIFO_LENGTH       64                 //FIFO size=64byte
#define MAXRLEN  18

/////////////////////////////////////////////////////////////////////
//MF522�Ĵ�������
/////////////////////////////////////////////////////////////////////
// PAGE 0
#define     RFU00                 0x00    
#define     CommandReg            0x01    
#define     ComIEnReg             0x02    
#define     DivlEnReg             0x03    
#define     ComIrqReg             0x04    
#define     DivIrqReg             0x05
#define     ErrorReg              0x06    
#define     Status1Reg            0x07    
#define     Status2Reg            0x08    
#define     FIFODataReg           0x09
#define     FIFOLevelReg          0x0A
#define     WaterLevelReg         0x0B
#define     ControlReg            0x0C
#define     BitFramingReg         0x0D
#define     CollReg               0x0E
#define     RFU0F                 0x0F
// PAGE 1     
#define     RFU10                 0x10
#define     ModeReg               0x11
#define     TxModeReg             0x12
#define     RxModeReg             0x13
#define     TxControlReg          0x14
#define     TxAutoReg             0x15
#define     TxSelReg              0x16
#define     RxSelReg              0x17
#define     RxThresholdReg        0x18
#define     DemodReg              0x19
#define     RFU1A                 0x1A
#define     RFU1B                 0x1B
#define     MifareReg             0x1C
#define     RFU1D                 0x1D
#define     RFU1E                 0x1E
#define     SerialSpeedReg        0x1F
// PAGE 2    
#define     RFU20                 0x20  
#define     CRCResultRegM         0x21
#define     CRCResultRegL         0x22
#define     RFU23                 0x23
#define     ModWidthReg           0x24
#define     RFU25                 0x25
#define     RFCfgReg              0x26
#define     GsNReg                0x27
#define     CWGsCfgReg            0x28
#define     ModGsCfgReg           0x29
#define     TModeReg              0x2A
#define     TPrescalerReg         0x2B
#define     TReloadRegH           0x2C
#define     TReloadRegL           0x2D
#define     TCounterValueRegH     0x2E
#define     TCounterValueRegL     0x2F
// PAGE 3      
#define     RFU30                 0x30
#define     TestSel1Reg           0x31
#define     TestSel2Reg           0x32
#define     TestPinEnReg          0x33
#define     TestPinValueReg       0x34
#define     TestBusReg            0x35
#define     AutoTestReg           0x36
#define     VersionReg            0x37
#define     AnalogTestReg         0x38
#define     TestDAC1Reg           0x39  
#define     TestDAC2Reg           0x3A   
#define     TestADCReg            0x3B   
#define     RFU3C                 0x3C   
#define     RFU3D                 0x3D   
#define     RFU3E                 0x3E   
#define     RFU3F		  		  0x3F

/////////////////////////////////////////////////////////////////////
//��MF522ͨѶʱ���صĴ������
/////////////////////////////////////////////////////////////////////
#define 	MI_OK                 0x26
#define 	MI_NOTAGERR           0xcc
#define 	MI_ERR                0xbb



#endif