教学文库网 - 权威文档分享云平台
您的当前位置:首页 > 精品文档 > 基础教育 >

射频 rc500代码完全注释(6)

来源:网络收集 时间:2026-07-01
导读: 630./////////////////////////////////////////////////////////////////////// 631.charM500PiccCommonRequest(unsignedcharreq_code,unsignedchar*atq) 632.{/*ATQ=ANSWERTOREQUEST:响应信息?两个字节*/ 633.cha

630.///////////////////////////////////////////////////////////////////////

631.charM500PiccCommonRequest(unsignedcharreq_code,unsignedchar*atq) 632.{/*ATQ=ANSWERTOREQUEST:响应信息?两个字节*/ 633.charidatastatus=MI_OK; 634.

635.M500PcdSetTmo(3);/*计数器工作于模式3*/

636.WriteIO(RegChannelRedundancy,0x03);/*通道冗余寄存器置3--奇校验?每个字节后附加一个校验位?无CRC校验*/

637.ClearBitMask(RegControl,0x08);/*清加密算法位?09H?*/

638.WriteIO(RegBitFraming,0x07);/*最后三位为111?表示最后一字节须传送的位数为1?0FH?*/

639.SetBitMask(RegTxControl,0x03);/*TX脚发送被数据调制好的能量载波信号?11H?*/ 640.

641.ResetInfo(MInfo);/*信息接口*/

642.SerBuffer[0]=req_code;/*REQ_CODE=26H:REQUESTALL,REQ_CODE=52H:REQ

UESTIDLE,*/

643.MInfo.nBytesToSend=1;

644./*上面是REQUEST指令相关信息*/

645.status=M500PcdCmd(PCD_TRANSCEIVE,SerBuffer,&MInfo);/*执行TRANSCEIVE指令?寻卡--REQUEST?*/ 646.

647.if(status)/*返回标志为1*/ 648.{

649.*atq=0;/*则响应值置0*/ 650.}

651.else/*返回标志为0--成功了一半*/ 652.{

653.if(MInfo.nBitsReceived!=16)/*如果收到的比特数不是16?则命令执行失败*/ 654.{

655.*atq=0;/*则响应值置0*/

656.status=MI_BITCOUNTERR;/*置状态寄存器为比特计数器错*/ 657.} 658.else 659.{

660.status=MI_OK;/*是16?命令执行成功*/

661.memcpy(atq,SerBuffer,2);/*从单片机数据缓冲区中读取响应信号?ATQ?*/ 662.} 663.}

664.returnstatus;/*返回状态值*/ 665.} 666.

667.///////////////////////////////////////////////////////////////////

668.//CascadedAnti-CollisionCommanddefinedinISO14443(MIFARE) 669./*防冲突读卡的系列号MLastSelectedSnr四位的序列号*/

670.///////////////////////////////////////////////////////////////////

671.charM500PiccCascAnticoll(unsignedcharbcnt,unsignedchar*snr) 672.{/*BCNT=0--32,比特计数器?SNR=序列号存储缓冲区4个字节?*/ 673.charidatastatus=MI_OK; 674.charidatasnr_in[4]; 675.charidatanbytes=0; 676.charidatanbits=0; 677.charidatacomplete=0; 678.charidatai=0;

679.charidatabyteOffset=0; 680.unsignedchardummyShift1;

681.unsignedchardummyShift2; 682.

683.M500PcdSetTmo(106);/*初始化计时器--方式106*/ 684.memcpy(snr_in,snr,4);/*序列号复制*/ 685.

686.WriteIO(RegDecoderControl,0x28);/*任何在比特碰撞出现之后接收到的信号位进被屏蔽为0?大大简化ISO14443A标 准*/

687.ClearBitMask(RegControl,0x08);/*清加密算法位?09H?*/ 688.complete=0;

689.while(!complete&&(status==MI_OK))/*如果这两个条件都成立则在此循环*/ 690.{

691.ResetInfo(MInfo);

692.WriteIO(RegChannelRedundancy,0x03);/*通道冗余寄存器置3--奇校验?每个字节后附加一个校验位?无CRC校 验*/

693.nbits=bcnt%8;/*NBIT=BCNT除以8的余数*/ 694.if(nbits)/*如果不为0*/ 695.{

696.WriteIO(RegBitFraming,nbits<4|nbits);/*如果不为0*/ 697.nbytes=bcnt/8+1;/*NBYTES为收到的序列号字节数?要加一*/ 698.if(nbits==7) 699.{

700.MInfo.cmd=PICC_ANTICOLL1;

701.WriteIO(RegBitFraming,nbits);/**/ 702.} 703.}

704.else/*余数为0*/ 705.{

706.nbytes=bcnt/8;/*NBYTES为收到的序列号字节数*/ 707.}

708.SerBuffer[0]=0x93;/*标准选卡命令*/ 709.SerBuffer[1]=0x20+((bcnt/8)<4)+nbits; 710.

711.for(i=0;inbytes;i++) 712.{

713.SerBuffer[i+2]=snr_in[i];/*序列号输入接口*/ 714.}

715.MInfo.nBytesToSend=2+nbytes;/*输入字节个数*/ 716.

717.status=M500PcdCmd(PCD_TRANSCEIVE,SerBuffer,&MInfo); 718.if(nbits==7)

719.{/*反碰撞处理过程?*/

720.dummyShift1=0x00;

721.for(i=0;iMInfo.nBytesReceived;i++) 722.{

723.dummyShift2=SerBuffer[i];

724.SerBuffer[i]=(dummyShift1>>(i+1))|(SerBuffer[i]<(7-i)); 725.dummyShift1=dummyShift2; 726.}

727.MInfo.nBitsReceived-=MInfo.nBytesReceived;

728.if(MInfo.collPos)MInfo.collPos+=7-(MInfo.collPos+6)/9; 729.}

730.if(status==MI_OK||status==MI_COLLERR) 731.{

732.if(MInfo.nBitsReceived!=(40-bcnt)) 733.{

734.status=MI_BITCOUNTERR; 735.} 736.else 737.{

738.byteOffset=0; 739.if(nbits!=0) 740.{

741.snr_in[nbytes-1]=snr_in[nbytes-1]|SerBuffer[0]; 742.byteOffset=1; 743.} 744.

745.for(i=0;i(4-nbytes);i++) 746.{

747.snr_in[nbytes+i]=SerBuffer[i+byteOffset]; 748.} 749.

750.if(status!=MI_COLLERR) 751.{

752.dummyShift2=snr_in[0]^snr_in[1]^snr_in[2]^snr_in[3]; 753.dummyShift1=SerBuffer[MInfo.nBytesReceived-1]; 754.if(dummyShift2!=dummyShift1) 755.{

756.status=MI_SERNRERR; 757.} 758.else 759.{

760.complete=1; 761.} 762.} 763.else

764.{

765.bcnt=bcnt+MInfo.collPos-nbits; 766.status=MI_OK; 767.} 768.} 769.} 770.}

771.if(status==MI_OK)/*如果状态标志成功*/ 772.{

773.memcpy(snr,snr_in,4);/*保存序列号*/ 774.} 775.else 776.{

777.memcpy(snr,\不成功?则返回0000*/ 778.}

779.ClearBitMask(RegDecoderControl,0x20);/*清掉反碰撞位*/ 780.

781.returnstatus;/*返回状态值*/ 782.} 783.

784.//////////////////////////////////////////////////////////////////

785.//CascadedSelectcommanddefinedinISO14443(MIFARE) 786./*选择卡?确定序列号是否大于4字节*/

787.//////////////////////////////////////////////////////////////////

788.charM500PiccCascSelect(unsignedchar*snr,unsignedchar*sak) 789.{/*snr为序列号首址?sak为一字节选卡回应值*/ 790.charidatastatus=MI_OK; 791.

792.M500PcdSetTmo(106);/*计时器初始化*/ 793.

794.WriteIO(RegChannelRedundancy,0x0F);/*通道冗余寄存器置f--16bitcrc校验?确定数据帧最后两个字节为crc字节? 奇校验?每个字节后附加一个校验位*/

795.ClearBitMask(RegControl,0x08);/*清加密算法位?09H?*/

796./////////////////////////////////////////////////////////////////////////////////////////////////////////////

797./*送rc500FIFO的相关信息?与命令函数m500pcdcmd()配合*/ 798.ResetInfo(MInfo);/*给rc500的相关信息?与指令相配合*/

799.SerBuffer[0]=0x93;/*给rc500的相关信息?写入指令?选卡?数据*/ 800.SerBuffer[1]=0x70;/*给rc500的相关信息?写入数据*/

801.memcpy(SerBuffer+2,snr,4);/*将原指针snr对应的序列号拷贝到发送缓冲区serbuffer中去*/

…… 此处隐藏:2886字,全部文档内容请下载后查看。喜欢就下载吧 ……
射频 rc500代码完全注释(6).doc 将本文的Word文档下载到电脑,方便复制、编辑、收藏和打印
本文链接:https://www.jiaowen.net/wendang/564818.html(转载请注明文章来源)
Copyright © 2020-2025 教文网 版权所有
声明 :本网站尊重并保护知识产权,根据《信息网络传播权保护条例》,如果我们转载的作品侵犯了您的权利,请在一个月内通知我们,我们会及时删除。
客服QQ:78024566 邮箱:78024566@qq.com
苏ICP备19068818号-2
Top
× 游客快捷下载通道(下载后可以自由复制和排版)
VIP包月下载
特价:29 元/月 原价:99元
低至 0.3 元/份 每月下载150
全站内容免费自由复制
VIP包月下载
特价:29 元/月 原价:99元
低至 0.3 元/份 每月下载150
全站内容免费自由复制
注:下载文档有可能出现无法下载或内容有问题,请联系客服协助您处理。
× 常见问题(客服时间:周一到周五 9:30-18:00)