RC523读身份证UID问题
录入:edatop.com 阅读:
我读身份证id第一步就不能通过,
寄存器配置如下:
ClearBitMask(Status2Reg, 0x08);
//write_reg(ControlReg, 0x10);
write_reg(ModeReg, 0x3F); //0x3f // For 0xFFFF crc
write_reg(TReloadRegL, 30);
write_reg(TReloadRegH, 0);
write_reg(TModeReg, 0x8D);
write_reg(TPrescalerReg, 0x3E);
write_reg(TxASKReg, 0); // Force 100ASK = 0
// ------------------------- 发送部分设置 ------------------------------
write_reg(GsNReg, 0xF8); // TX输出电导设置
write_reg(CWGsCfgReg, 0x3F);
write_reg(ModGsCfgReg, 0x08); //0x0F // 调制指数设置RegModGsp,, TYPEB ModConductance 0x1A
write_reg(TxModeReg, 0x03); // 编码器设置,106kbps,14443B
write_reg(BitFramingReg, 0x00); // 调制脉宽,0x13->2.95us RegTypeBFraming ,,TYPEB
write_reg(AutoTestReg, 0x00);
// ------------------------- 接收部分设置 ------------------------------
// 低二位为接收增益,
// 00,10,20,30,40,50,60,70
// 18,23,18,23,33,38,43,48dB
write_reg(RFCfgReg, 0x70); //0x73 // 0x59 RegRxControl1//73,
write_reg(RxModeReg, 0x03); // 解码器设置,,106kbps,14443B
write_reg(RxThresholdReg, 0x75); //0x75 // 高四位->最小信号强度,低三位->冲突最小信号强度,最大0xF7
// ------------------------- TYPEB特征参数设定 -------------------------
ClearBitMask(RxSelReg,0x3F); // TR0
SetBitMask(RxSelReg, 0x08);
ClearBitMask(TxModeReg, 0x80); // 无CRC,无奇偶校验
ClearBitMask(RxModeReg, 0x80);
ClearBitMask(Status2Reg, 0x08); // MFCrypto1On =0
// ------------------------- 天线开关设置 ------------------------------
Antenna(RC_ANTENNA_OFF);
Delay(10);
Antenna(RC_ANTENNA_ON);
寻卡过程如下:
buf[0] = 0x05;
buf[1] = 0x00;
buf[2] = 0x00;
buf[3] = 0x71; // crc
buf[4] = 0xFF;
// CalulateCRC(buf, 3, &buf[3]);
status = PcdComMF522(PCD_TRANSCEIVE, buf, 5, buf, &len);
//******************************************************************/
//功 能:通过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 ;
u8 errreg=0;
switch (Command)
{
case PCD_AUTHENT:
irqEn = 0x12 ;
waitFor = 0x10 ;
break ;
case PCD_TRANSCEIVE:
irqEn = 0x77 ;
waitFor = 0x30 ;
break ;
default:
break ;
}
write_reg(ComIEnReg,irqEn|0x80) ; //
ClearBitMask(ComIrqReg,0x80) ;
write_reg(CommandReg,PCD_IDLE) ;
SetBitMask(FIFOLevelReg,0x80) ; // 清空FIFO
for(i=0; i<InLenByte; i++)
write_reg(FIFODataReg,pInData) ; // 数据写入FIFO
write_reg(CommandReg, Command) ; // 命令写入命令寄存器
if(Command == PCD_TRANSCEIVE)
SetBitMask(BitFramingReg,0x80) ; // 开始发送
i = 6000 ; //根据时钟频率调整,操作M1卡最大等待时间25ms
do
{
n = read_reg(ComIrqReg) ;
i-- ;
}
while((i!=0)&&!(n&0x01)&&!(n&waitFor)) ;
ClearBitMask(BitFramingReg,0x80) ;
if(i!=0)
{
errreg = read_reg(ErrorReg);
printf("read_reg(ErrorReg):0x%x\r\n",errreg);
if(!(errreg&0x1B))
{
status = MI_OK ;
if (n&irqEn&0x01)
status = MI_NOTAGERR ;
if(Command==PCD_TRANSCEIVE)
{
n = read_reg(FIFOLevelReg) ;
lastBits = read_reg(ControlReg)&0x07 ;
if(lastBits)
*pOutLenBit = (n-1)*8 + lastBits ;
else
*pOutLenBit = n*8 ;
if(n==0)
n = 1 ;
if(n>MAXRLEN)
n = MAXRLEN ;
for (i=0; i<n; i++)
pOutData = read_reg(FIFODataReg) ;
}
}
else
status = MI_ERR ;
}
SetBitMask(ControlReg,0x80) ;// stop timer now
write_reg(CommandReg,PCD_IDLE) ;
return status;
}
一直无法识别身份证,有没有哪位大神可以指导下,谢谢
寄存器配置如下:
ClearBitMask(Status2Reg, 0x08);
//write_reg(ControlReg, 0x10);
write_reg(ModeReg, 0x3F); //0x3f // For 0xFFFF crc
write_reg(TReloadRegL, 30);
write_reg(TReloadRegH, 0);
write_reg(TModeReg, 0x8D);
write_reg(TPrescalerReg, 0x3E);
write_reg(TxASKReg, 0); // Force 100ASK = 0
// ------------------------- 发送部分设置 ------------------------------
write_reg(GsNReg, 0xF8); // TX输出电导设置
write_reg(CWGsCfgReg, 0x3F);
write_reg(ModGsCfgReg, 0x08); //0x0F // 调制指数设置RegModGsp,, TYPEB ModConductance 0x1A
write_reg(TxModeReg, 0x03); // 编码器设置,106kbps,14443B
write_reg(BitFramingReg, 0x00); // 调制脉宽,0x13->2.95us RegTypeBFraming ,,TYPEB
write_reg(AutoTestReg, 0x00);
// ------------------------- 接收部分设置 ------------------------------
// 低二位为接收增益,
// 00,10,20,30,40,50,60,70
// 18,23,18,23,33,38,43,48dB
write_reg(RFCfgReg, 0x70); //0x73 // 0x59 RegRxControl1//73,
write_reg(RxModeReg, 0x03); // 解码器设置,,106kbps,14443B
write_reg(RxThresholdReg, 0x75); //0x75 // 高四位->最小信号强度,低三位->冲突最小信号强度,最大0xF7
// ------------------------- TYPEB特征参数设定 -------------------------
ClearBitMask(RxSelReg,0x3F); // TR0
SetBitMask(RxSelReg, 0x08);
ClearBitMask(TxModeReg, 0x80); // 无CRC,无奇偶校验
ClearBitMask(RxModeReg, 0x80);
ClearBitMask(Status2Reg, 0x08); // MFCrypto1On =0
// ------------------------- 天线开关设置 ------------------------------
Antenna(RC_ANTENNA_OFF);
Delay(10);
Antenna(RC_ANTENNA_ON);
寻卡过程如下:
buf[0] = 0x05;
buf[1] = 0x00;
buf[2] = 0x00;
buf[3] = 0x71; // crc
buf[4] = 0xFF;
// CalulateCRC(buf, 3, &buf[3]);
status = PcdComMF522(PCD_TRANSCEIVE, buf, 5, buf, &len);
//******************************************************************/
//功 能:通过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 ;
u8 errreg=0;
switch (Command)
{
case PCD_AUTHENT:
irqEn = 0x12 ;
waitFor = 0x10 ;
break ;
case PCD_TRANSCEIVE:
irqEn = 0x77 ;
waitFor = 0x30 ;
break ;
default:
break ;
}
write_reg(ComIEnReg,irqEn|0x80) ; //
ClearBitMask(ComIrqReg,0x80) ;
write_reg(CommandReg,PCD_IDLE) ;
SetBitMask(FIFOLevelReg,0x80) ; // 清空FIFO
for(i=0; i<InLenByte; i++)
write_reg(FIFODataReg,pInData) ; // 数据写入FIFO
write_reg(CommandReg, Command) ; // 命令写入命令寄存器
if(Command == PCD_TRANSCEIVE)
SetBitMask(BitFramingReg,0x80) ; // 开始发送
i = 6000 ; //根据时钟频率调整,操作M1卡最大等待时间25ms
do
{
n = read_reg(ComIrqReg) ;
i-- ;
}
while((i!=0)&&!(n&0x01)&&!(n&waitFor)) ;
ClearBitMask(BitFramingReg,0x80) ;
if(i!=0)
{
errreg = read_reg(ErrorReg);
printf("read_reg(ErrorReg):0x%x\r\n",errreg);
if(!(errreg&0x1B))
{
status = MI_OK ;
if (n&irqEn&0x01)
status = MI_NOTAGERR ;
if(Command==PCD_TRANSCEIVE)
{
n = read_reg(FIFOLevelReg) ;
lastBits = read_reg(ControlReg)&0x07 ;
if(lastBits)
*pOutLenBit = (n-1)*8 + lastBits ;
else
*pOutLenBit = n*8 ;
if(n==0)
n = 1 ;
if(n>MAXRLEN)
n = MAXRLEN ;
for (i=0; i<n; i++)
pOutData = read_reg(FIFODataReg) ;
}
}
else
status = MI_ERR ;
}
SetBitMask(ControlReg,0x80) ;// stop timer now
write_reg(CommandReg,PCD_IDLE) ;
return status;
}
一直无法识别身份证,有没有哪位大神可以指导下,谢谢
读s50卡倒是没问题
我也是 ,返回值不对,你解决了吗
申明:网友回复良莠不齐,仅供参考。如需专业解答,请学习本站推出的微波射频专业培训课程。
上一篇:天线的增益从何而来
下一篇:si4463同步字配置问题