/******************************************************************************************************
*【文件名称】 : mfrc.c
*【文件描述】 : 移植C51例程
*【文件功能】 : mfrc522底层驱动
*【主控芯片】 : STM432F407zg
*【实验平台】 : STM32F4xx开发板
*【编写环境】 : IAR 8.30.1
*【编写时间】 : 2019-03-28
*【作 者】 : 李剀(KevinLee)
*【历史记录】 :
<1> $【修改时间】
$【修改内容】
$【修改详情】
$【修改人员】
*******************************************************************************************************/
#include "mfrc.h"
#include "main.h"
#define MAXRLEN 18
// 关于寄存器 ,在MFRC522数据手册.pdf 中都有说明
/*******************************************************************
@func : PcdRequest
@brief : 寻卡
@pram : 1、req_code[IN]:寻卡方式
0x52 = 寻感应区内所有符合14443A标准的卡
0x26 = 寻未进入休眠状态的卡
第2条命令是读取完卡后还会再次读取。(除非在某次读取完成后系统进入休眠(Halt))
第1条命令是读取完卡后会等待卡离开开线作用范围,直到再次进入。
2、pTagType[OUT]:卡片类型代码
0x4400 = Mifare_UltraLight
0x0400 = Mifare_One(S50)
0x0200 = Mifare_One(S70)
0x0800 = Mifare_Pro(X)
0x4403 = Mifare_DESFire
@retval : 寻卡成功 返回MI_OK
@NOTE : 外部调用
: 函数将我们的寻卡命令PICC_REQIDL/ALL装填如要发送的数组,
: 通过PcdComMF522函数发送出去
: 回的两字节被装填入pTagType数组
*******************************************************************/
char PcdRequest(unsigned char req_code,unsigned char *pTagType)
{
char status;
unsigned int unLen;
unsigned char ucComMF522Buf[MAXRLEN];
ClearBitMask(Status2Reg,0x08); // 清理指示MIFARECyptol单元(9.2.1.9)
WriteRawRC(BitFramingReg,0x07); // 定义发送最后一个字节的位数 0x07即表示7bits
SetBitMask(TxControlReg,0x03); // TX1,2管脚输出经过发送调制的13.56MHz得能量载波信号
ucComMF522Buf[0] = req_code; // 蒋寻卡方式存储起来
status = PcdComMF522(PCD_TRANSCEIVE,ucComMF522Buf,1,ucComMF522Buf,&unLen);
if ((status == MI_OK) && (unLen == 0x10))
{
*pTagType = ucComMF522Buf[0];
*(pTagType+1) = ucComMF522Buf[1];
}
else
{
status = MI_ERR;
}
return status;
}
/*******************************************************************
@func : PcdAnticoll
@brief : 防冲撞
@pram : pSnr[OUT]:卡片序列号,4字节
@retval : 寻卡成功 返回MI_OK
@NOTE : 外部调用
: 防冲突操作就是将防冲突命令通过PcdComMF522函数与PICC卡进行交互
: 防冲突命令是两个字节,其中第一字节为Mifare_One卡的防冲突命令字
: PICC_ANTICOLL1(0x93) 第二个字节为0x20
: 这两个字节在ISO14443协议中有解释
*******************************************************************/
char PcdAnticoll(unsigned char *pSnr)
{
char status;
unsigned char i,snr_check=0;
unsigned int unLen;
unsigned char ucComMF522Buf[MAXRLEN];
ClearBitMask(Status2Reg,0x08); // MFCyptol on 清零
WriteRawRC(BitFramingReg,0x00); // 清理寄存器 停止收发数据
ClearBitMask(CollReg,0x80); // VavluesAfterColl 清零 all receiving bits will be cleared after a collision
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[i]; // 读取UID
snr_check ^= ucComMF522Buf[i];
}
if (snr_check != ucComMF522Buf[i]) // 如果校验位不对 则返回MI_ERR
{
status = MI_ERR;
}
}
SetBitMask(CollReg,0x80);
return status;
}
/*******************************************************************
@func : PcdSelect
@brief : 选定卡片
@pram : pSnr[IN]:卡片序列号,4字节
@retval : 成功选中 返回MI_OK
@NOTE : 外部调用
*******************************************************************/
char PcdSelect(unsigned char *pSnr)
{
char status;
unsigned char i;
unsigned int unLen;
unsigned char ucComMF522Buf[MAXRLEN];
ucComMF522Buf[0] = PICC_ANTICOLL1;
ucComMF522Buf[1] = 0x70;
ucComMF522Buf[6] = 0;
for (i=0; i<4; i++)
{
ucComMF522Buf[i+2] = *(pSnr+i);
ucComMF522Buf[6] ^= *(pSnr+i);
}
CalulateCRC(ucComMF522Buf,7,&ucComMF522Buf[7]);
ClearBitMask(Status2Reg,0x08);
status = PcdComMF522(PCD_TRANSCEIVE,ucComMF522Buf,9,ucComMF522Buf,&unLen);
if ((status == MI_OK) && (unLen == 0x18))
{
status = MI_OK;
}else
{
status = MI_ERR;
}
return status;
}
/*******************************************************************
@func : PcdAuthState
@brief : 验证卡片密码
@pram : 1、auth_mode[IN]: 密码验证模式
0x60 = 验证A密钥
0x61 = 验证B密钥
2、addr[IN] : 块地址(0~3)
3、pKey[IN] : 密码
4、pSnr[IN] : 卡片序列号,4字节
@retval : 验证成功 返回MI_OK
@NOTE : 外部调用
*******************************************************************/
char PcdAuthState(unsigned char auth_mode,unsigned char addr,unsigned char *pKey,unsigned char *pSnr)
{
char status;
unsigned int unLen;
unsigned char i,ucComMF522Buf[MAXRLEN];
ucComMF522Buf[0] = auth_mode;
ucComMF522Buf[1] = addr;
for (i=0; i<6; i++)
{ ucComMF522Buf[i+2] = *(pKey+i); }
for (i=0; i<6; i++)
{ ucComMF522Buf[i+8] = *(pSnr+i); }
// memcpy(&ucComMF522Buf[2], pKey, 6);
// memcpy(&ucComMF522Buf[8], pSnr, 4);
status = PcdComMF522(PCD_AUTHENT,ucComMF522Buf,12,ucComMF522Buf,&unLen);
if ((status != MI_OK) || (!(ReadRawRC(Status2Reg) & 0x08)))
{ status = MI_ERR; }
return status;
}
/*******************************************************************
@func : PcdRead
@brief : 读取M1卡一块数据
@pram : 1、addr[IN] : 块地址
2、pData[IN]: 读出的数据,16字节
@retval : 成功 返回状态MI_OK
@NOTE : 外部调用
*******************************************************************/
char PcdRead(unsigned char addr,unsigned char *pData)
{
char status;
unsigned int unLen;
unsigned char i,ucComMF522Buf[MAXRLEN];
ucComMF522Buf[0] = PICC_READ;
ucComMF522Buf[1] = addr;
CalulateCRC(ucComMF522Buf,2,&ucComMF522Buf[2]);
status = PcdComMF522(PCD_TRANSCEIVE,ucComMF522Buf,4,ucComMF522Buf,&unLen);
if ((status == MI_OK) && (unLen == 0x90))
{
for (i=0; i<16; i++)
{ *(pData+i) = ucComMF522Buf[i]; }
}
else
{ status = MI_ERR; }
return status;
}
/*******************************************************************
@func : PcdWrite
@brief : 写数据到M1卡一块
@pram : 1、addr[IN] : 块地址
2、pData[IN]: 写入的数据,16字节
@retval : 验证成功 返回MI_OK
@NOTE : 外部调用
*******************************************************************/
char PcdWrite(unsigned char addr,unsigned char *pData)
{
char status;
unsigned int unLen;
unsigned char i,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);
for (i=0; i<16; i++)
{ ucComMF522Buf[i] = *(pData+i); }
CalulateCRC(ucComMF522Buf,16,&ucComMF522Buf[16]);
status = PcdComMF522(PCD_TRANSCEIVE,ucComMF522Buf,18,ucComMF522Buf,&unLen);
if ((status != MI_OK) || (unLen != 4) || ((ucComMF522Buf[0] & 0x0F)

Kevin_8_Lee
- 粉丝: 479
最新资源
- MongoDB数据库高性能、高可用架构设计.docx
- 嵌入式系统课程设计20135.doc
- 论述工程项目管理中施工现场管理及优化措施.docx
- 工程项目管理理论基础.ppt
- 探究小学信息技术Scracth编程的创新教学.docx
- 大数据-小卫星概述.docx
- 试析如何加强电力营销工程项目管理.docx
- 试论计算机教学中的网络教学模式.docx
- 从传统祭祀到网络祭祀世俗心理演变初探.docx
- PLC的自动售货机控制系统的设计.doc
- 建立网络会计服务中心的可行性的论文-会计电算会计论文.docx
- 微课在计算机基础教学中的应用.docx
- 第五代移动通信技术.doc
- 高清网络监控系统施工注意事项.doc
- 数据中心搬迁项目管理.docx
- 医疗系统中计算机的应用.docx
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈


