版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、By 曙光单片机科技 RC522程序读书笔记 详细注释MF RC522 射频识别参考程序注释串口读取的数据/- ucAddr = (Address<<1)&0x7E)|0x80;/变化成有效的地址形式,最低位为0,最高位为1时候是,从MFRC522读出数据,参考39页/ 读SPI数据 /-unsigned char SPIReadByte(void) unsigned char data SPICount; / Counter used to clock out the data unsigned char data SPIData; SPIData = 0; for (S
2、PICount = 0; SPICount < 8; SPICount+) / Prepare to clock in the data to be read SPIData <<=1; / Rotate the data CLR_SPI_CK; nop();nop(); / Raise the clock to clock the data out of the MAX7456 if(STU_SPI_MISO) SPIData|=0x01; SET_SPI_CK; nop();nop(); / Drop the clock ready for the next bit /
3、and loop back return (SPIData); / Finally return the read data /-/ 写SPI数据 /-void SPIWriteByte(unsigned char data SPIData) unsigned char data SPICount; / Counter used to clock out the data for (SPICount = 0; SPICount < 8; SPICount+) if (SPIData & 0x80) SET_SPI_MOSI; else CLR_SPI_MOSI; nop();no
4、p(); CLR_SPI_CK;nop();nop(); SET_SPI_CK;nop();nop(); SPIData <<= 1; /功 能:寻卡/参数说明: req_codeIN:寻卡方式/ 0x52 = 寻感应区内所有符合14443A标准的卡/ 0x26 = 寻未进入休眠状态的卡/ pTagTypeOUT:卡片类型代码/ 0x4400 = Mifare_UltraLight/ 0x0400 = Mifare_One(S50)/ 0x0200 = Mifare_One(S70)/ 0x0800 = Mifare_Pro(X)/ 0x4403 = Mifare_DESFire/
5、返 回: 成功返回MI_OK/char PcdRequest(unsigned char data req_code,unsigned char *pTagType)char data status; unsigned int data unLen;unsigned char data ucComMF522BufMAXRLEN; ClearBitMask(Status2Reg,0x08);/清除MRCrypto1on,要用软件清零WriteRawRC(BitFramingReg,0x07);/startsend=0,rxalign=0,在FIFO中存放的位置,TXlastbit=7SetBit
6、Mask(TxControlReg,0x03);/TX2rfen=1,TX1RFen=1,传递调制的13.56MHZ的载波信号 ucComMF522Buf0 = req_code;status = PcdComMF522(PCD_TRANSCEIVE,ucComMF522Buf,1,ucComMF522Buf,&unLen);/*8if (status = MI_OK) && (unLen = 0x10) *pTagType = ucComMF522Buf0;*(pTagType+1) = ucComMF522Buf1;else status = MI_ERR; ret
7、urn status;/功 能:防冲撞/参数说明: pSnrOUT:卡片序列号,4字节/返 回: 成功返回MI_OK/ char PcdAnticoll(unsigned char *pSnr) char data status; unsigned char data i,snr_check=0; unsigned int data unLen; unsigned char data ucComMF522BufMAXRLEN; ClearBitMask(Status2Reg,0x08); /清除MRCrypto1on,要用软件清零 WriteRawRC(BitFramingReg,0x00);
8、 /表示最后一个字节所有位都发送 ClearBitMask(CollReg,0x80); /CollRegCollReg0冲突结束后冲突位被置零 ucComMF522Buf0 = PICC_ANTICOLL1; ucComMF522Buf1 = 0x20; status = PcdComMF522(PCD_TRANSCEIVE,ucComMF522Buf,2,ucComMF522Buf,&unLen); if (status = MI_OK) for (i=0; i<4; i+) *(pSnr+i) = ucComMF522Bufi;/? snr_check = ucComMF5
9、22Bufi; /? if (snr_check != ucComMF522Bufi) status = MI_ERR; SetBitMask(CollReg,0x80); /CollRegCollReg在106kbps良好的防冲突情况下该位置1 return status;/功 能:选定卡片/参数说明: pSnrIN:卡片序列号,4字节/返 回: 成功返回MI_OK/char PcdSelect(unsigned char *pSnr) char data status; unsigned char data i; unsigned int data unLen; unsigned char
10、 data ucComMF522BufMAXRLEN; ucComMF522Buf0 = PICC_ANTICOLL1; ucComMF522Buf1 = 0x70; ucComMF522Buf6 = 0; for (i=0; i<4; i+) ucComMF522Bufi+2 = *(pSnr+i); ucComMF522Buf6 = *(pSnr+i); CalulateCRC(ucComMF522Buf,7,&ucComMF522Buf7); /# ClearBitMask(Status2Reg,0x08);/清零MFcryon status = PcdComMF522(P
11、CD_TRANSCEIVE,ucComMF522Buf,9,ucComMF522Buf,&unLen); if (status = MI_OK) && (unLen = 0x18) status = MI_OK; else status = MI_ERR; return status;/功 能:验证卡片密码/参数说明: auth_modeIN: 密码验证模式/ 0x60 = 验证A密钥/ 0x61 = 验证B密钥 / addrIN:块地址/ pKeyIN:密码/ pSnrIN:卡片序列号,4字节/返 回: 成功返回MI_OK/ char PcdAuthState(uns
12、igned char data auth_mode,unsigned char data addr,unsigned char *pKey,unsigned char *pSnr) char data status; unsigned int data unLen; unsigned char data i,ucComMF522BufMAXRLEN; ucComMF522Buf0 = auth_mode; /验证A密钥 ucComMF522Buf1 = addr; /addrIN:块地址 for (i=0; i<6; i+) ucComMF522Bufi+2 = *(pKey+i); f
13、or (i=0; i<6; i+) ucComMF522Bufi+8 = *(pSnr+i); / memcpy(&ucComMF522Buf2, pKey, 6); / memcpy(&ucComMF522Buf8, pSnr, 4); status = PcdComMF522(PCD_AUTHENT,ucComMF522Buf,12,ucComMF522Buf,&unLen); if (status != MI_OK) | (!(ReadRawRC(Status2Reg) & 0x08) status = MI_ERR; return status;/
14、功 能:读取M1卡一块数据/参数说明: addrIN:块地址/ pDataOUT:读出的数据,16字节/返 回: 成功返回MI_OK/ char PcdRead(unsigned char data addr,unsigned char *pData) char data status; unsigned int data unLen; unsigned char data i,ucComMF522BufMAXRLEN; ucComMF522Buf0 = PICC_READ; ucComMF522Buf1 = addr; CalulateCRC(ucComMF522Buf,2,&ucC
15、omMF522Buf2); status = PcdComMF522(PCD_TRANSCEIVE,ucComMF522Buf,4,ucComMF522Buf,&unLen); if (status = MI_OK) && (unLen = 0x90) / memcpy(pData, ucComMF522Buf, 16); for (i=0; i<16; i+) *(pData+i) = ucComMF522Bufi; else status = MI_ERR; return status;/功 能:写数据到M1卡一块/参数说明: addrIN:块地址/ pDat
16、aIN:写入的数据,16字节/返 回: 成功返回MI_OK/ char PcdWrite(unsigned char data addr,unsigned char *pData) char data status; unsigned int data unLen; unsigned char data i,ucComMF522BufMAXRLEN; ucComMF522Buf0 = PICC_WRITE; ucComMF522Buf1 = addr; CalulateCRC(ucComMF522Buf,2,&ucComMF522Buf2); status = PcdComMF522(
17、PCD_TRANSCEIVE,ucComMF522Buf,4,ucComMF522Buf,&unLen); if (status != MI_OK) | (unLen != 4) | (ucComMF522Buf0 & 0x0F) != 0x0A) status = MI_ERR; if (status = MI_OK) /memcpy(ucComMF522Buf, pData, 16); for (i=0; i<16; i+) ucComMF522Bufi = *(pData+i); CalulateCRC(ucComMF522Buf,16,&ucComMF52
18、2Buf16); status = PcdComMF522(PCD_TRANSCEIVE,ucComMF522Buf,18,ucComMF522Buf,&unLen); if (status != MI_OK) | (unLen != 4) | (ucComMF522Buf0 & 0x0F) != 0x0A) status = MI_ERR; return status;/功 能:命令卡片进入休眠状态/返 回: 成功返回MI_OK/char PcdHalt(void) char data status; unsigned int data unLen; unsigned cha
19、r data ucComMF522BufMAXRLEN; ucComMF522Buf0 = PICC_HALT; ucComMF522Buf1 = 0; CalulateCRC(ucComMF522Buf,2,&ucComMF522Buf2); status = PcdComMF522(PCD_TRANSCEIVE,ucComMF522Buf,4,ucComMF522Buf,&unLen); return MI_OK;/用MF522计算CRC16函数/void CalulateCRC(unsigned char *pIndata,unsigned char data len,u
20、nsigned char *pOutData) unsigned char data i,n; ClearBitMask(DivIrqReg,0x04); WriteRawRC(CommandReg,PCD_IDLE); /取消当前命令 SetBitMask(FIFOLevelReg,0x80);/FlushBuffer 清除ErrReg 的标志位 for (i=0; i<len; i+) WriteRawRC(FIFODataReg, *(pIndata+i); WriteRawRC(CommandReg, PCD_CALCCRC); i = 0xFF; do n = ReadRawR
21、C(DivIrqReg); i-; while (i!=0) && !(n&0x04); /当CRCIRq 所有数据被处理完毕该位置位 pOutData0 = ReadRawRC(CRCResultRegL); /显示计算出来的CRC值 pOutData1 = ReadRawRC(CRCResultRegM);/功 能:复位RC522/返 回: 成功返回MI_OK/char PcdReset(void)/PORTD|=(1<<RC522RST);SET_RC522RST; delay_ns(10);/PORTD&=(1<<RC522RST
22、);CLR_RC522RST; delay_ns(10);/PORTD|=(1<<RC522RST);SET_RC522RST; delay_ns(10); WriteRawRC(CommandReg,PCD_RESETPHASE);/#define PCD_RESETPHASE 0x0F /复位 delay_ns(10); WriteRawRC(ModeReg,0x3D); /和Mifare卡通讯,CRC初始值0x6363 WriteRawRC(TReloadRegL,30); /定时器的低8位数据, WriteRawRC(TReloadRegH,0); /定时器的高8位数据,
23、WriteRawRC(TModeReg,0x8D); /定时器模式寄存器,定时器减值计数 WriteRawRC(TPrescalerReg,0x3E); /实际值是OXD3E 这部分主要是设置定时器寄存器,#WriteRawRC(TxAutoReg,0x40);/必须要 ,设置逻辑1,强制100%ASK调制 return MI_OK;/设置RC522的工作方式 /char M500PcdConfigISOType(unsigned char data type) if (type = 'A') /ISO14443_A ClearBitMask(Status2Reg,0x08);
24、 /状态2寄存器 WriteRawRC(ModeReg,0x3D);/3F /和Mifare卡通讯,CRC初始值0x6363 WriteRawRC(RxSelReg,0x86);/84 选择内部接收器设置,内部模拟部分调制信号,发送数据后,延迟6个位时钟,接收 WriteRawRC(RFCfgReg,0x7F); /4F 配置接收器 48dB最大增益 WriteRawRC(TReloadRegL,30);/tmoLength);/ TReloadVal = 'h6a =tmoLength(dec) WriteRawRC(TReloadRegH,0); /实际值是OXD3E 这部分主要是
25、设置定时器寄存器,# WriteRawRC(TModeReg,0x8D); WriteRawRC(TPrescalerReg,0x3E); delay_ns(1000); PcdAntennaOn(); else return -1; return MI_OK;/功 能:读RC522寄存器/参数说明:AddressIN:寄存器地址/返 回:读出的值/unsigned char ReadRawRC(unsigned char data Address) unsigned char data ucAddr; unsigned char data ucResult=0;CLR_SPI_CS; ucA
26、ddr = (Address<<1)&0x7E)|0x80;/变化成有效的地址形式,最低位为0,最高位为1时候是,从MFRC522读出数据,参考39页SPIWriteByte(ucAddr);ucResult=SPIReadByte();SET_SPI_CS; return ucResult;/功 能:写RC632寄存器/参数说明:AddressIN:寄存器地址/ valueIN:写入的值/void WriteRawRC(unsigned char data Address, unsigned char data value) unsigned char data ucAd
27、dr;CLR_SPI_CS; ucAddr = (Address<<1)&0x7E);/变化成有效的地址形式,最低为为0,最高位为1时候是,写入MFRC522数据SPIWriteByte(ucAddr);SPIWriteByte(value);SET_SPI_CS;/功 能:置RC522寄存器位/参数说明:regIN:寄存器地址/ maskIN:置位值/void SetBitMask(unsigned char data reg,unsigned char data mask) char data tmp = 0x0; tmp = ReadRawRC(reg); Write
28、RawRC(reg,tmp | mask); / set bit mask/功 能:清RC522寄存器位/参数说明:regIN:寄存器地址/ maskIN:清位值/void ClearBitMask(unsigned char data reg,unsigned char data mask) char data tmp = 0x0; tmp = ReadRawRC(reg); WriteRawRC(reg, tmp & mask); / clear bit mask /功 能:通过RC522和ISO14443卡通讯/参数说明:CommandIN:RC522命令字/ pInDataIN
29、:通过RC522发送到卡片的数据/ InLenByteIN:发送数据的字节长度/ pOutDataOUT:接收到的卡片返回数据/ *pOutLenBitOUT:返回数据的位长度/char PcdComMF522(unsigned char data Command, unsigned char *pInData, unsigned char data InLenByte, unsigned char *pOutData, unsigned int *pOutLenBit) char data status = MI_ERR; unsigned char data irqEn = 0x00; u
30、nsigned char data waitFor = 0x00; unsigned char data lastBits; unsigned char data n; unsigned int data 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);/清除FIFO中的读写指针 for (i=0; i<InLenByte; i+) WriteRawRC(FIFODataReg, pInDatai); /写寻卡命令 WriteRawRC(CommandReg, Command);/发送并接收数据 if (Command = PCD_TRANSCEIVE) SetB
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 乡镇财政所工作责任制度
- l粮食安全生产岗位责任制度
- 2026年云南能源职业技术学院单招职业适应性测试题库有答案详解
- 2026年无锡商业职业技术学院单招综合素质考试题库与答案详解
- 2026年西藏自治区拉萨市高职单招综合素质考试题库带答案详解
- 2026年四川省泸州市高职单招综合素质考试题库有答案详解
- 外企客服中心部门主管的工作流程及沟通技巧说明
- 环境工程师岗位面试技巧交流
- 媒体公司编辑部经理面试全解
- 京东集团专利代理服务协议
- 业务招待费管理标准制度
- GB/T 22576.1-2026医学实验室质量和能力的要求第1部分:通用要求
- 2026云南昆明巫家坝商业运营管理有限公司校园招聘8人考试参考题库及答案解析
- 2026年包头职业技术学院单招综合素质考试题库附答案详解(考试直接用)
- 中国硬皮病诊疗指南(2025版)
- 内蒙古自治区民航机场集团有限责任公司招聘笔试题库2026
- (14)普通高中音乐课程标准日常修订版(2017年版2025年修订)
- 通用电子嘉宾礼薄
- 机器人控制技术与实践 课程标准-教学大纲
- 室内无机防火涂料施工方案
- 安全意识培训课件 38、安全意识培训
评论
0/150
提交评论