最近用到了RFID-RC522,找了很多资料,总结了一下 顺便和大家分享分享。 再本人的项目中RFID只是用来起到刷卡开门的效果,顺带用串口打印显示ID号。 需要的朋友自行下载。
RD
连线如下:
//SPI2_SCK PB13
//SPI2_MISO PB14
//SPI2_MOSI PB15
//RCC522_RST PC4
//RCC522_SDA PB0
//RCC522_IRQ 悬空(不管)
直接移植久好 驱动是全的
- #include "rc522.h"
- //SPI2_SCK PB13
- //SPI2_MISO PB14
- //SPI2_MOSI PB15
- //RCC522_RST(CE) PC4
- //RCC522_NSS(SDA)PB0
- //RCC522_IRQ 悬空
- void SPI2_Init(void)
- {
- GPIO_InitTypeDef GPIO_InitStructure;
- SPI_InitTypeDef SPI_InitStructure;
- RCC_APB2PeriphClockCmd( RCC_APB2Periph_GPIOB|RCC_APB2Periph_GPIOC, ENABLE ); //PORTB时钟使能
- RCC_APB1PeriphClockCmd( RCC_APB1Periph_SPI2, ENABLE ); //SPI2时钟使能
- GPIO_InitStructure.GPIO_Pin = GPIO_Pin_13 | GPIO_Pin_14 | GPIO_Pin_15;
- GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; //PB13/14/15复用推挽输出
- GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
- GPIO_Init(GPIOB, &GPIO_InitStructure); //初始化GPIOB
- GPIO_SetBits(GPIOB,GPIO_Pin_13|GPIO_Pin_14|GPIO_Pin_15); //PB13/14/15上拉
-
- GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0; //PB0 RC522_CS
- GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; //PB0推挽输出
- GPIO_Init(GPIOB, &GPIO_InitStructure); //初始化GPIOB
- GPIO_SetBits(GPIOB,GPIO_Pin_0); //PB0上拉
- GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4; //PC4 RC522_RST
- GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; //推挽输出
- GPIO_Init(GPIOC, &GPIO_InitStructure); //初始化GPIOC
- GPIO_SetBits(GPIOC,GPIO_Pin_4); //PC4
- SPI_InitStructure.SPI_Direction = SPI_Direction_2Lines_FullDuplex; //设置SPI单向或者双向的数据模式:SPI设置为双线双向全双工
- SPI_InitStructure.SPI_Mode = SPI_Mode_Master; //设置SPI工作模式:设置为主SPI
- SPI_InitStructure.SPI_DataSize = SPI_DataSize_8b; //设置SPI的数据大小:SPI发送接收8位帧结构
- SPI_InitStructure.SPI_CPOL = SPI_CPOL_High; //串行同步时钟的空闲状态为高电平
- // SPI_InitStructure.SPI_CPOL = SPI_CPOL_Low;
- // SPI_InitStructure.SPI_CPHA = SPI_CPHA_1Edge; //串行同步时钟的第一个跳变沿(下降)数据被采样
- SPI_InitStructure.SPI_CPHA = SPI_CPHA_2Edge; //串行同步时钟的第二个跳变沿(上升)数据被采样
- SPI_InitStructure.SPI_NSS = SPI_NSS_Soft; //NSS信号由硬件(NSS管脚)还是软件(使用SSI位)管理:内部NSS信号有SSI位控制
- //RC522 SPI通讯时钟周期最小为100ns 即频率最大为10MHZ
- //RC522 数据在下降沿变化
- SPI_InitStructure.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_256; //定义波特率预分频的值:波特率预分频值为256、传输速率36M/256=140.625KHz
- SPI_InitStructure.SPI_FirstBit = SPI_FirstBit_MSB; //指定数据传输从MSB位还是LSB位开始:数据传输从MSB位开始
- SPI_InitStructure.SPI_CRCPolynomial = 7; //CRC值计算的多项式
- SPI_Init(SPI2, &SPI_InitStructure); //根据SPI_InitStruct中指定的参数初始化外设SPIx寄存器
- SPI_Cmd(SPI2, ENABLE); //使能SPI外设
- RC522_CS=0;
- SPI2_ReadWriteByte(0xaa);//启动传输
- RC522_CS=1;
-
- delay_ms(50);
- PcdReset();//复位RC522读卡器
- delay_ms(10);
- PcdReset();//复位RC522读卡器
- delay_ms(10);
- PcdAntennaOff();//关闭天线发射
- delay_ms(10);
- PcdAntennaOn();//开启天线发射
- printf("RFID-MFRC522 TEST\r\nFindCard Starting ...\r\n"); //测试引脚初始化完成
- }
- void delay_ns(u32 ns)
- {
- u32 i;
- for(i=0;i<ns;i++)
- {
- __nop();
- __nop();
- __nop();
- }
- }
- /***************************************************************************
- - 功能描述:STM32f103 SPI读写字节函数
- - 隶属模块:STM32 SPI操作
- - 函数属性:外部,使用户使用
- - 参数说明:TxData:要写入的字节
- - 返回说明:读取到的字节
- - 函数说明:由于主机SPI通信时,在发送和接受时是同时进行的,即发送完了一个字节的数据后,也应当接受到一个字节的数据
- (1)stm32先等待已发送的数据是否发送完成,如果没有发送完成,并且进入循环200次,则表示发送错误,返回收到的值为0;
- (2)如果发送完成,stm32从SPI1总线发送TxData
- (3)stm32再等待接收的数据是否接收完成,如果没有接收完成,并且进入循环200次,则表示接收错误,则返回值0
- (4)如果接收完成了,则返回STm32读取的最新的数据
-
- stm32
- ------->等待已发送的数据是否完成
- OK
- ------->
- stm32发送数据
- ------->等待待接收的数据是否完成
- OK
- ------->
- stm32读取数据
- //SPIx 读写一个字节
- //TxData:要写入的字节
- //返回值:读取到的字节
- ***************************************************************************/
- char SPI2_ReadWriteByte(u8 TxData)
- {
- while (SPI_I2S_GetFlagStatus(SPI2, SPI_I2S_FLAG_TXE) == RESET) //检查指定的SPI标志位设置与否:发送缓存空标志位
- {
- ;
- }
- SPI_I2S_SendData(SPI2, TxData); //通过外设SPIx发送一个数据
- while (SPI_I2S_GetFlagStatus(SPI2, SPI_I2S_FLAG_RXNE) == RESET) //检查指定的SPI标志位设置与否:接受缓存非空标志位
- {
- // retry++;
- // if(retry>200)return 0;
- ;
- }
- return SPI_I2S_ReceiveData(SPI2); //返回通过SPIx最近接收的数据
- }
- // u8 SPI2_ReadWriteByte(u8 Byte)
- // {
- // while((SPI2->SR&0X02)==0); //等待发送区空
- // SPI2->DR=Byte; //发送一个byte
- // while((SPI2->SR&0X01)==0); //等待接收完一个byte
- // return SPI2->DR; //返回收到的数据
- // }
- //******************************************************************/
- //功 能:读RC522寄存器
- //参数说明:Address[IN]:寄存器地址
- //返 回:读出的值
- //******************************************************************/
- unsigned char ReadRawRC(unsigned char Address)
- {
- u8 ucAddr;
- u8 ucResult=0;
- RC522_CS=0;
- delay_us(10);
- ucAddr = ((Address<<1)&0x7E)|0x80;
- SPI2_ReadWriteByte(ucAddr);
- delay_us(10);
- ucResult=SPI2_ReadWriteByte(0);
- delay_us(10);
- RC522_CS=1;
- return ucResult;
- }
- //******************************************************************/
- //功 能:写RC522寄存器
- //参数说明:Address[IN]:寄存器地址
- // value[IN]:写入的值
- //******************************************************************/
- void WriteRawRC(unsigned char Address, unsigned char value)
- {
- u8 ucAddr;
- RC522_CS=0;
- delay_us(10);
- ucAddr = ((Address<<1)&0x7E) ;
- SPI2_ReadWriteByte(ucAddr);
- delay_us(10);
- SPI2_ReadWriteByte(value);
- delay_us(10);
- RC522_CS=1;
- }
- //******************************************************************/
- //功 能:置RC522寄存器位
- //参数说明:reg[IN]:寄存器地址
- // mask[IN]:置位值
- //******************************************************************/
- void SetBitMask(unsigned char reg,unsigned char mask)
- {
- char tmp = 0x0 ;
- tmp = ReadRawRC(reg)| mask;
- WriteRawRC(reg,tmp | mask); // set bit mask
- }
- //******************************************************************/
- //功 能:清RC522寄存器位
- //参数说明:reg[IN]:寄存器地址
- // mask[IN]:清位值
- //******************************************************************/
- void ClearBitMask(unsigned char reg,unsigned char mask)
- {
- char tmp = 0x0 ;
- tmp = ReadRawRC(reg)&(~mask);
- WriteRawRC(reg, tmp) ; // clear bit mask
- }
- //******************************************************************/
- //功 能:复位RC522
- //返 回: 成功返回MI_OK
- //******************************************************************/
- char PcdReset()
- {
- RC522_RST=1; ;
- delay_ns(10) ;
- RC522_RST=0; ;
- delay_ns(100) ;
- RC522_RST=1; ;
- delay_ns(10) ;
- WriteRawRC(CommandReg,PCD_RESETPHASE);
- delay_ns(100) ;
- WriteRawRC(ModeReg,0x3D) ;//定义发送和接收常用模式 和Mifare卡通讯,CRC初始值0x6363
- WriteRawRC(TReloadRegL,30) ;//16位定时器低位 30
- WriteRawRC(TReloadRegH,0) ;//16位定时器高位
- WriteRawRC(TModeReg,0x8D) ;//定义内部定时器的设置
- WriteRawRC(TPrescalerReg,0x3E) ;//设置定时器分频系数
- WriteRawRC(TxASKReg,0x40) ;//调制发送信号为100%ASK
- return MI_OK ;
- }
- //////////////////////////////////////////////////////////////////////
- //设置RC522的工作方式
- //////////////////////////////////////////////////////////////////////
- char MF522PcdConfigISOType(unsigned char type)
- {
- if (type == 'A') //ISO14443_A
- {
- ClearBitMask(Status2Reg,0x08); //状态2寄存器
- WriteRawRC(ModeReg,0x3D); //3F //和Mifare卡通讯,CRC初始值0x6363
- WriteRawRC(RxSelReg,0x86); //84 选择内部接收器设置,内部模拟部分调制信号,发送数据后,延迟6个位时钟,接收
- WriteRawRC(RFCfgReg,0x7F); //4F 配置接收器 48dB最大增益
- WriteRawRC(TReloadRegL,30); //tmoLength);TReloadVal = 'h6a =tmoLength(dec)
- WriteRawRC(TReloadRegH,0); //实际值是OXD3E 这部分主要是设置定时器寄存器
- WriteRawRC(TModeReg,0x8D);
- WriteRawRC(TPrescalerReg,0x3E);
- delay_ns(1000);
- PcdAntennaOn();
- }
- else {return 0xFE;}
- return MI_OK;
- }
- //******************************************************************/
- //开启天线发射
- //每次启动或关闭天险发射之间应至少有1ms的间隔
- //******************************************************************/
- void PcdAntennaOn()
- {
- unsigned char i;
- WriteRawRC(TxASKReg,0x40) ;
- delay_us(10) ;
- i = ReadRawRC(TxControlReg) ;
- if(!(i&0x03))
- SetBitMask(TxControlReg, 0x03);
- i=ReadRawRC(TxASKReg) ;
- }
- //******************************************************************/
- //关闭天线发射
- //******************************************************************/
- void PcdAntennaOff()
- {
- ClearBitMask(TxControlReg, 0x03);
- }
- //******************************************************************/
- //功 能:通过RC522和ISO14443卡通讯
- //参数说明:Command[IN]:RC522命令字
- // pInData[IN]:通过RC522发送到卡片的数据
- // InLenByte[IN]:发送数据的字节长度
- // pOutData[OUT]:接收到的卡片返回数据
- // *pOutLenBit[OUT]:返回数据的位长度
- //******************************************************************/
- char PcdComMF522(unsigned char Command ,unsigned char *pInData ,
- unsigned char InLenByte,unsigned char *pOutData,
- unsigned int *pOutLenBit )
- {
- char status = MI_ERR ;
- unsigned char irqEn = 0x00 ;
- unsigned char waitFor = 0x00 ;
- unsigned char lastBits ;
- unsigned char n ;
- unsigned int i ;
- switch (Command)
- {
- case PCD_AUTHENT:
- irqEn = 0x12 ;
- waitFor = 0x10 ;
- break ;
- case PCD_TRANSCEIVE:
- irqEn = 0x77 ;
- waitFor = 0x30 ;
- break ;
- default:
- break ;
- }
- WriteRawRC(ComIEnReg,irqEn|0x80) ; //
- ClearBitMask(ComIrqReg,0x80) ;
- WriteRawRC(CommandReg,PCD_IDLE) ;
- SetBitMask(FIFOLevelReg,0x80) ; // 清空FIFO
- for(i=0; i<InLenByte; i++)
- WriteRawRC(FIFODataReg,pInData[i]) ; // 数据写入FIFO
- WriteRawRC(CommandReg, Command) ; // 命令写入命令寄存器
- if(Command == PCD_TRANSCEIVE)
- SetBitMask(BitFramingReg,0x80) ; // 开始发送
- i = 6000 ; //根据时钟频率调整,操作M1卡最大等待时间25ms
- do
- {
- n = ReadRawRC(ComIrqReg) ;
- i-- ;
- }
- while((i!=0)&&!(n&0x01)&&!(n&waitFor)) ;
- ClearBitMask(BitFramingReg,0x80) ;
- if(i!=0)
- {
- if(!(ReadRawRC(ErrorReg)&0x1B))
- {
- status = MI_OK ;
- if (n&irqEn&0x01)
- status = MI_NOTAGERR ;
- if(Command==PCD_TRANSCEIVE)
- {
- n = ReadRawRC(FIFOLevelReg) ;
- lastBits = ReadRawRC(ControlReg)&0x07 ;
- if(lastBits)
- *pOutLenBit = (n-1)*8 + lastBits ;
- else
- *pOutLenBit = n*8 ;
- if(n==0)
- n = 1 ;
- if(n>MAXRLEN)
- n = MAXRLEN ;
- for (i=0; i<n; i++)
- pOutData[i] = ReadRawRC(FIFODataReg) ;
- }
- }
- else
- status = MI_ERR ;
- }
- SetBitMask(ControlReg,0x80) ;// stop timer now
- WriteRawRC(CommandReg,PCD_IDLE) ;
- return status;
- }
- //******************************************************************/
- //功 能:寻卡 /
- //参数说明: req_code[IN]:寻卡方式 /
- // 0x52 = 寻感应区内所有符合14443A标准的卡 /
- // 0x26 = 寻未进入休眠状态的卡 /
- // pTagType[OUT]:卡片类型代码 /
- // 0x4400 = Mifare_UltraLight /
- // 0x0400 = Mifare_One(S50) /
- // 0x0200 = Mifare_One(S70) /
- // 0x0800 = Mifare_Pro(X) /
- // 0x4403 = Mifare_DESFire /
- //返 回: 成功返回MI_OK /
- //******************************************************************/
- char PcdRequest(unsigned char req_code,unsigned char *pTagType)
- {
- char status ;
- unsigned int unLen ;
- unsigned char ucComMF522Buf[MAXRLEN] ;
- ClearBitMask(Status2Reg,0x08) ;//清除MRCrypto1on,要用软件清零
- WriteRawRC(BitFramingReg,0x07) ;//startsend=0,rxalign=0,在FIFO中存放的位置,TXlastbit=7
- SetBitMask(TxControlReg,0x03) ;//TX2rfen=1,TX1RFen=1,传递调制的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 ;
- }
- //******************************************************************/
- //功 能:防冲撞 /
- //参数说明: pSnr[OUT]:卡片序列号,4字节 /
- //返 回: 成功返回MI_OK /
- //******************************************************************/
- char PcdAnticoll(unsigned char *pSnr)
- {
- char status;
- unsigned char i,snr_check=0;
- unsigned int unLen;
- unsigned char ucComMF522Buf[MAXRLEN];
-
- ClearBitMask(Status2Reg,0x08);//清除MRCrypto1on,要用软件清零
- WriteRawRC(BitFramingReg,0x00);//表示最后一个字节所有位都发送
- ClearBitMask(CollReg,0x80);//CollRegCollReg0冲突结束后冲突位被置零
-
- 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];
- snr_check ^= ucComMF522Buf[i];
- }
- if (snr_check != ucComMF522Buf[i])
- { status = MI_ERR; }
- }
-
- SetBitMask(CollReg,0x80);//CollRegCollReg 在106kbps良好的防冲突情况下该位置1
- return status;
- }
- /////////////////////////////////////////////////////////////////////
- //功 能:选定卡片
- //参数说明: pSnr[IN]:卡片序列号,4字节
- //返 回: 成功返回MI_OK
- /////////////////////////////////////////////////////////////////////
- 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);//清零MFcryon
- status = PcdComMF522(PCD_TRANSCEIVE,ucComMF522Buf,9,ucComMF522Buf,&unLen);
-
- if ((status == MI_OK) && (unLen == 0x18))
- { status = MI_OK; }
- else
- { status = MI_ERR; }
- return status;
- }
- //******************************************************************/
- //功 能:验证卡片密码
- //参数说明: auth_mode[IN]: 密码验证模式
- // 0x60 = 验证A密钥
- // 0x61 = 验证B密钥
- // addr[IN]:块地址
- // pKey[IN]:密码
- // pSnr[IN]:卡片序列号,4字节
- //返 回: 成功返回MI_OK
- //******************************************************************/
- 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;//验证A密钥
- ucComMF522Buf[1] = addr;//addr[IN]:块地址
- for (i=0; i<6; i++)
- { ucComMF522Buf[i+2] = *(pKey+i); }
- for (i=0; i<6; i++)
- { ucComMF522Buf[i+8] = *(pSnr+i); }
-
- status = PcdComMF522(PCD_AUTHENT,ucComMF522Buf,12,ucComMF522Buf,&unLen);
- if ((status != MI_OK) || (!(ReadRawRC(Status2Reg) & 0x08)))
- { status = MI_ERR; }
-
- return status;
- }
- //******************************************************************/
- //功 能:读取M1卡一块数据
- //参数说明: addr[IN]:块地址
- // pData[OUT]:读出的数据,16字节
- //返 回: 成功返回MI_OK
- //******************************************************************/
- 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;
- }
- //******************************************************************/
- //功 能:读取M1卡一块数据
- //参数说明: addr[IN]:块地址
- // pData[OUT]:读出的数据,16字节
- //返 回: 成功返回MI_OK
- //******************************************************************/
- char Read_Block(unsigned char Block,unsigned char *Buf)
- {
- char result ;
- result = PcdAuthState(0x60,Block,Password_Buffer,UID) ;
- if(result!=MI_OK)
- return result ;
- result = PcdRead(Block,Buf) ;
- // return result; // 2011.01.03
-
- if(result!=MI_OK) return result ;
- if(Block!=0x00&&des_on)
- {
- // Des_Decrypt((char *)Buf ,KK,(char *)Buf ) ;
- // Des_Decrypt((char *)&Buf[8],KK,(char *)&Buf[8]) ;
- }
- return SUCCESS ;
- }
- //******************************************************************/
- //功 能:写数据到M1卡一块
- //参数说明: addr[IN]:块地址
- // pData[IN]:写入的数据,16字节
- //返 回: 成功返回MI_OK
- //******************************************************************/
- 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)
- {
- 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)!= 0x0A))
- status = MI_ERR ;
- }
- return status ;
- }
- //******************************************************************/
- //功 能:写数据到M1卡一块
- //参数说明: addr[IN]:块地址
- // pData[IN]:写入的数据,16字节
- //返 回: 成功返回MI_OK
- //******************************************************************/
- //******************************************************************/
- //用MF522计算CRC16函数
- //******************************************************************/
- void CalulateCRC(unsigned char *pIndata,unsigned char len,unsigned char *pOutData)
- {
- unsigned char i,n;
- ClearBitMask(DivIrqReg,0x04);
- WriteRawRC(CommandReg,PCD_IDLE);//取消当前命令
- SetBitMask(FIFOLevelReg,0x80);//FlushBuffer 清除ErrReg 的标志位
- for (i=0; i<len; i++)
- { WriteRawRC(FIFODataReg, *(pIndata+i)); }
- WriteRawRC(CommandReg, PCD_CALCCRC);
- i = 0xFF;
- do
- {
- n = ReadRawRC(DivIrqReg);
- i--;
- }
- while ((i!=0) && !(n&0x04));//当CRCIRq所有数据被处理完毕该位置位
- pOutData[0] = ReadRawRC(CRCResultRegL);//显示计算出来的CRC值
- pOutData[1] = ReadRawRC(CRCResultRegM);
- }
- //==============================================================================
- //读取卡的类型
- //读取卡的ID号
- // 卡片:12AAD52D
- // 卡环:EC838322
- //==============================================================================
- void ReaderCard(void)
- {
- char temp_value;
- if(PcdRequest(PICC_REQALL,Temp)==MI_OK) //选卡
- {
- if(Temp[0]==0x04&&Temp[1]==0x00)
- printf("MFOne-S50");
- else if(Temp[0]==0x02&&Temp[1]==0x00)
- printf("MFOne-S70");
- else if(Temp[0]==0x44&&Temp[1]==0x00)
- printf("MF-UltraLight");
- else if(Temp[0]==0x08&&Temp[1]==0x00)
- printf("MF-Pro");
- else if(Temp[0]==0x44&&Temp[1]==0x03)
- printf("MF Desire");
- else
- printf("Unknown");
- if(PcdAnticoll(UID)==MI_OK) //防冲撞
- {
- printf("Card Id is:");
- /* 获取卡值 */
- Uart1_SendHexDisplay(UID[0]);
- Uart1_SendHexDisplay(UID[1]);
- Uart1_SendHexDisplay(UID[2]);
- Uart1_SendHexDisplay(UID[3]);
- printf("\r\n"); //发送换行指令
- temp_value = ((UID[0]>>4)*10+(UID[0]&0x0f));
- printf("管理员:%d\r\n",temp_value);
- // switch(temp_value)
- // {
- // case 12 : printf("管理员:%d\r\n",temp_value); break;
- // case 152: printf("学生 :%d\r\n",temp_value); break;
- // default : printf("无效卡:%d\r\n",temp_value); break;
- // }
- }
- }
- }
复制代码 全部程序51hei下载地址:
RFID_RC522.7z
(195.99 KB, 下载次数: 394)
|