RFID-RC522是一个淘宝上比较常见的一个识别RFID的一个模块。他可以做到对RFID的读写。 MF RC522 是应用于13.56MHz 非接触式通信中高集成度读写卡系列芯片中的一员。是NXP公司针对“三表”应用推出的一款低电压、低成本、体积小的非接触式读写卡芯片,是智能仪表和便携 式手持设备研发的较好选择
##RFID读写卡的过程 读写卡主要有五个步骤:寻卡,防冲突,选卡,认证,读/写卡。 ###寻卡
// REQ_ALL代表寻天线区内所有卡,TagType为返回的卡的类型
status= PcdRequest( REQ_ALL , TagType );
TagType返回的卡类型有: 0x4400 = Mifare_UltraLight 0x0400 = Mifare_One(S50) 0x0200 = Mifare_One(S70) 0x0800 = Mifare_Pro(X) 0x4403 = Mifare_DESFire ###防冲突
if(!status)
{
status = PcdAnticoll(SelectedSnr);
// ......
}
###认证
if(!status)
{
// 认证
snr = 1; // 扇区号1
status = PcdAuthState(KEYA, (snr*4+3), DefaultKey, SelectedSnr); // 校验1扇区密码,密码位于每一扇区第3块
// ......
}
四个参数分别是:验证A密钥,块地址,扇区密码,卡序列号 ###读写卡
if(!status)
{
//读写卡
status = PcdRead((snr*4+0), buf); // 读卡,读取1扇区0块数据到buf[0]-buf[16]
status = PcdWrite((snr*4+0), "way2"); // 写卡,将buf[0]-buf[16]写入1扇区0块
if(!status)
{
//读写成功
printf("read finish!\n");
printf("读到的值是: %s\n",buf);
WaitCardOff();
}
}
##代码 以下为核心代码: main.c
#include "stm32f10x.h"
#include "delay.h"
#include "bsp_usart.h"
#include "RC522.h"
int main()
{
char status;
unsigned char snr, buf[16], TagType[2], SelectedSnr[4], DefaultKey[6] = {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF};
delay_init();
usart_init();
PcdInit();
PcdReset();
PcdAntennaOff();
PcdAntennaOn();
M500PcdConfigISOType( 'A' );
printf( "init over!\n" );
while(1){
// 寻卡
status= PcdRequest( REQ_ALL , TagType ); // REQ_ALL代表寻天线区内所有卡。TagType为返回的卡类型
if(!status)
{
// 防冲突
status = PcdAnticoll(SelectedSnr);
if(!status)
{
// 选卡
status=PcdSelect(SelectedSnr);
if(!status)
{
// 认证
snr = 1; // 扇区号1
status = PcdAuthState(KEYA, (snr*4+3), DefaultKey, SelectedSnr); // 校验1扇区密码,密码位于每一扇区第3块
// 验证A密钥,块地址,扇区密码,卡序列号
{
if(!status)
{
//读写卡
status = PcdRead((snr*4+0), buf); // 读卡,读取1扇区0块数据到buf[0]-buf[16]
// status = PcdWrite((snr*4+0), "way2"); // 写卡,将buf[0]-buf[16]写入1扇区0块
if(!status)
{
//读写成功
printf("read finish!\n");
printf("读到的值是: %s\n",buf);
WaitCardOff();
}
}
}
}
}
}
}
}
RC522.h
#ifndef __RC522_H
#define __RC522_H
#define MF522_RST_PIN GPIO_Pin_11
#define MF522_RST_PORT GPIOB
#define MF522_RST_CLK RCC_APB2Periph_GPIOB
#define MF522_MISO_PIN GPIO_Pin_10
#define MF522_MISO_PORT GPIOB
#define MF522_MISO_CLK RCC_APB2Periph_GPIOB
#define MF522_MOSI_PIN GPIO_Pin_1
#define MF522_MOSI_PORT GPIOB
#define MF522_MOSI_CLK RCC_APB2Periph_GPIOB
#define MF522_SCK_PIN GPIO_Pin_0
#define MF522_SCK_PORT GPIOB
#define MF522_SCK_CLK RCC_APB2Periph_GPIOB
#define MF522_NSS_PIN GPIO_Pin_7
#define MF522_NSS_PORT GPIOA
#define MF522_NSS_CLK RCC_APB2Periph_GPIOA
#define RST_H GPIO_SetBits(MF522_RST_PORT, MF522_RST_PIN)
#define RST_L GPIO_ResetBits(MF522_RST_PORT, MF522_RST_PIN)
#define MOSI_H GPIO_SetBits(MF522_MOSI_PORT, MF522_MOSI_PIN)
#define MOSI_L GPIO_ResetBits(MF522_MOSI_PORT, MF522_MOSI_PIN)
#define SCK_H GPIO_SetBits(MF522_SCK_PORT, MF522_SCK_PIN)
#define SCK_L GPIO_ResetBits(MF522_SCK_PORT, MF522_SCK_PIN)
#define NSS_H GPIO_SetBits(MF522_NSS_PORT, MF522_NSS_PIN)
#define NSS_L GPIO_ResetBits(MF522_NSS_PORT, MF522_NSS_PIN)
#define READ_MISO GPIO_ReadInputDataBit(MF522_MISO_PORT, MF522_MISO_PIN)
// 函数原型
void PcdInit(void);
char PcdReset(void);
void PcdAntennaOn(void);
void PcdAntennaOff(void);
char PcdRequest(unsigned char req_code,unsigned char *pTagType);
char PcdAnticoll(unsigned char *pSnr);
char PcdSelect(unsigned char *pSnr);
char PcdAuthState(unsigned char auth_mode,unsigned char addr,unsigned char *pKey,unsigned char *pSnr);
char PcdRead(unsigned char addr,unsigned char *pData);
char PcdWrite(unsigned char addr,unsigned char *pData);
char PcdValue(unsigned char dd_mode,unsigned char add