欧美极品高清xxxxhd,国产日产欧美最新,无码AV国产东京热AV无码,国产精品人与动性XXX,国产传媒亚洲综合一区二区,四库影院永久国产精品,毛片免费免费高清视频,福利所导航夜趣136
標題:
基于stm32F103xxx與RFID-RC522的門禁程序
[打印本頁]
作者:
沐浴
時間:
2021-1-4 20:37
標題:
基于stm32F103xxx與RFID-RC522的門禁程序
最近用到了RFID-RC522,找了很多資料,總結(jié)了一下 順便和大家分享分享。 再本人的項目中RFID只是用來起到刷卡開門的效果,順帶用串口打印顯示ID號。 需要的朋友自行下載。
RD
連線如下:
//SPI2_SCK PB13
//SPI2_MISO PB14
//SPI2_MOSI PB15
//RCC522_RST PC4
//RCC522_SDA PB0
//RCC522_IRQ 懸空(不管)
直接移植久好 驅(qū)動是全的
#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單向或者雙向的數(shù)據(jù)模式:SPI設置為雙線雙向全雙工
SPI_InitStructure.SPI_Mode = SPI_Mode_Master; //設置SPI工作模式:設置為主SPI
SPI_InitStructure.SPI_DataSize = SPI_DataSize_8b; //設置SPI的數(shù)據(jù)大小:SPI發(fā)送接收8位幀結(jié)構(gòu)
SPI_InitStructure.SPI_CPOL = SPI_CPOL_High; //串行同步時鐘的空閑狀態(tài)為高電平
// SPI_InitStructure.SPI_CPOL = SPI_CPOL_Low;
// SPI_InitStructure.SPI_CPHA = SPI_CPHA_1Edge; //串行同步時鐘的第一個跳變沿(下降)數(shù)據(jù)被采樣
SPI_InitStructure.SPI_CPHA = SPI_CPHA_2Edge; //串行同步時鐘的第二個跳變沿(上升)數(shù)據(jù)被采樣
SPI_InitStructure.SPI_NSS = SPI_NSS_Soft; //NSS信號由硬件(NSS管腳)還是軟件(使用SSI位)管理:內(nèi)部NSS信號有SSI位控制
//RC522 SPI通訊時鐘周期最小為100ns 即頻率最大為10MHZ
//RC522 數(shù)據(jù)在下降沿變化
SPI_InitStructure.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_256; //定義波特率預分頻的值:波特率預分頻值為256、傳輸速率36M/256=140.625KHz
SPI_InitStructure.SPI_FirstBit = SPI_FirstBit_MSB; //指定數(shù)據(jù)傳輸從MSB位還是LSB位開始:數(shù)據(jù)傳輸從MSB位開始
SPI_InitStructure.SPI_CRCPolynomial = 7; //CRC值計算的多項式
SPI_Init(SPI2, &SPI_InitStructure); //根據(jù)SPI_InitStruct中指定的參數(shù)初始化外設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();//關(guān)閉天線發(fā)射
delay_ms(10);
PcdAntennaOn();//開啟天線發(fā)射
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讀寫字節(jié)函數(shù)
- 隸屬模塊:STM32 SPI操作
- 函數(shù)屬性:外部,使用戶使用
- 參數(shù)說明:TxData:要寫入的字節(jié)
- 返回說明:讀取到的字節(jié)
- 函數(shù)說明:由于主機SPI通信時,在發(fā)送和接受時是同時進行的,即發(fā)送完了一個字節(jié)的數(shù)據(jù)后,也應當接受到一個字節(jié)的數(shù)據(jù)
(1)stm32先等待已發(fā)送的數(shù)據(jù)是否發(fā)送完成,如果沒有發(fā)送完成,并且進入循環(huán)200次,則表示發(fā)送錯誤,返回收到的值為0;
(2)如果發(fā)送完成,stm32從SPI1總線發(fā)送TxData
(3)stm32再等待接收的數(shù)據(jù)是否接收完成,如果沒有接收完成,并且進入循環(huán)200次,則表示接收錯誤,則返回值0
(4)如果接收完成了,則返回STm32讀取的最新的數(shù)據(jù)
stm32
------->等待已發(fā)送的數(shù)據(jù)是否完成
OK
------->
stm32發(fā)送數(shù)據(jù)
------->等待待接收的數(shù)據(jù)是否完成
OK
------->
stm32讀取數(shù)據(jù)
//SPIx 讀寫一個字節(jié)
//TxData:要寫入的字節(jié)
//返回值:讀取到的字節(jié)
***************************************************************************/
char SPI2_ReadWriteByte(u8 TxData)
{
while (SPI_I2S_GetFlagStatus(SPI2, SPI_I2S_FLAG_TXE) == RESET) //檢查指定的SPI標志位設置與否:發(fā)送緩存空標志位
{
;
}
SPI_I2S_SendData(SPI2, TxData); //通過外設SPIx發(fā)送一個數(shù)據(jù)
while (SPI_I2S_GetFlagStatus(SPI2, SPI_I2S_FLAG_RXNE) == RESET) //檢查指定的SPI標志位設置與否:接受緩存非空標志位
{
// retry++;
// if(retry>200)return 0;
;
}
return SPI_I2S_ReceiveData(SPI2); //返回通過SPIx最近接收的數(shù)據(jù)
}
// u8 SPI2_ReadWriteByte(u8 Byte)
// {
// while((SPI2->SR&0X02)==0); //等待發(fā)送區(qū)空
// SPI2->DR=Byte; //發(fā)送一個byte
// while((SPI2->SR&0X01)==0); //等待接收完一個byte
// return SPI2->DR; //返回收到的數(shù)據(jù)
// }
//******************************************************************/
//功 能:讀RC522寄存器
//參數(shù)說明: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寄存器
//參數(shù)說明: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寄存器位
//參數(shù)說明: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寄存器位
//參數(shù)說明: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) ;//定義發(fā)送和接收常用模式 和Mifare卡通訊,CRC初始值0x6363
WriteRawRC(TReloadRegL,30) ;//16位定時器低位 30
WriteRawRC(TReloadRegH,0) ;//16位定時器高位
WriteRawRC(TModeReg,0x8D) ;//定義內(nèi)部定時器的設置
WriteRawRC(TPrescalerReg,0x3E) ;//設置定時器分頻系數(shù)
WriteRawRC(TxASKReg,0x40) ;//調(diào)制發(fā)送信號為100%ASK
return MI_OK ;
}
//////////////////////////////////////////////////////////////////////
//設置RC522的工作方式
//////////////////////////////////////////////////////////////////////
char MF522PcdConfigISOType(unsigned char type)
{
if (type == 'A') //ISO14443_A
{
ClearBitMask(Status2Reg,0x08); //狀態(tài)2寄存器
WriteRawRC(ModeReg,0x3D); //3F //和Mifare卡通訊,CRC初始值0x6363
WriteRawRC(RxSelReg,0x86); //84 選擇內(nèi)部接收器設置,內(nèi)部模擬部分調(diào)制信號,發(fā)送數(shù)據(jù)后,延遲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;
}
//******************************************************************/
//開啟天線發(fā)射
//每次啟動或關(guān)閉天險發(fā)射之間應至少有1ms的間隔
//******************************************************************/
void PcdAntennaOn()
{
unsigned char i;
WriteRawRC(TxASKReg,0x40) ;
delay_us(10) ;
i = ReadRawRC(TxControlReg) ;
if(!(i&0x03))
SetBitMask(TxControlReg, 0x03);
i=ReadRawRC(TxASKReg) ;
}
//******************************************************************/
//關(guān)閉天線發(fā)射
//******************************************************************/
void PcdAntennaOff()
{
ClearBitMask(TxControlReg, 0x03);
}
//******************************************************************/
//功 能:通過RC522和ISO14443卡通訊
//參數(shù)說明:Command[IN]:RC522命令字
// pInData[IN]:通過RC522發(fā)送到卡片的數(shù)據(jù)
// InLenByte[IN]:發(fā)送數(shù)據(jù)的字節(jié)長度
// pOutData[OUT]:接收到的卡片返回數(shù)據(jù)
// *pOutLenBit[OUT]:返回數(shù)據(jù)的位長度
//******************************************************************/
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]) ; // 數(shù)據(jù)寫入FIFO
WriteRawRC(CommandReg, Command) ; // 命令寫入命令寄存器
if(Command == PCD_TRANSCEIVE)
SetBitMask(BitFramingReg,0x80) ; // 開始發(fā)送
i = 6000 ; //根據(jù)時鐘頻率調(diào)整,操作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;
}
//******************************************************************/
//功 能:尋卡 /
//參數(shù)說明: req_code[IN]:尋卡方式 /
// 0x52 = 尋感應區(qū)內(nèi)所有符合14443A標準的卡 /
// 0x26 = 尋未進入休眠狀態(tài)的卡 /
// 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,傳遞調(diào)制的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 ;
}
//******************************************************************/
//功 能:防沖撞 /
//參數(shù)說明: pSnr[OUT]:卡片序列號,4字節(jié) /
//返 回: 成功返回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);//表示最后一個字節(jié)所有位都發(fā)送
ClearBitMask(CollReg,0x80);//CollRegCollReg0沖突結(jié)束后沖突位被置零
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;
}
/////////////////////////////////////////////////////////////////////
//功 能:選定卡片
//參數(shù)說明: pSnr[IN]:卡片序列號,4字節(jié)
//返 回: 成功返回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;
}
//******************************************************************/
//功 能:驗證卡片密碼
//參數(shù)說明: auth_mode[IN]: 密碼驗證模式
// 0x60 = 驗證A密鑰
// 0x61 = 驗證B密鑰
// addr[IN]:塊地址
// pKey[IN]:密碼
// pSnr[IN]:卡片序列號,4字節(jié)
//返 回: 成功返回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卡一塊數(shù)據(jù)
//參數(shù)說明: addr[IN]:塊地址
// pData[OUT]:讀出的數(shù)據(jù),16字節(jié)
//返 回: 成功返回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卡一塊數(shù)據(jù)
//參數(shù)說明: addr[IN]:塊地址
// pData[OUT]:讀出的數(shù)據(jù),16字節(jié)
//返 回: 成功返回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 ;
}
//******************************************************************/
//功 能:寫數(shù)據(jù)到M1卡一塊
//參數(shù)說明: addr[IN]:塊地址
// pData[IN]:寫入的數(shù)據(jù),16字節(jié)
//返 回: 成功返回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 ;
}
//******************************************************************/
//功 能:寫數(shù)據(jù)到M1卡一塊
//參數(shù)說明: addr[IN]:塊地址
// pData[IN]:寫入的數(shù)據(jù),16字節(jié)
//返 回: 成功返回MI_OK
//******************************************************************/
//******************************************************************/
//用MF522計算CRC16函數(shù)
//******************************************************************/
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所有數(shù)據(jù)被處理完畢該位置位
pOutData[0] = ReadRawRC(CRCResultRegL);//顯示計算出來的CRC值
pOutData[1] = ReadRawRC(CRCResultRegM);
}
//==============================================================================
//讀取卡的類型
//讀取卡的ID號
// 卡片:12AAD52D
// 卡環(huán):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"); //發(fā)送換行指令
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, 下載次數(shù): 395)
2021-1-4 21:41 上傳
點擊文件名下載附件
已經(jīng)調(diào)試
下載積分: 黑幣 -5
作者:
quzhihong
時間:
2021-1-27 14:54
感謝老鐵,資料非常好。謝謝了
作者:
殺死比亞
時間:
2021-2-7 10:59
很不錯,在網(wǎng)上很少有直接移植,就能成功程序,樓主的很不錯,燒錄好以后就能直接用
作者:
fxx1369
時間:
2021-2-19 10:10
太感謝了,驅(qū)動移植很方便
作者:
uuuiii66
時間:
2021-4-27 01:22
樓主您好,我怎么找不到Uart1_SendHexDisplay這個函數(shù)的定義。您能告訴我嗎?
作者:
zgt1480
時間:
2022-3-24 15:09
我想知道實物實現(xiàn)需要買什么硬件,或者說識別模塊
作者:
耿曉峰
時間:
2022-10-18 13:49
樓主的很不錯,燒錄好以后就能直接用
歡迎光臨 (http://www.raoushi.com/bbs/)
Powered by Discuz! X3.1