完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
///////////////////////////////////////////////////////////////////// //功 能:通过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);
for (i=0; i { WriteRawRC(FIFODataReg, pInData); } 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)); //有(i!=0)1.3ms就跳出去了,!(n&0x01)定时器 24.5ms的跳出有什么用? 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; //为什么缓冲区没内容n要等于1? } if (n > MAXRLEN) { n = MAXRLEN; //为什么超过18个字节就读18个? } for (i=0; i { pOutData = ReadRawRC(FIFODataReg); } } } else { status = MI_ERR; }
}
SetBitMask(ControlReg,0x80); // stop timer now WriteRawRC(CommandReg,PCD_IDLE); 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; snr_check ^= ucComMF522Buf; } if (snr_check != ucComMF522Buf) { status = MI_ERR; } }
SetBitMask(CollReg,0x80); 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 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) { memcpy(ucComMF522Buf, pData, 16); CalulateCRC(ucComMF522Buf,16,&ucComMF522Buf[16]);
status = PcdComMF522(PCD_TRANSCEIVE,ucComMF522Buf,18,ucComMF522Buf,&unLen);// 发送18字节为什么返回四位? if ((status != MI_OK) || (unLen != 4) || ((ucComMF522Buf[0] & 0x0F) != 0x0A))//((ucComMF522Buf[0] & 0x0F) != 0x0A)是判断什么的? { status = MI_ERR; } }
return status; }
///////////////////////////////////////////////////////////////////// //功 能:命令卡片进入休眠状态 //返 回: 成功返回MI_OK ///////////////////////////////////////////////////////////////////// char PcdHalt(void) { char status; unsigned int unLen; unsigned char ucComMF522Buf[MAXRLEN];
ucComMF522Buf[0] = PICC_HALT; ucComMF522Buf[1] = 0; //这个地方是什么意思?好像不是NVB. CalulateCRC(ucComMF522Buf,2,&ucComMF522Buf[2]);
status = PcdComMF522(PCD_TRANSCEIVE,ucComMF522Buf,4,ucComMF522Buf,&unLen);
return status; } ///////////////////////////////////////////////////////////////////// //功 能:复位RC522 //返 回: 成功返回MI_OK ///////////////////////////////////////////////////////////////////// char PcdReset(void) { SET_RC522RST; delay_ns(10); CLR_RC522RST; delay_ns(10); SET_RC522RST; delay_ns(10); WriteRawRC(CommandReg,PCD_RESETPHASE);
delay_ns(100);
WriteRawRC(ModeReg,0x3D); //和Mifare卡通讯,CRC初始值0x6363这里设置为0x0000可以吗? WriteRawRC(TReloadRegL,30); WriteRawRC(TReloadRegH,0); WriteRawRC(TModeReg,0x8D); WriteRawRC(TPrescalerReg,0x3E); WriteRawRC(TxAutoReg,0x40);
return MI_OK; } |
|
相关推荐
4个回答
|
|
本帖最后由 lsn112233 于 2018-4-28 09:32 编辑
有没有人帮帮我,问题就在程序后面的注释上!像 WriteRawRC(BitFramingReg,0x00); //这条指令的作用是什么?
ucComMF522Buf[0] = PICC_HALT; ucComMF522Buf[1] = 0; //这个地方是什么意思?好像不是NVB. |
|
|
|
有没有人帮帮我,问题就在程序后面的注释上!
while ((i!=0) && !(n&0x01) && !(n&waitFor)); //有(i!=0)1.3ms就跳出去了,!(n&0x01)定时器 24.5ms的跳出有什么用? if (n == 0) { n = 1; //为什么缓冲区没内容n要等于1? } if (n > MAXRLEN) { n = MAXRLEN; //为什么超过18个字节就读18个? } WriteRawRC(BitFramingReg,0x00); //这条指令的作用是什么? status=PcdComMF522(PCD_TRANSCEIVE,ucComMF522Buf,18,ucComMF522Buf,&unLen); // 发送18字节为什么返回四位? if ((status != MI_OK) || (unLen != 4) || ((ucComMF522Buf[0] & 0x0F) != 0x0A)) //((ucComMF522Buf[0] & 0x0F) != 0x0A)是判断什么的? { status = MI_ERR; } ucComMF522Buf[0] = PICC_HALT; ucComMF522Buf[1] = 0; //这个地方是什么意思?好像不是NVB. |
|
|
|
你这些代码太乱了,没法看,建议你先看一下相关的协议文档再来提问,不要总是指望来问一下别人就什么问题都帮你解决了。
|
|
|
|
最近我也在看这个,同学你看明白了没,我们互相交流一下。QQ1060316027
|
|
|
|
只有小组成员才能发言,加入小组>>
求解外围电路实现的是4脚给持续低电平复位并正常工作,高电平不工作的原因
1924 浏览 1 评论
2988 浏览 3 评论
PIC1946程序有一个变量在运行过程中恢复初始值其他变量保持不变
2183 浏览 2 评论
2559 浏览 0 评论
PIC16F1825的RC5引脚,在主程序中操作无效,在中断中可以改变是为什么?
3683 浏览 5 评论
644浏览 0评论
用XC8编译PIC18F25K80时提示下面Error,求怎么解决这个问题
2809浏览 0评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-4-20 11:12 , Processed in 0.635337 second(s), Total 80, Slave 65 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号