RC522写数据问题
我用RC522与S50卡做个系统,卡是与其它系统共用,目前复位、设置、寻卡、防冲撞、选定卡片、密码A认证、读数据步骤以通过,但写数据没有通过。资料上写,写入数据成功后返回0x0A(1010),但我的系统返回0x05。
读块3中的控制码为 7F 07 88 FF。
控制码:7F 07 88 FF 高4位 低4位 块3 011 011
字节6 7F = 01111111 C2 1000 C1 0000块2 000 000
字节7 07 = 00000111 C1 0000 C3 1000块1 000 000
字节8 88 = 10001000 C3 1000 C2 1000块0 000 000
块3-0 块3-0
从控制码分析,块0--块2应该是密码A认证后可对0--2块读写。
不知为什么写不进去,那位高手能帮帮我,先谢谢了。 检查你的写函数是否有BUG;
用成品读卡器测试卡片读写是否正常,密码是否对头;
卡片出厂时初始密码一般为6个0xff; 首先谢谢您(2楼),写函数
char PcdWrite(unsigned char addr,unsigned char *pData)
{
char status;
unsigned intunLen;
unsigned char i,ucComMF522Buf;
ucComMF522Buf = PICC_WRITE;
ucComMF522Buf = addr;
CalulateCRC(ucComMF522Buf,2,&ucComMF522Buf);
status = PcdComMF522(PCD_TRANSCEIVE,ucComMF522Buf,4,ucComMF522Buf,&unLen);
if ((status != MI_OK) || (unLen != 4) || ((ucComMF522Buf & 0x0F) != 0x0A)){
status = (char)MI_ERR;
}
if (status == MI_OK){
for (i=0; i<16; i++){
ucComMF522Buf = *(pData+i);
}
CalulateCRC(ucComMF522Buf,16,&ucComMF522Buf);
status = PcdComMF522(PCD_TRANSCEIVE,ucComMF522Buf,18,ucComMF522Buf,&unLen);
if ((status != MI_OK) || (unLen != 4) || ((ucComMF522Buf & 0x0F) != 0x0A)){
{ status = (char)MI_ERR; }
}
}
return(status);
}
1、我想网上的大部分都是这个。
2、成品读卡器读写没问题,试过了。
3、卡是与其它系统共用,密码以认证,没有认证数据也读不出来呀。
4、我猜想是不是初始化设置的问题,有那位高手有好用的初始化设置代码上传一个,我对比看看。
我的
char PcdReset(void)
{
unsigned char i;
RST522_1();
_NOP();
RST522_0();
_NOP();
RST522_1();
_NOP();
WriteRawRC(CommandReg,PCD_RESETPHASE); //软件复位
for(i=0;i<120;i++){
;
}
WriteRawRC(ModeReg,0x3D);//定义发送和接收常用模式 和Mifare卡通讯,CRC初始值0x6363
WriteRawRC(TReloadRegL,30);//16位定时器低位 30
WriteRawRC(TReloadRegH,0);//16位定时器高位
WriteRawRC(TModeReg,0x8D);//定义内部定时器的设置
WriteRawRC(TPrescalerReg,0x3E);//设置定时器分频系数
WriteRawRC(TxAutoReg,0x40); //调制发送信号为100%ASK
return(MI_OK);
}
//////////////////////////////////////////////////////////////////////
//设置RC632的工作方式
//////////////////////////////////////////////////////////////////////
char M500PcdConfigISOType(unsigned char type)
{
if (type == 'A') //ISO14443_A
{
//ISO14443_A
ClearBitMask(Status2Reg,0x08);
WriteRawRC(ModeReg,0x3d);//3F
WriteRawRC(RxSelReg,0x86);//84
WriteRawRC(RFCfgReg,0x4F); //4F 接收器增益4F = 33dB; 7F = 48dB
WriteRawRC(TReloadRegL,30);
WriteRawRC(TReloadRegH,0);
WriteRawRC(TModeReg,0x8D);
WriteRawRC(TPrescalerReg,0x3E);
WriteRawRC(TxAutoReg,0x40); //调制发送信号为100%ASK
Delay(1);
PcdAntennaOn();
}
else
{ return((char)MI_NOTAGERR); }
return(MI_OK);
}
char PcdReset(void)
{
RC522RST=1;
delay_cycles(50);
RC522RST=0;//硬件复位
delay_cycles(50);
RC522RST=1;
delay_cycles(50);
WriteRawRC(CommandReg,PCD_RESETPHASE);//复位
WriteRawRC(ModeReg,0x3D); //和Mifare卡通讯
WriteRawRC(TReloadRegL,30);
WriteRawRC(TReloadRegH,0);
WriteRawRC(TModeReg,0x8D);
WriteRawRC(TPrescalerReg,0x3E);
WriteRawRC(TxAutoReg,0x40);//必须要
return MI_OK;
}
char M500PcdConfigISOType(unsigned char type)
{
if (type == 'A'){ //ISO14443_A
ClearBitMask(Status2Reg,0x08);
WriteRawRC(ModeReg,0x3D);//3F
WriteRawRC(RxSelReg,0x86);//84
WriteRawRC(RFCfgReg,0x7F); //4F
WriteRawRC(TReloadRegL,30);//
WriteRawRC(TReloadRegH,0);
WriteRawRC(TModeReg,0x8D);
WriteRawRC(TPrescalerReg,0x3E);
delay_us(100);
PcdAntennaOn();
}
else{
return -1;
}
return MI_OK;
}
谢谢4楼的代码,基本差不多,只有设置增益有差别,我的天线增益设0x4F时效果最好,距离可达6厘米。其它值也试过,距离和效果都不好,也没能解决写入数据的问题。我这个天线其它系统也在用应该没问题。 真是搞不懂了,能读却不能写,愁呀!!! 写之前再验证一次密钥了吧?我以前遇到的情况如果读后接着写,似乎不行,再验证一次就行了。
另外,返回05表示invalid frame format,可以把对status的判断去掉,直接写看看能否写进去,因为或许跟你的底层通讯接口收发有关联,尤其是用硬件接口时。
仅供参考。 问题解决了,多亏7楼提醒“返回05表示invalid frame format”,我的SPI接口是用软件模拟的SCK时钟的占空比不是1:1,高电平窄,低电平宽。没想到设置、寻卡、防冲撞、选定卡片、密码A认证、读数据居然通过了。我将高电平加宽,写入成功。谢谢7楼的yirongfu。我给30分。 我是新人,我的资料中显示有45分,我想给您30分,但是给不出来,只能填写15分,不知为什么。 问题解决了,多亏7楼提醒“返回05表示invalid frame format”,我的SPI接口是用软件模拟的SCK时钟的占空比不是1:1,高电平窄,低电平宽。没想到设置、寻卡、防冲撞、选定卡片、密码A认证、读数据居然通过了。我将高 ...
ospic 发表于 2012-11-8 13:59 https://bbs.21ic.com/images/common/back.gif
呵呵,很高兴能帮到你,调试接口是挺熬人的过程,我深有体会:) 我是新人,我的资料中显示有45分,我想给您30分,但是给不出来,只能填写15分,不知为什么。
ospic 发表于 2012-11-8 14:10 https://bbs.21ic.com/images/common/back.gif
因为您发帖时给的总分是20分,给2楼5分,所以就只剩15分了,呵呵,没事 噢,明白了,想多加分也不行。也不能让2楼的白忙活呀。以后有机会给您补上,在次感谢了。 有自己硬件设计RC522的经验不?我现在自己手工焊接了一个RC522模块,能测到13.56MHz的信号,但是比买的模块电压幅值小一点(80%左右),可是单片机读不出数据,用买的模块就OK,其他的部分没区别。。 我也遇到相同的問題,baud rate調整好後就正常了,
新的問題是,我買了張UID卡回來,block0無法寫入,返回 0x04
但是寫其他 block正常,不知哪位大俠有遇到過相同問題,求解~ vd5678 发表于 2013-12-6 18:56 static/image/common/back.gif
我也遇到相同的問題,baud rate調整好後就正常了,
新的問題是,我買了張UID卡回來,block0無法寫入,返回...
块0 是专用的 不能更改 多谢楼上 提醒 我的也解决 陈导511322 发表于 2014-4-7 11:14 static/image/common/back.gif
块0 是专用的 不能更改
有一种扇区0也可以修改的卡,调来调去就是写不进,求支招 UID卡0块写操作,群里有没有懂的,求指导!! 请问楼主,最近在做RC522的项目,因为没有NSS片选引脚,那么发送数据n帧数据的时候怎么才能表示当前帧为最后一帧?也就是在发送该帧之后可以开始向新的地址发送数据? 楼主,求代码,我现在选卡过程出现错误,找不到问题,郁闷中......
页:
[1]
2