77范文网 - 专业文章范例文档资料分享平台

mfrc522程序注释(2)

来源:网络收集 时间:2019-04-05 下载这篇文档 手机版
说明:文章内容仅供预览,部分内容可能不全,需要完整文档或者需要复制内容,请下载word后使用。下载word有问题请添加微信号:或QQ: 处理(尽可能给您提供完整文档),感谢您的支持与谅解。点击这里给我发消息

if (status == MI_OK) {

//memcpy(ucComMF522Buf, pData, 16); for (i=0; i<16; i++)

{ ucComMF522Buf[i] = *(pData+i); } // 16字节数据

CalulateCRC(ucComMF522Buf,16,&ucComMF522Buf[16]); // 两位CRC计算字节

status = PcdComMF522(PCD_TRANSCEIVE,ucComMF522Buf,18,ucComMF522Buf,&unLen); // 发送18字节

if ((status != MI_OK) || (unLen != 4) || ((ucComMF522Buf[0] & 0x0F) != 0x0A)) // 返回低四位为1010

{ status = MI_ERR; } }

return status; }

/********************************************************************* * 功 能:命令卡片进入休眠状态 * 返 回: 成功返回MI_OK

*********************************************************************/ char PcdHalt(void) {

char status;

unsigned int unLen;

unsigned char ucComMF522Buf[MAXRLEN];

ucComMF522Buf[0] = PICC_HALT; // 0x50,休眠 ucComMF522Buf[1] = 0;

CalulateCRC(ucComMF522Buf,2,&ucComMF522Buf[2]); // 计算校验位

status = PcdComMF522(PCD_TRANSCEIVE,ucComMF522Buf,4,ucComMF522Buf,&unLen); // 发送

return MI_OK; }

/********************************************************************* * 用MF522计算CRC16函数

*********************************************************************/

void CalulateCRC(unsigned char *pIndata,unsigned char len,unsigned char *pOutData) {

unsigned char i,n;

ClearBitMask(DivIrqReg,0x04); // CRCIRQ清零 WriteRawRC(CommandReg,PCD_IDLE); // 空闲命令

SetBitMask(FIFOLevelReg,0x80); // FIFOLevelReg中FlushBuffer位置1,表示缓冲区读和写指针清除,即缓冲区无数据,用来存放一下批数据,ErrReg的BufferOvfl清楚 for (i=0; i

{ WriteRawRC(FIFODataReg, *(pIndata+i)); } // 将数据写入缓冲区

WriteRawRC(CommandReg, PCD_CALCCRC); // 启动CRC计算,结果存于CRCResultReg中 i = 0xFF; do {

n = ReadRawRC(DivIrqReg); i--; }

while ((i!=0) && !(n&0x04)); // CRCIRQ置位,当CRC有效且所有数据被处理则需要置1,退出循环,或者是执行了127次读取认为完成CRC也退出循环 pOutData[0] = ReadRawRC(CRCResultRegL);

pOutData[1] = ReadRawRC(CRCResultRegM); // 计算结果输出到pOutData中 }

