ST17H26对接RC522读IC卡
主要代碼如下:
? ? while(1)?
{
//DoorIdReadEm4001Test();
DoorRc522Start();
DoorRc522Test1();
sleep_us(100000);
? ? ? ? main_loop();
? ? ? ? //clr_watch_dog();
? ? }
#define RF522_RST_IO GPIO_GP29
#define RF522_ADDR (0x50 >> 0)//01010000
#define RC522_I2C_ID 0x50
void rc522_write(int adr, u8 *p, int len)
{
int i = 0;
while(len > 0)
{
int l = len >= 8 ? 8 : len; //page write: 8-byte
len -= l;
i2c_sim_burst_write(RC522_I2C_ID, adr + i, p + i, l);
i += l;
sleep_us(5);
}
}
void rc522_read(int adr, u8 *p, int len)
{
i2c_sim_burst_read(RC522_I2C_ID, adr, p, len);
}
#include "DoorRc522.h"
#define MAXRLEN 18
U8 Rc522StartFlag;
static U8 Rc522Time;
unsigned char I2CRdStr(unsigned char ucSla, unsigned char ucAddress, unsigned char *ucBuf, unsigned char ucCount)
{
unsigned char ret;
ret = 1;
rc522_read(ucAddress, ucBuf, ucCount);
return ret;
}
unsigned char I2CWrStr(unsigned char ucSla, unsigned char ucAddress, unsigned char *ucData, unsigned char ucNo)
{
unsigned char ret;
ret = 1;
rc522_write(ucAddress, ucData, ucNo);
return 1;
}
/
//功 ? ?能:讀RC632寄存器
//參數說明:Address[IN]:寄存器地址
//返 ? ?回:讀出的值
/
unsigned char ReadRawRC(unsigned char Address)
{
unsigned char tmp;
? ? I2CRdStr(RF522_ADDR, Address, &tmp, 0x01);
return tmp;
}
/
//功 ? ?能:寫RC632寄存器
//參數說明:Address[IN]:寄存器地址
// ? ? ? ? ?value[IN]:寫入的值
/
void WriteRawRC(unsigned char Address, unsigned char value)
{
? ? I2CWrStr(RF522_ADDR, Address, &value, 0x01);
}
void DoorRf522RstIoInit(void)
{
gpio_write(RF522_RST_IO, 0);
sleep_us(10000);
gpio_write(RF522_RST_IO, 1);
}
static void DoorRf522RstIoHigh(void)
{
gpio_write(RF522_RST_IO, 1);
}
static void DoorRf522RstIoLow(void)
{
gpio_write(RF522_RST_IO, 0);
}
void DoorUnit10UsDelay(U32 value)
{
sleep_us(value*10);
}
/
//功 ? ?能:復位RC522
//返 ? ?回: 成功返回MI_OK
/
char PcdReset(void)
{
unsigned char n;
DoorRf522RstIoHigh();
DoorUnit10UsDelay(10);?
DoorRf522RstIoLow();
DoorUnit10UsDelay(10);?
DoorRf522RstIoHigh();
DoorUnit10UsDelay(10);?
n = ReadRawRC(CommandReg);
WriteRawRC(CommandReg, PCD_RESETPHASE);
DoorUnit10UsDelay(10);?
? ? WriteRawRC(ModeReg, 0x3D); ? ? ? ? ? ?//和Mifare卡通訊,CRC初始值0x6363
? ? WriteRawRC(TReloadRegL, 30);
? ? WriteRawRC(TReloadRegH, 0);
? ? WriteRawRC(TModeReg, 0x8D);
? ? WriteRawRC(TPrescalerReg, 0x3E);
? ? WriteRawRC(TxAutoReg, 0x40);
? ? return MI_OK;
}
/
//功 ? ?能:置RC522寄存器位
//參數說明:reg[IN]:寄存器地址
// ? ? ? ? ?mask[IN]:置位值
/
void SetBitMask(unsigned char reg, unsigned char mask)
{
? ? char tmp = 0x00;
? ? tmp = ReadRawRC(reg);
? ? WriteRawRC(reg, (tmp | mask)); ?// set bit mask
}
/
//功 ? ?能:清RC522寄存器位
//參數說明:reg[IN]:寄存器地址
// ? ? ? ? ?mask[IN]:清位值
/
void ClearBitMask(unsigned char reg, unsigned char mask)
{
? ? char tmp = 0x00;
? ? tmp = ReadRawRC(reg);
? ? WriteRawRC(reg, (tmp & ~mask));//clear bit mask
}
/
//用MF522計算CRC16函數
/
void CalulateCRC(unsigned char *pIndata, unsigned char len, unsigned char *pOutData)
{
? ? unsigned char i, n;
? ? ClearBitMask(DivIrqReg, 0x04);
? ? WriteRawRC(CommandReg, PCD_IDLE);
? ? SetBitMask(FIFOLevelReg, 0x80);
? ? for(i=0; i<len; i++)
? ? {
WriteRawRC(FIFODataReg, *(pIndata+i));
}
? ? WriteRawRC(CommandReg, PCD_CALCCRC);
? ? i = 0xFF;
? ? do
? ? {
? ? ? ? n = ReadRawRC(DivIrqReg);
? ? ? ? i--;
? ? }
? ? while((i!=0) && !(n&0x04));
? ? pOutData[0] = ReadRawRC(CRCResultRegL);
? ? pOutData[1] = ReadRawRC(CRCResultRegM);
}
/
//功 ? ?能:命令卡片進入休眠狀態
//返 ? ?回: 成功返回MI_OK
/
char PcdHalt(void)
{
? ? char status;
? ? unsigned int unLen;
? ? unsigned char ucComMF522Buf[MAXRLEN];
? ? ucComMF522Buf[0] = PICC_HALT;
? ? ucComMF522Buf[1] = 0;
? ? CalulateCRC(ucComMF522Buf, 2, &ucComMF522Buf[2]);
? ? status = PcdComMF522(PCD_TRANSCEIVE, ucComMF522Buf, 4, ucComMF522Buf, &unLen);
? ? return MI_OK;
}
/
//開啟天線
//每次啟動或關閉天險發射之間應至少有1ms的間隔
/
void PcdAntennaOn()
{
? ? unsigned char i;
? ? i = ReadRawRC(TxControlReg);
? ? if(!(i & 0x03))
? ? {
? ? ? ? SetBitMask(TxControlReg, 0x03);
? ? }
}
/
//關閉天線
/
void PcdAntennaOff()
{
? ? ClearBitMask(TxControlReg, 0x03);
}
void DoorTimerDelayUnitMs(U32 counterMs)
{
DoorUnit10UsDelay(counterMs*100);
}
//
//設置RC632的工作方式
//
char M500PcdConfigISOType(unsigned char type)
{
if(type == 'A')//ISO14443_A
{
ClearBitMask(Status2Reg, 0x08);
/*
WriteRawRC(CommandReg,0x20); ? ?//as default
WriteRawRC(ComIEnReg,0x80); ? ? //as default
WriteRawRC(DivlEnReg,0x0); ? ? ?//as default
WriteRawRC(ComIrqReg,0x04); ? ? //as default
WriteRawRC(DivIrqReg,0x0); ? ? ?//as default
WriteRawRC(Status2Reg,0x0);//80 ? ?//trun off temperature sensor
WriteRawRC(WaterLevelReg,0x08); //as default
WriteRawRC(ControlReg,0x20); ? ?//as default
WriteRawRC(CollReg,0x80); ? ?//as default
*/
WriteRawRC(ModeReg, 0x3D);//3F
/*
WriteRawRC(TxModeReg,0x0); ? ? ?//as default???
WriteRawRC(RxModeReg,0x0); ? ? ?//as default???
WriteRawRC(TxControlReg,0x80); ?//as default???
WriteRawRC(TxSelReg,0x10); ? ? ?//as default???
*/
WriteRawRC(RxSelReg, 0x86);//84
//WriteRawRC(RxThresholdReg,0x84);//as default
//WriteRawRC(DemodReg,0x4D); ? ? ?//as default
//WriteRawRC(ModWidthReg,0x13);//26
WriteRawRC(RFCfgReg, 0x7F); ? //4F
/*
WriteRawRC(GsNReg,0x88); ? ? ? ?//as default???
WriteRawRC(CWGsCfgReg,0x20); ? ?//as default???
WriteRawRC(ModGsCfgReg,0x20); ? //as default???
*/
WriteRawRC(TReloadRegL, 30);//tmoLength);// TReloadVal = 'h6a =tmoLength(dec)
WriteRawRC(TReloadRegH, 0);
WriteRawRC(TModeReg, 0x8D);
WriteRawRC(TPrescalerReg, 0x3E);
DoorTimerDelayUnitMs(3);
PcdAntennaOn();
}
else
{
return -1;
}
return MI_OK;
}
/
//功 ? ?能:通過RC522和ISO14443卡通訊
//參數說明:Command[IN]:RC522命令字
// ? ? ? ? ?pInData[IN]:通過RC522發送到卡片的數據
// ? ? ? ? ?InLenByte[IN]:發送數據的字節長度
// ? ? ? ? ?pOutData[OUT]:接收到的卡片返回數據
// ? ? ? ? ?*pOutLenBit[OUT]:返回數據的位長度
/
char PcdComMF522(unsigned char Command,
? ? ? ? ? ? ? ? ?unsigned char *pInData,
? ? ? ? ? ? ? ? ?unsigned char InLenByte,
? ? ? ? ? ? ? ? ?unsigned char *pOutData,
? ? ? ? ? ? ? ? ?unsigned int ?*pOutLenBit)
{
char status = MI_ERR;
unsigned char irqEn ? = 0x00;
unsigned char waitFor = 0x00;
unsigned char lastBits;
unsigned char n;
unsigned int i;
? ? switch(Command)
? ? {
case PCD_AUTHENT:
irqEn ? = 0x12;
waitFor = 0x10;
break;
case PCD_TRANSCEIVE:
irqEn ? = 0x77;
waitFor = 0x30;
break;
default:
break;
? ? }
? ? WriteRawRC(ComIEnReg, irqEn|0x80);
? ? ClearBitMask(ComIrqReg, 0x80);
? ? WriteRawRC(CommandReg, PCD_IDLE);
? ? SetBitMask(FIFOLevelReg, 0x80);
? ? I2CWrStr(RF522_ADDR, FIFODataReg, pInData, InLenByte);
? ? WriteRawRC(CommandReg, Command);
? ? if(Command == PCD_TRANSCEIVE)
? ? {
SetBitMask(BitFramingReg, 0x80);
}
//i = 600;//根據時鐘頻率調整,操作M1卡最大等待時間25ms
i = 2000;
? ? do
? ? {
? ? ? ? ?n = ReadRawRC(ComIrqReg);
? ? ? ? ?i--;
? ? }
? ? while ((i!=0) && !(n&0x01) && !(n&waitFor));
? ? ClearBitMask(BitFramingReg, 0x80);
? ? if(i != 0)
? ? {
if( !(ReadRawRC(ErrorReg) & 0x1B) )
{
status = MI_OK;
if(n & irqEn & 0x01)
{
status = MI_NOTAGERR;
}
if(Command == PCD_TRANSCEIVE)
{
n = ReadRawRC(FIFOLevelReg);
lastBits = ReadRawRC(ControlReg) & 0x07;
if(lastBits)
{
*pOutLenBit = (n-1)*8 + lastBits;
}
else
{
*pOutLenBit = n*8;
}
if(n == 0)
{
n = 1;
}
if(n > MAXRLEN)
{
n = MAXRLEN;
}
I2CRdStr(RF522_ADDR, FIFODataReg, pOutData, n);
}
}
else
{
status = MI_ERR;
}
}
SetBitMask(ControlReg, 0x80);//stop timer now
WriteRawRC(CommandReg, PCD_IDLE);
return status;
}
/
//功 ? ?能:尋卡
//參數說明: req_code[IN]:尋卡方式
// ? ? ? ? ? ? ? ?0x52 = 尋感應區內所有符合14443A標準的卡
// ? ? ? ? ? ? ? ?0x26 = 尋未進入休眠狀態的卡
// ? ? ? ? ?pTagType[OUT]:卡片類型代碼
// ? ? ? ? ? ? ? ?0x4400 = Mifare_UltraLight
// ? ? ? ? ? ? ? ?0x0400 = Mifare_One(S50)
// ? ? ? ? ? ? ? ?0x0200 = Mifare_One(S70)
// ? ? ? ? ? ? ? ?0x0800 = Mifare_Pro(X)
// ? ? ? ? ? ? ? ?0x4403 = Mifare_DESFire
//返 ? ?回: 成功返回MI_OK
/
char PcdRequest(unsigned char req_code, unsigned char *pTagType)
{
char status; ?
unsigned int unLen;
unsigned char ucComMF522Buf[MAXRLEN];?
ClearBitMask(Status2Reg, 0x08);
WriteRawRC(BitFramingReg, 0x07);
SetBitMask(TxControlReg, 0x03);
ucComMF522Buf[0] = req_code;
status = PcdComMF522(PCD_TRANSCEIVE, ucComMF522Buf, 1, ucComMF522Buf, &unLen);
if((status == MI_OK) && (unLen == 0x10))
{ ? ?
*pTagType ? ? = ucComMF522Buf[0];
*(pTagType+1) = ucComMF522Buf[1];
}
else
{ ??
status = MI_ERR; ??
}
return status;
}
/
//功 ? ?能:防沖撞
//參數說明: pSnr[OUT]:卡片序列號,4字節
//返 ? ?回: 成功返回MI_OK
/ ?
char PcdAnticoll(unsigned char *pSnr)
{
? ? char status;
? ? unsigned char i, snr_check=0;
? ? unsigned int ?unLen;
? ? unsigned char ucComMF522Buf[MAXRLEN]; ??
? ? ClearBitMask(Status2Reg, 0x08);
? ? WriteRawRC(BitFramingReg, 0x00);
? ? ClearBitMask(CollReg, 0x80);
?
? ? ucComMF522Buf[0] = PICC_ANTICOLL1;
? ? ucComMF522Buf[1] = 0x20;
? ? status = PcdComMF522(PCD_TRANSCEIVE, ucComMF522Buf, 2, ucComMF522Buf, &unLen);
? ? if(status == MI_OK)
? ? {
? ? for(i=0; i<4; i++)
? ? ? ? ?{ ??
? ? ? ? ? ? ?*(pSnr+i) ?= ucComMF522Buf[i];
? ? ? ? ? ? ?snr_check ^= ucComMF522Buf[i];
? ? ? ? ?}
? ? ? ? ?if(snr_check != ucComMF522Buf[i])
? ? ? ? ?{
? ? ? ? status = MI_ERR;
? ? ? ? ?}
? ? }
? ??
? ? SetBitMask(CollReg, 0x80);
? ? return status;
}
/
//功 ? ?能:選定卡片
//參數說明: pSnr[IN]:卡片序列號,4字節
//返 ? ?回: 成功返回MI_OK
/
char PcdSelect(unsigned char *pSnr)
{
? ? char status;
? ? unsigned char i;
? ? unsigned int unLen;
? ? unsigned char ucComMF522Buf[MAXRLEN];?
? ??
? ? ucComMF522Buf[0] = PICC_ANTICOLL1;
? ? ucComMF522Buf[1] = 0x70;
? ? ucComMF522Buf[6] = 0;
? ? for(i=0; i<4; i++)
? ? {
? ? ucComMF522Buf[i+2] = *(pSnr+i);
? ? ucComMF522Buf[6] ?^= *(pSnr+i);
? ? }
? ? CalulateCRC(ucComMF522Buf, 7, &ucComMF522Buf[7]);
??
? ? ClearBitMask(Status2Reg, 0x08);
? ? status = PcdComMF522(PCD_TRANSCEIVE, ucComMF522Buf, 9, ucComMF522Buf, &unLen);
? ??
? ? if((status == MI_OK) && (unLen == 0x18))
? ? { ??
status = MI_OK; ?
}
? ? else
? ? { ??
status = MI_ERR; ? ?
}
? ? return status;
}
/
//功 ? ?能:驗證卡片密碼
//參數說明: auth_mode[IN]: 密碼驗證模式
// ? ? ? ? ? ? ? ? 0x60 = 驗證A密鑰
// ? ? ? ? ? ? ? ? 0x61 = 驗證B密鑰?
// ? ? ? ? ?addr[IN]:塊地址
// ? ? ? ? ?pKey[IN]:密碼
// ? ? ? ? ?pSnr[IN]:卡片序列號,4字節
//返 ? ?回: 成功返回MI_OK
/ ? ? ? ? ? ? ??
char PcdAuthState(unsigned char auth_mode, unsigned char addr, unsigned char *pKey, unsigned char *pSnr)
{
? ? char status;
? ? unsigned int unLen;
? ? unsigned char i, ucComMF522Buf[MAXRLEN];
? ? ucComMF522Buf[0] = auth_mode;
? ? ucComMF522Buf[1] = addr;
? ? for(i=0; i<6; i++)
? ? { ? ?
ucComMF522Buf[i+2] = *(pKey+i); ??
}
? ? //for (i=0; i<6; i++)//error?
? ? for(i=0; i<4; i++)
? ? { ? ?
ucComMF522Buf[i+8] = *(pSnr+i); ??
}
//memcpy(&ucComMF522Buf[2], pKey, 6);?
//memcpy(&ucComMF522Buf[8], pSnr, 4);?
? ??
? ? status = PcdComMF522(PCD_AUTHENT, ucComMF522Buf, 12, ucComMF522Buf, &unLen);
? ? if( (status != MI_OK) || (!(ReadRawRC(Status2Reg) & 0x08)) )
? ? { ??
status = MI_ERR; ??
}
? ??
? ? return status;
}
/
//功 ? ?能:讀取M1卡一塊數據
//參數說明: addr[IN]:塊地址
// ? ? ? ? ?pData[OUT]:讀出的數據,16字節
//返 ? ?回: 成功返回MI_OK
/?
char PcdRead(unsigned char addr, unsigned char *pData)
{
? ? char status;
? ? unsigned int ?unLen;
? ? unsigned char i, ucComMF522Buf[MAXRLEN];
? ? ucComMF522Buf[0] = PICC_READ;
? ? ucComMF522Buf[1] = addr;
? ? CalulateCRC(ucComMF522Buf, 2, &ucComMF522Buf[2]);
? ?
? ? status = PcdComMF522(PCD_TRANSCEIVE, ucComMF522Buf, 4, ucComMF522Buf, &unLen);
? ? if((status == MI_OK) && (unLen == 0x90))
? ? {
? ? ? ? for(i=0; i<16; i++)
? ? ? ? { ? ?
*(pData+i) = ucComMF522Buf[i]; ??
}
? ? }
? ? else
? ? { ??
status = MI_ERR; ??
}
? ??
? ? return status;
}
/
//功 ? ?能:寫數據到M1卡一塊
//參數說明: addr[IN]:塊地址
// ? ? ? ? ?pData[IN]:寫入的數據,16字節
//返 ? ?回: 成功返回MI_OK
/ ? ? ? ? ? ? ? ? ?
char PcdWrite(unsigned char addr, unsigned char *pData)
{
? ? char status;
? ? unsigned int ?unLen;
? ? unsigned char i,ucComMF522Buf[MAXRLEN];?
? ??
? ? ucComMF522Buf[0] = PICC_WRITE;
? ? ucComMF522Buf[1] = addr;
? ? CalulateCRC(ucComMF522Buf, 2, &ucComMF522Buf[2]);
?
? ? status = PcdComMF522(PCD_TRANSCEIVE, ucComMF522Buf, 4, ucComMF522Buf, &unLen);
? ? if((status != MI_OK) || (unLen != 4) || ((ucComMF522Buf[0] & 0x0F) != 0x0A))
? ? { ??
status = MI_ERR; ??
}
? ? ? ??
? ? if(status == MI_OK)
? ? {
? ? ? ? for(i=0; i<16; i++)
? ? ? ? { ? ?
ucComMF522Buf[i] = *(pData+i); ??
}
? ? ? ? CalulateCRC(ucComMF522Buf, 16, &ucComMF522Buf[16]);
? ? ? ? status = PcdComMF522(PCD_TRANSCEIVE, ucComMF522Buf, 18, ucComMF522Buf, &unLen);
? ? ? ? if((status != MI_OK) || (unLen != 4) || ((ucComMF522Buf[0] & 0x0F) != 0x0A))
? ? ? ? { ??
status = MI_ERR; ??
}
? ? }
? ??
? ? return status;
}
/
//功 ? ?能:扣款和充值
//參數說明: dd_mode[IN]:命令字
// ? ? ? ? ? ? ? 0xC0 = 扣款
// ? ? ? ? ? ? ? 0xC1 = 充值
// ? ? ? ? ?addr[IN]:錢包地址
// ? ? ? ? ?pValue[IN]:4字節增(減)值,低位在前
//返 ? ?回: 成功返回MI_OK
/ ? ? ? ? ? ? ? ??
char PcdValue(unsigned char dd_mode,unsigned char addr,unsigned char *pValue)
{
? ? char status;
? ? unsigned int unLen;
? ? unsigned char i, ucComMF522Buf[MAXRLEN];
? ??
? ? ucComMF522Buf[0] = dd_mode;
? ? ucComMF522Buf[1] = addr;
? ? CalulateCRC(ucComMF522Buf, 2, &ucComMF522Buf[2]);
?
? ? status = PcdComMF522(PCD_TRANSCEIVE, ucComMF522Buf, 4, ucComMF522Buf, &unLen);
? ? if((status != MI_OK) || (unLen != 4) || ((ucComMF522Buf[0] & 0x0F) != 0x0A))
? ? { ??
status = MI_ERR; ??
}
? ? ? ??
? ? if(status == MI_OK)
? ? {
? ? ? ? for(i=0; i<16; i++)
? ? ? ? { ? ?
ucComMF522Buf[i] = *(pValue+i); ??
}
? ? ? ? CalulateCRC(ucComMF522Buf, 4, &ucComMF522Buf[4]);
? ? ? ? unLen = 0;
? ? ? ? status = PcdComMF522(PCD_TRANSCEIVE, ucComMF522Buf, 6, ucComMF522Buf, &unLen);
? ? ? ? if (status != MI_ERR)
? ? ? ? { ? ?
status = MI_OK; ? ?
}
? ? }
? ??
? ? if(status == MI_OK)
? ? {
? ? ? ? ucComMF522Buf[0] = PICC_TRANSFER;
? ? ? ? ucComMF522Buf[1] = addr;
? ? ? ? CalulateCRC(ucComMF522Buf, 2, &ucComMF522Buf[2]);
? ?
? ? ? ? status = PcdComMF522(PCD_TRANSCEIVE, ucComMF522Buf, 4, ucComMF522Buf, &unLen);
? ? ? ? if((status != MI_OK) || (unLen != 4) || ((ucComMF522Buf[0] & 0x0F) != 0x0A))
? ? ? ? { ??
status = MI_ERR; ??
}
? ? }
? ? return status;
}
/
//功 ? ?能:備份錢包
//參數說明: sourceaddr[IN]:源地址
// ? ? ? ? ?goaladdr[IN]:目標地址
//返 ? ?回: 成功返回MI_OK
/
char PcdBakValue(unsigned char sourceaddr, unsigned char goaladdr)
{
? ? char status;
? ? unsigned int unLen;
? ? unsigned char ucComMF522Buf[MAXRLEN];?
? ? ucComMF522Buf[0] = PICC_RESTORE;
? ? ucComMF522Buf[1] = sourceaddr;
? ? CalulateCRC(ucComMF522Buf, 2, &ucComMF522Buf[2]);
?
? ? status = PcdComMF522(PCD_TRANSCEIVE, ucComMF522Buf, 4, ucComMF522Buf, &unLen);
? ? if((status != MI_OK) || (unLen != 4) || ((ucComMF522Buf[0] & 0x0F) != 0x0A))
? ? { ??
status = MI_ERR; ??
}
? ??
? ? if(status == MI_OK)
? ? {
? ? ? ? ucComMF522Buf[0] = 0;
? ? ? ? ucComMF522Buf[1] = 0;
? ? ? ? ucComMF522Buf[2] = 0;
? ? ? ? ucComMF522Buf[3] = 0;
? ? ? ? CalulateCRC(ucComMF522Buf, 4, &ucComMF522Buf[4]);
?
? ? ? ? status = PcdComMF522(PCD_TRANSCEIVE, ucComMF522Buf, 6, ucComMF522Buf, &unLen);
? ? ? ? if(status != MI_ERR)
? ? ? ? { ? ?
status = MI_OK; ? ?
}
? ? }
? ??
? ? if(status != MI_OK)
? ? { ? ?
return MI_ERR; ??
}
? ??
? ? ucComMF522Buf[0] = PICC_TRANSFER;
? ? ucComMF522Buf[1] = goaladdr;
? ? CalulateCRC(ucComMF522Buf, 2, &ucComMF522Buf[2]);
?
? ? status = PcdComMF522(PCD_TRANSCEIVE, ucComMF522Buf, 4, ucComMF522Buf, &unLen);
? ? if((status != MI_OK) || (unLen != 4) || ((ucComMF522Buf[0] & 0x0F) != 0x0A))
? ? { ??
status = MI_ERR; ??
}
? ? return status;
}
void InitializeSystem()
{
}
void DoorRc522Start(void)
{ ? ? ?
if(ReadRC522Status())
//if(1)
{
InitializeSystem( );
PcdReset();
PcdAntennaOff();
PcdAntennaOn(); ? ? ?
M500PcdConfigISOType('A');
Rc522StartFlag = 1;
}
else
{
Rc522StartFlag=0;?
}
}
unsigned char g_ucTempbuf[20];
void DoorRc522Test(void)
{
unsigned char i;
unsigned char status;
InitializeSystem( );
PcdReset();
PcdAntennaOff();
PcdAntennaOn();
M500PcdConfigISOType('A');
while(1)
{
status = PcdRequest(PICC_REQALL, g_ucTempbuf);
if(status != MI_OK)
{
continue;
}
status = PcdAnticoll(g_ucTempbuf);
if(status != MI_OK)
{
continue;
}
//DOOR_PRINT("\n");
for(i=0; i<4; i++)
{
//DOOR_PRINT("%02x ", g_ucTempbuf[i]);
}
//DOOR_PRINT("\n");
status = PcdSelect(g_ucTempbuf);
if(status != MI_OK)
{
continue;
}
/*
status = PcdAuthState(PICC_AUTHENT1A, 1, DefaultKey, g_ucTempbuf);
if(status != MI_OK)
{
continue;
}
status = PcdWrite(1, data1);
if(status != MI_OK)
{
continue;
}
status = PcdValue(PICC_DECREMENT, 1, data2);
if(status != MI_OK)
{
continue;
}
status = PcdBakValue(1, 2);
if(status != MI_OK)
{
continue;
}
status = PcdRead(2, g_ucTempbuf);
if(status != MI_OK)
{
continue;
}
*/
PcdHalt();
}
}
void DoorRc522Test1(void)
{
unsigned char i;
unsigned char status;
status = PcdRequest(PICC_REQALL, g_ucTempbuf);
if(status != MI_OK)
{
return;
}
status = PcdAnticoll(g_ucTempbuf);
if(status != MI_OK)
{
return;
}
//DOOR_PRINT("\n");
//DOOR_PRINT("mifare card:\n");
for(i=0; i<4; i++)
{
//DOOR_PRINT("%02x ", g_ucTempbuf[i]);
}
//DOOR_PRINT("\n");
status = PcdSelect(g_ucTempbuf);
if(status != MI_OK)
{
return;
}
PcdHalt();
}
static unsigned char DoorRc522ReadCardSub(unsigned char *serialNum)
{
unsigned char i;
unsigned char status;
//status = PcdRequest(PICC_REQALL, serialNum);
status = PcdRequest(PICC_REQIDL, serialNum);
if(status != MI_OK)
{
return 0;
}
status = PcdAnticoll(serialNum);
if(status != MI_OK)
{
return 0;
}
status = PcdSelect(serialNum);
if(status != MI_OK)
{
return 0;
}
PcdHalt();
? ? /*
DOOR_PRINT("\n");
DOOR_PRINT("mifare card:\n");
for(i=0; i<4; i++)
{
DOOR_PRINT("%02x ", serialNum[i]);
}
DOOR_PRINT("\n");*/
return 1;
}
static U8 DoorRdIcErrCnt = 100;
unsigned char DoorRc522ReadCard(void)
{
U8 ret;
U8 serialNumber[8];
? ? U8 UID[4];
///*
? ? if(Rc522Time < 10)
? ? {
? ? ? ? return; ??
? ? }
? ? Rc522Time = 0;
if(Rc522StartFlag == 0)
{
return 0;
}
//*/
PcdReset();
? ? M500PcdConfigISOType('A');
ret = DoorRc522ReadCardSub(serialNumber);?
? ? //PcdHalt();
? ? DoorRf522RstIoLow();
if(ret == 1)
{
if(DoorRdIcErrCnt >= 3)
{
? ? DoorRdIcErrCnt = 0x00;
//LightOnlyTipsMode2();
//VoiceOnlyTipsMode2();
memcpy(UID,serialNumber,4);
CarNoMsg(UID);
//DoorRs485SetNewSerialNumber(serialNumber);
return 1;
}
}
else
{
//printf("err22...\n");
if(DoorRdIcErrCnt < 0xff)
{
DoorRdIcErrCnt++;
}
return 0;
} ? ?
return 0;
}
void RC522TimeCnt(void)
{
Rc522Time++;
}
u8 ReadRC522Status(void)
{
u8 status;
DoorRf522RstIoHigh();
DoorUnit10UsDelay(10);?
DoorRf522RstIoLow();
DoorUnit10UsDelay(10);?
DoorRf522RstIoHigh();
DoorUnit10UsDelay(10);
status = ReadRawRC(0x07);
if(0x21 == status)
return 1;
return 0;
}
/*----------------------------------------------------------------------------*/
總結
以上是生活随笔為你收集整理的ST17H26对接RC522读IC卡的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: ST17H26读ID卡调试过程
- 下一篇: ST17H26的PWM模块