最近用到了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, 下載次數: 395)
2021-1-4 21:41 上傳
點擊文件名下載附件
已經調試 下載積分: 黑幣 -5
|