/********************************************************************* * 功 能:复位RC522 * 返 回: 成功返回MI_OK

*********************************************************************/ char PcdReset(void) {

MF522_RST=1; _nop_();

MF522_RST=0; // 复位 _nop_(); MF522_RST=1; _nop_();

WriteRawRC(CommandReg,PCD_RESETPHASE); // 0x0F,软件复位 _nop_();

WriteRawRC(ModeReg,0x3D); // 和Mifare卡通讯,CRC初始值0x6363 WriteRawRC(TReloadRegL,30); // 48 WriteRawRC(TReloadRegH,0);

WriteRawRC(TModeReg,0x8D); // 10001101(141):发送完开始计时,接收时停止计时,自动重装

WriteRawRC(TPrescalerReg,0x3E); // 00111110(62),3390 定时时间:

3391*49/6.78=24.5ms

WriteRawRC(TxAutoReg,0x40); // 控制驱动天线 return MI_OK; }

/********************************************************************* * 设置RC632的工作方式

*********************************************************************/ char M500PcdConfigISOType(unsigned char type) {

if (type == 'A') //ISO14443_A {

ClearBitMask(Status2Reg,0x08);

/* WriteRawRC(CommandReg,0x20); //as default WriteRawRC(ComIEnReg,0x80); //as default WriteRawRC(DivlEnReg,0x0); //as default WriteRawRC(ComIrqReg,0x04); //as default WriteRawRC(DivIrqReg,0x0); //as default

WriteRawRC(Status2Reg,0x0);//80 //trun off temperature sensor WriteRawRC(WaterLevelReg,0x08); //as default WriteRawRC(ControlReg,0x20); //as default WriteRawRC(CollReg,0x80); //as default */

WriteRawRC(ModeReg,0x3D);//3F

/* WriteRawRC(TxModeReg,0x0); //as default??? WriteRawRC(RxModeReg,0x0); //as default??? WriteRawRC(TxControlReg,0x80); //as default???

WriteRawRC(TxSelReg,0x10); //as default??? */

WriteRawRC(RxSelReg,0x86);//84 // 内部模拟部分的调制信号作为非接触式UART输入,发送后接收器启动延时6个位时钟

// WriteRawRC(RxThresholdReg,0x84);//as default // WriteRawRC(DemodReg,0x4D); //as default

// WriteRawRC(ModWidthReg,0x13);//26

WriteRawRC(RFCfgReg,0x7F); //4F // 接收信号电压增益23dB /* WriteRawRC(GsNReg,0x88); //as default??? WriteRawRC(CWGsCfgReg,0x20); //as default??? WriteRawRC(ModGsCfgReg,0x20); //as default??? */

WriteRawRC(TReloadRegL,30);//tmoLength);// TReloadVal = 'h6a =tmoLength(dec)

WriteRawRC(TReloadRegH,0);

WriteRawRC(TModeReg,0x8D);

WriteRawRC(TPrescalerReg,0x3E);

// PcdSetTmo(106); delay(10); PcdAntennaOn(); }

else{ return -1; }

return MI_OK; }

/******************************************************************** * 功 能:读RC632寄存器 SPI方式 * 参数说明:Address[IN]:寄存器地址 * 返 回:读出的值

*********************************************************************/ unsigned char ReadRawRC(unsigned char Address) {

unsigned char i, ucAddr; unsigned char ucResult=0;

MF522_SCK = 0; MF522_NSS = 0;

ucAddr = ((Address<<1)&0x7E)|0x80;

for(i=8;i>0;i--) {

MF522_SI = ((ucAddr&0x80)==0x80); MF522_SCK = 1; ucAddr <<= 1; MF522_SCK = 0; }

for(i=8;i>0;i--) {

MF522_SCK = 1; ucResult <<= 1;

ucResult|=(bit)MF522_SO; MF522_SCK = 0; }

MF522_NSS = 1; MF522_SCK = 1;

return ucResult; }

/********************************************************************* * 功 能:写RC632寄存器

* 参数说明:Address[IN]:寄存器地址 * value[IN]:写入的值

**********************************************************************/ void WriteRawRC(unsigned char Address, unsigned char value) {

unsigned char i, ucAddr;

MF522_SCK = 0; MF522_NSS = 0;

ucAddr = ((Address<<1)&0x7E); // 地址高位为0表示写,地位必须为0

for(i=8;i>0;i--) {

MF522_SI = ((ucAddr&0x80)==0x80); MF522_SCK = 1; ucAddr <<= 1; MF522_SCK = 0; }

for(i=8;i>0;i--) {

MF522_SI = ((value&0x80)==0x80); MF522_SCK = 1; value <<= 1; MF522_SCK = 0; }

MF522_NSS = 1; MF522_SCK = 1; }

/********************************************************************* * 功 能:置RC522寄存器位 * 参数说明:reg[IN]:寄存器地址 * mask[IN]:置位值

*********************************************************************/ void SetBitMask(unsigned char reg,unsigned char mask) {

char tmp = 0x0;

tmp = ReadRawRC(reg);

百度搜索“77cn”或“免费范文网”即可找到本站免费阅读全部范文。收藏本站方便下次阅读,免费范文网,提供经典小说综合文库mfrc522程序注释(2)在线全文阅读。

mfrc522程序注释(2).doc 将本文的Word文档下载到电脑,方便复制、编辑、收藏和打印 下载失败或者文档不完整,请联系客服人员解决!
本文链接:https://www.77cn.com.cn/wenku/zonghe/571674.html(转载请注明文章来源)
Copyright © 2008-2022 免费范文网 版权所有
声明 :本网站尊重并保护知识产权,根据《信息网络传播权保护条例》,如果我们转载的作品侵犯了您的权利,请在一个月内通知我们,我们会及时删除。
客服QQ: 邮箱:tiandhx2@hotmail.com
苏ICP备16052595号-18
× 注册会员免费下载(下载后可以自由复制和排版)
注册会员下载
全站内容免费自由复制
注册会员下载
全站内容免费自由复制
注:下载文档有可能“只有目录或者内容不全”等情况,请下载之前注意辨别,如果您已付费且无法下载或内容有问题,请联系我们协助你处理。
微信: QQ: