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

2018-11-29 16:23

609.

610.status=M500PcdCmd(PCD_WRITEE2,/*执行写RC500'sEEPROM命令*/ 611.SerBuffer, 612.&MInfo);

613.returnstatus;/*返回状态值*/ 614.} 615.

616.///////////////////////////////////////////////////////////////////////

617.//SelectCommanddefinedinISO14443(MIFARE) 618./*配置MFOUT/MFIN两脚输出内容*/

619.///////////////////////////////////////////////////////////////////////

620.charM500PcdMfOutSelect(unsignedchartype)/*TYPE为MFOUT输出的信号是什么类型*/ 621.{

622.WriteIO(RegMfOutSelect,type&0x7);/*MFOUTSELECT寄存器?26H?=TYPE--低三位有效*/ 623.returnMI_OK; 624.} 625.

626.///////////////////////////////////////////////////////////////////////

627.//RequestCommanddefinedinISO14443(MIFARE)

628.//Request,Anticoll,Select,returnCardType(2bytes)+CardSerialNo(4bytes)

629.//寻卡?防冲突?选择卡返回卡类型?2bytes?+卡系列号(4bytes)

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中去*/


射频 rc500代码完全注释(4).doc 将本文的Word文档下载到电脑 下载失败或者文档不完整,请联系客服人员解决!

下一篇:竞彩足球双平买法

相关阅读
本类排行
× 注册会员免费下载(下载后可以自由复制和排版)

马上注册会员

注:下载文档有可能“只有目录或者内容不全”等情况,请下载之前注意辨别,如果您已付费且无法下载或内容有问题,请联系我们协助你处理。
微信: QQ: