基于stm32f103rct6(秉火mini板)的rc522RFID读卡例程
生活随笔
收集整理的這篇文章主要介紹了
基于stm32f103rct6(秉火mini板)的rc522RFID读卡例程
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
主要代碼
#main.c
#include "stm32f10x.h" #include "bsp_SysTick.h" #include "bsp_usart1.h" #include "rc522_config.h" #include "rc522_function.h" #include <stdbool.h> #include "bsp_lcd.h" #include "./font/fonts.h"void IC_test ( void ) {char cStr [ 30 ];uint8_t ucArray_ID [ 4 ]; /*?èoó′?·?IC?¨μ?ààDíoíUID(IC?¨DòáDo?)*/ uint8_t ucStatusReturn; /*·μ??×′ì? */ static uint8_t ucLineCount = 0; while ( 1 ){ /*?°?¨*/if ( ( ucStatusReturn = PcdRequest ( PICC_REQALL, ucArray_ID ) ) != MI_OK ) /*è?ê§°ü?ù′??°?¨*/ucStatusReturn = PcdRequest ( PICC_REQALL, ucArray_ID ); if ( ucStatusReturn == MI_OK ){/*·à3?×2£¨μ±óD?à???¨??è??áD′?÷2ù×÷·??§ê±£?·à3?í??ú???á′ó???D????ò?????DD2ù×÷£?*/if ( PcdAnticoll ( ucArray_ID ) == MI_OK ) {sprintf ( cStr, "The Card ID is: %02X%02X%02X%02X",ucArray_ID [ 0 ],ucArray_ID [ 1 ],ucArray_ID [ 2 ],ucArray_ID [ 3 ] );printf ( "%s\r\n",cStr ); ILI9341_DispStringLine_EN(LINE(ucLineCount), cStr );ucLineCount ++;if ( ucLineCount == 10 ) ucLineCount = 0;} } } }int main ( void ) {/*μ?′eê±?ó3?ê??ˉ*/SysTick_Init (); /*USART1 ?????£ê??a 115200 8-N-1£??D???óê? */USART1_Config (); /*RC522?£?é?ùDèíaéèμ?3?ê??ˉ????*/RC522_Init (); /*LCD 3?ê??ˉ*/LCD_Init (); ILI9341_GramScan ( 6 );printf ( "RC522 Test\n" );LCD_SetFont(&Font8x16);LCD_SetColors(RED,BLACK);/* ???á£???ê?è?oú */ILI9341_Clear(0,0,LCD_X_LENGTH,LCD_Y_LENGTH); ILI9341_DispStringLine_EN(LINE(13), "please put your ic card in rc522 area" );LCD_SetTextColor(BLUE);PcdReset ();/*éè??1¤×÷·?ê?*/M500PcdConfigISOType ( 'A' );while ( 1 ){/*IC?¨?ì2a */IC_test ();} }#rc522_function.c
#include "rc522_function.h" #include "rc522_config.h" #include "stm32f10x.h" #include "bsp_SysTick.h" /*0éè??μ??é0ó?óú′?·?3§éì′ú??£?2??é?ü??£??a32??£?4byte*/ /*????éè??μ??é0£??é1£?2êy?Y?é£??éó?óú′?′¢êy?Y£????é16×??ú*/ /*????éè??μ??é3?a?????é£?°üo??ü??A£?′?è?????£??ü??B*/ /*àyè? A0 A1 A2 A3 A4 A5 | FF 07 80 69 | B0 B1 B2 B3 B4 B5 ?ü??A£¨6×??ú£? | ′?è????? | ?ü??B£¨6×??ú£? */ /*M1?¨óD16??éè???£12óD64???é£?°′????μ??·±ào??a?°0~63*/ #define RC522_DELAY() Delay_us ( 200 )/*** @brief ?òRC522·¢?í1 Byte êy?Y* @param byte£?òa·¢?íμ?êy?Y* @retval RC522·μ??μ?êy?Y*/ void SPI_RC522_SendByte ( uint8_t byte )/*?òrc522·¢?í1 byteêy?Y*/ {uint8_t counter;/*??êy*/for(counter=0;counter<8;counter++){ if ( byte & 0x80 )/*è?byte×??????a1£??òMOSI?a1£?byte×??????a0£????′MOSI?a0*/RC522_MOSI_1 ();else RC522_MOSI_0 ();RC522_DELAY();/*Delay_us ( 200 )*/RC522_SCK_0 ();/*í?MOSIòy??*/RC522_DELAY();/*í?é?*/RC522_SCK_1();RC522_DELAY();byte <<= 1; /*?′?abyte=byte<<1£?ò2?íê?byte=byte+1*/} }/*** @brief ′óRC522·¢?í1 Byte êy?Y* @param ?T* @retval RC522·μ??μ?êy?Y*/ uint8_t SPI_RC522_ReadByte ( void ) {uint8_t counter;uint8_t SPI_Data; /*??êy*/for(counter=0;counter<8;counter++){SPI_Data <<= 1;/*DATA=DATA+1*/RC522_SCK_0 ();RC522_DELAY();if ( RC522_MISO_GET() == 1)SPI_Data |= 0x01;RC522_DELAY();RC522_SCK_1 ();RC522_DELAY();}return SPI_Data;}/*** @brief ?áRC522??′??÷* @param ucAddress£???′??÷μ??·* @retval ??′??÷μ?μ±?°?μ*/ uint8_t ReadRawRC ( uint8_t ucAddress ) {uint8_t ucAddr, ucReturn;ucAddr = ( ( ucAddress << 1 ) & 0x7E ) | 0x80; RC522_CS_Enable();SPI_RC522_SendByte ( ucAddr );ucReturn = SPI_RC522_ReadByte ();RC522_CS_Disable();return ucReturn; }/*** @brief D′RC522??′??÷* @param ucAddress£???′??÷μ??·* @param ucValue£?D′è???′??÷μ??μ* @retval ?T*/ void WriteRawRC ( uint8_t ucAddress, uint8_t ucValue ) { uint8_t ucAddr;ucAddr = ( ucAddress << 1 ) & 0x7E; RC522_CS_Enable();SPI_RC522_SendByte ( ucAddr ); SPI_RC522_SendByte ( ucValue );RC522_CS_Disable(); }/*** @brief ??RC522??′??÷????* @param ucReg£???′??÷μ??·* @param ucMask£??????μ* @retval ?T*/ void SetBitMask ( uint8_t ucReg, uint8_t ucMask ) {uint8_t ucTemp;ucTemp = ReadRawRC ( ucReg );WriteRawRC ( ucReg, ucTemp | ucMask ); // set bit mask }/*** @brief ??RC522??′??÷????* @param ucReg£???′??÷μ??·* @param ucMask£??????μ* @retval ?T*/ void ClearBitMask ( uint8_t ucReg, uint8_t ucMask ) {uint8_t ucTemp;ucTemp = ReadRawRC ( ucReg );WriteRawRC ( ucReg, ucTemp & ( ~ ucMask) ); // clear bit mask }/*** @brief ?a??ìì?? * @param ?T* @retval ?T*/ void PcdAntennaOn ( void ) {uint8_t uc;uc = ReadRawRC ( TxControlReg );if ( ! ( uc & 0x03 ) )SetBitMask(TxControlReg, 0x03); }/*** @brief 1?±?ìì??* @param ?T* @retval ?T*/ void PcdAntennaOff ( void ) {ClearBitMask ( TxControlReg, 0x03 ); }/*** @brief ?′??RC522 * @param ?T* @retval ?T*/ void PcdReset ( void ) {RC522_Reset_Disable();Delay_us ( 1 );RC522_Reset_Enable();Delay_us ( 1 );RC522_Reset_Disable();Delay_us ( 1 );WriteRawRC ( CommandReg, 0x0f );while ( ReadRawRC ( CommandReg ) & 0x10 );Delay_us ( 1 );//?¨ò?·¢?íoí?óê?3£ó??£ê? oíMifare?¨í¨??£?CRC3?ê??μ0x6363WriteRawRC ( ModeReg, 0x3D ); WriteRawRC ( TReloadRegL, 30 ); //16???¨ê±?÷μí?? WriteRawRC ( TReloadRegH, 0 ); //16???¨ê±?÷????WriteRawRC ( TModeReg, 0x8D ); //?¨ò??ú2??¨ê±?÷μ?éè??WriteRawRC ( TPrescalerReg, 0x3E ); //éè???¨ê±?÷·??μ?μêyWriteRawRC ( TxAutoReg, 0x40 ); //μ÷??·¢?íD?o??a100%ASK }/*** @brief éè??RC522μ?1¤×÷·?ê?* @param ucType£?1¤×÷·?ê?* @retval ?T*/ void M500PcdConfigISOType ( uint8_t ucType ) {if ( ucType == 'A') //ISO14443_A{ClearBitMask ( Status2Reg, 0x08 );WriteRawRC ( ModeReg, 0x3D ); //3FWriteRawRC ( RxSelReg, 0x86 ); //84WriteRawRC( RFCfgReg, 0x7F ); //4FWriteRawRC( TReloadRegL, 30 ); WriteRawRC ( TReloadRegH, 0 );WriteRawRC ( TModeReg, 0x8D );WriteRawRC ( TPrescalerReg, 0x3E );Delay_us ( 2 );PcdAntennaOn ();//?aìì??} }/*** @brief í¨1yRC522oíISO14443?¨í¨??* @param ucCommand£?RC522?üá?×?* @param pInData£?í¨1yRC522·¢?íμ??¨??μ?êy?Y* @param ucInLenByte£?·¢?íêy?Yμ?×??ú3¤?è* @param pOutData£??óê?μ?μ??¨??·μ??êy?Y* @param pOutLenBit£?·μ??êy?Yμ???3¤?è* @retval ×′ì??μ= MI_OK£?3é1|*/ char PcdComMF522 ( uint8_t ucCommand,uint8_t * pInData, uint8_t ucInLenByte, uint8_t * pOutData,uint32_t * pOutLenBit ) {char cStatus = MI_ERR;uint8_t ucIrqEn = 0x00;uint8_t ucWaitFor = 0x00;uint8_t ucLastBits;uint8_t ucN;uint32_t ul;switch ( ucCommand ){case PCD_AUTHENT: //Mifareè??¤ucIrqEn = 0x12; //?êDí′í?ó?D?????óErrIEn ?êDí???D?D??IdleIEnucWaitFor = 0x10; //è??¤?°?¨μè′yê±oò 2é?ˉ???D?D??±ê????break;case PCD_TRANSCEIVE: //?óê?·¢?í ·¢?í?óê?ucIrqEn = 0x77; //?êDíTxIEn RxIEn IdleIEn LoAlertIEn ErrIEn TimerIEnucWaitFor = 0x30; //?°?¨μè′yê±oò 2é?ˉ?óê??D??±ê????ó? ???D?D??±ê????break;default:break; }//IRqInv????1ü??IRQó?Status1Regμ?IRq??μ??μ?à·′ WriteRawRC ( ComIEnReg, ucIrqEn | 0x80 );//Set1??????á?ê±£?CommIRqRegμ??á±?????á?ClearBitMask ( ComIrqReg, 0x80 ); //D′???D?üá?WriteRawRC ( CommandReg, PCD_IDLE ); //????FlushBuffer??3y?ú2?FIFOμ??áoíD′????ò??°ErrRegμ?BufferOvfl±ê????±???3ySetBitMask ( FIFOLevelReg, 0x80 ); for ( ul = 0; ul < ucInLenByte; ul ++ )WriteRawRC ( FIFODataReg, pInData [ ul ] ); //D′êy?Y??FIFOdataWriteRawRC ( CommandReg, ucCommand ); //D′?üá?if ( ucCommand == PCD_TRANSCEIVE )//StartSend???????ˉêy?Y·¢?í ????ó?ê?·¢?üá?ê1ó?ê±2?óDD§SetBitMask(BitFramingReg,0x80); ul = 1000; //?ù?Yê±?ó?μ?êμ÷??£?2ù×÷M1?¨×?′óμè′yê±??25msdo //è??¤ ó??°?¨μè′yê±?? {ucN = ReadRawRC ( ComIrqReg ); //2é?ˉê??t?D??ul --;} while ( ( ul != 0 ) && ( ! ( ucN & 0x01 ) ) && ( ! ( ucN & ucWaitFor ) ) ); ClearBitMask ( BitFramingReg, 0x80 ); //??àí?êDíStartSend??if ( ul != 0 ){//?á′í?ó±ê????′??÷BufferOfI CollErr ParityErr ProtocolErrif ( ! ( ReadRawRC ( ErrorReg ) & 0x1B ) ) {cStatus = MI_OK;if ( ucN & ucIrqEn & 0x01 ) //ê?·?·¢éú?¨ê±?÷?D??cStatus = MI_NOTAGERR; if ( ucCommand == PCD_TRANSCEIVE ){//?áFIFO?D±£′?μ?×??úêyucN = ReadRawRC ( FIFOLevelReg ); //×?oó?óê?μ?μ?×??úμ?óDD§??êyucLastBits = ReadRawRC ( ControlReg ) & 0x07; if ( ucLastBits )//N??×??úêy??è¥1£¨×?oóò???×??ú£?+×?oóò???μ???êy ?áè?μ?μ?êy?Y×ü??êy* pOutLenBit = ( ucN - 1 ) * 8 + ucLastBits; else* pOutLenBit = ucN * 8; //×?oó?óê?μ?μ?×??ú????×??úóDD§if ( ucN == 0 ) ucN = 1; if ( ucN > MAXRLEN )ucN = MAXRLEN; for ( ul = 0; ul < ucN; ul ++ )pOutData [ ul ] = ReadRawRC ( FIFODataReg ); } } elsecStatus = MI_ERR; }SetBitMask ( ControlReg, 0x80 ); // stop timer nowWriteRawRC ( CommandReg, PCD_IDLE ); return cStatus; }/*** @brief ?°?¨* @param ucReq_code£??°?¨·?ê? = 0x52£??°?Dó|???ú?ùóD·?o?14443A±ê×?μ??¨£??°?¨·?ê?= 0x26£??°?′??è?DY??×′ì?μ??¨* @param pTagType£??¨??ààDí′ú??= 0x4400£?Mifare_UltraLight= 0x0400£?Mifare_One(S50)= 0x0200£?Mifare_One(S70)= 0x0800£?Mifare_Pro(X))= 0x4403£?Mifare_DESFire* @retval ×′ì??μ= MI_OK£?3é1|*/ char PcdRequest ( uint8_t ucReq_code, uint8_t * pTagType ) {char cStatus; uint8_t ucComMF522Buf [ MAXRLEN ]; uint32_t ulLen;//??àí??ê?MIFARECyptolμ¥?a?óí¨ò??°?ùóD?¨μ?êy?Yí¨D?±??ó?üμ??é??ClearBitMask ( Status2Reg, 0x08 );//·¢?íμ?×?oóò???×??úμ? ????WriteRawRC ( BitFramingReg, 0x07 );//TX1,TX21ü??μ?ê?3?D?o?′?μY?-·¢?íμ÷??μ?13.56μ??üá???2¨D?o?SetBitMask ( TxControlReg, 0x03 ); ucComMF522Buf [ 0 ] = ucReq_code; //′?è? ?¨???üá?×?cStatus = PcdComMF522 ( PCD_TRANSCEIVE, ucComMF522Buf,1, ucComMF522Buf,& ulLen ); //?°?¨ if ( ( cStatus == MI_OK ) && ( ulLen == 0x10 ) ) //?°?¨3é1|·μ???¨ààDí { * pTagType = ucComMF522Buf [ 0 ];* ( pTagType + 1 ) = ucComMF522Buf [ 1 ];}elsecStatus = MI_ERR;return cStatus; }/*** @brief ·à3?×2* @param pSnr£??¨??DòáDo?£?4×??ú* @retval ×′ì??μ= MI_OK£?3é1|*/ char PcdAnticoll ( uint8_t * pSnr ) {char cStatus;uint8_t uc, ucSnr_check = 0;uint8_t ucComMF522Buf [ MAXRLEN ]; uint32_t ulLen;//??MFCryptol On?? ??óD3é1|?′DDMFAuthent?üá?oó£?????2??ü????ClearBitMask ( Status2Reg, 0x08 );//??àí??′??÷ í£?1ê?·¢WriteRawRC ( BitFramingReg, 0x00); //??ValuesAfterColl?ùóD?óê?μ????ú3?í?oó±???3yClearBitMask ( CollReg, 0x80 ); ucComMF522Buf [ 0 ] = 0x93; //?¨??·à3?í??üá?ucComMF522Buf [ 1 ] = 0x20;cStatus = PcdComMF522 ( PCD_TRANSCEIVE, ucComMF522Buf,2, ucComMF522Buf,& ulLen); //ó??¨??í¨D?if ( cStatus == MI_OK) //í¨D?3é1|{for ( uc = 0; uc < 4; uc ++ ){* ( pSnr + uc ) = ucComMF522Buf [ uc ]; //?á3?UIDucSnr_check ^= ucComMF522Buf [ uc ];}if ( ucSnr_check != ucComMF522Buf [ uc ] )cStatus = MI_ERR; }SetBitMask ( CollReg, 0x80 );return cStatus; }/*** @brief ó?RC522????CRC16* @param pIndata£?????CRC16μ?êy×é* @param ucLen£?????CRC16μ?êy×é×??ú3¤?è* @param pOutData£?′?·??????á1?′?·?μ?ê×μ??·* @retval ?T*/ void CalulateCRC ( uint8_t * pIndata, uint8_t ucLen, uint8_t * pOutData ) {uint8_t uc, ucN;ClearBitMask(DivIrqReg,0x04);WriteRawRC(CommandReg,PCD_IDLE);SetBitMask(FIFOLevelReg,0x80);for ( uc = 0; uc < ucLen; uc ++)WriteRawRC ( FIFODataReg, * ( pIndata + uc ) ); WriteRawRC ( CommandReg, PCD_CALCCRC );uc = 0xFF;do {ucN = ReadRawRC ( DivIrqReg );uc --;} while ( ( uc != 0 ) && ! ( ucN & 0x04 ) );pOutData [ 0 ] = ReadRawRC ( CRCResultRegL );pOutData [ 1 ] = ReadRawRC ( CRCResultRegM ); }/*** @brief ???¨?¨??* @param pSnr£??¨??DòáDo?£?4×??ú* @retval ×′ì??μ= MI_OK£?3é1|*/ char PcdSelect ( uint8_t * pSnr ) {char ucN;uint8_t uc;uint8_t ucComMF522Buf [ MAXRLEN ]; uint32_t ulLen;ucComMF522Buf [ 0 ] = PICC_ANTICOLL1;ucComMF522Buf [ 1 ] = 0x70;ucComMF522Buf [ 6 ] = 0;for ( uc = 0; uc < 4; uc ++ ){ucComMF522Buf [ uc + 2 ] = * ( pSnr + uc );ucComMF522Buf [ 6 ] ^= * ( pSnr + uc );}CalulateCRC ( ucComMF522Buf, 7, & ucComMF522Buf [ 7 ] );ClearBitMask ( Status2Reg, 0x08 );ucN = PcdComMF522 ( PCD_TRANSCEIVE,ucComMF522Buf,9,ucComMF522Buf, & ulLen );if ( ( ucN == MI_OK ) && ( ulLen == 0x18 ) )ucN = MI_OK; elseucN = MI_ERR; return ucN; }/*** @brief ?é?¤?¨???ü??* @param ucAuth_mode£??ü???é?¤?£ê?= 0x60£??é?¤A?ü??£??ü???é?¤?£ê?= 0x61£??é?¤B?ü??* @param uint8_t ucAddr£??éμ??·* @param pKey£??ü?? * @param pSnr£??¨??DòáDo?£?4×??ú* @retval ×′ì??μ= MI_OK£?3é1|*/ char PcdAuthState ( uint8_t ucAuth_mode, uint8_t ucAddr, uint8_t * pKey,uint8_t * pSnr ) {char cStatus;uint8_t uc, ucComMF522Buf [ MAXRLEN ];uint32_t ulLen;ucComMF522Buf [ 0 ] = ucAuth_mode;ucComMF522Buf [ 1 ] = ucAddr;for ( uc = 0; uc < 6; uc ++ )ucComMF522Buf [ uc + 2 ] = * ( pKey + uc ); for ( uc = 0; uc < 6; uc ++ )ucComMF522Buf [ uc + 8 ] = * ( pSnr + uc ); cStatus = PcdComMF522 ( PCD_AUTHENT,ucComMF522Buf, 12,ucComMF522Buf,& ulLen );if ( ( cStatus != MI_OK ) || ( ! ( ReadRawRC ( Status2Reg ) & 0x08 ) ) )cStatus = MI_ERR; return cStatus; }/*** @brief D′êy?Yμ?M1?¨ò??é* @param uint8_t ucAddr£??éμ??·* @param pData£?D′è?μ?êy?Y£?16×??ú* @retval ×′ì??μ= MI_OK£?3é1|*/ char PcdWrite ( uint8_t ucAddr, uint8_t * pData ) {char cStatus;uint8_t uc, ucComMF522Buf [ MAXRLEN ];uint32_t ulLen;ucComMF522Buf [ 0 ] = PICC_WRITE;ucComMF522Buf [ 1 ] = ucAddr;CalulateCRC ( ucComMF522Buf, 2, & ucComMF522Buf [ 2 ] );cStatus = PcdComMF522 ( PCD_TRANSCEIVE,ucComMF522Buf,4, ucComMF522Buf,& ulLen );if ( ( cStatus != MI_OK ) || ( ulLen != 4 ) || ( ( ucComMF522Buf [ 0 ] & 0x0F ) != 0x0A ) )cStatus = MI_ERR; if ( cStatus == MI_OK ){//memcpy(ucComMF522Buf, pData, 16);for ( uc = 0; uc < 16; uc ++ )ucComMF522Buf [ uc ] = * ( pData + uc ); CalulateCRC ( ucComMF522Buf, 16, & ucComMF522Buf [ 16 ] );cStatus = PcdComMF522 ( PCD_TRANSCEIVE,ucComMF522Buf, 18, ucComMF522Buf,& ulLen );if ( ( cStatus != MI_OK ) || ( ulLen != 4 ) || ( ( ucComMF522Buf [ 0 ] & 0x0F ) != 0x0A ) )cStatus = MI_ERR; } return cStatus; }/*** @brief ?áè?M1?¨ò??éêy?Y* @param ucAddr£??éμ??·* @param pData£??á3?μ?êy?Y£?16×??ú* @retval ×′ì??μ= MI_OK£?3é1|*/ char PcdRead ( uint8_t ucAddr, uint8_t * pData ) {char cStatus;uint8_t uc, ucComMF522Buf [ MAXRLEN ]; uint32_t ulLen;ucComMF522Buf [ 0 ] = PICC_READ;ucComMF522Buf [ 1 ] = ucAddr;CalulateCRC ( ucComMF522Buf, 2, & ucComMF522Buf [ 2 ] );cStatus = PcdComMF522 ( PCD_TRANSCEIVE,ucComMF522Buf,4, ucComMF522Buf,& ulLen );if ( ( cStatus == MI_OK ) && ( ulLen == 0x90 ) ){for ( uc = 0; uc < 16; uc ++ )* ( pData + uc ) = ucComMF522Buf [ uc ]; }elsecStatus = MI_ERR; return cStatus; }/*** @brief ?üá??¨????è?DY??×′ì?* @param ?T* @retval ×′ì??μ= MI_OK£?3é1|*/ char PcdHalt( void ) {uint8_t ucComMF522Buf [ MAXRLEN ]; uint32_t ulLen;ucComMF522Buf [ 0 ] = PICC_HALT;ucComMF522Buf [ 1 ] = 0;CalulateCRC ( ucComMF522Buf, 2, & ucComMF522Buf [ 2 ] );PcdComMF522 ( PCD_TRANSCEIVE,ucComMF522Buf,4, ucComMF522Buf, & ulLen );return MI_OK; }void IC_CMT ( uint8_t * UID,uint8_t * KEY,uint8_t RW,uint8_t * Dat ) {uint8_t ucArray_ID [ 4 ] = { 0 }; //?èoó′?·?IC?¨μ?ààDíoíUID(IC?¨DòáDo?)PcdRequest ( 0x52, ucArray_ID ); //?°?¨PcdAnticoll ( ucArray_ID ); //·à3?×2PcdSelect ( UID ); //???¨?¨PcdAuthState ( 0x60, 0x10, KEY, UID );//D£?éif ( RW ) //?áD′????£?1ê??á£?0ê?D′PcdRead ( 0x10, Dat );else PcdWrite ( 0x10, Dat );PcdHalt (); }#rc522_config.c
#include "rc522_config.h" #include "stm32f10x.h"static void RC522_SPI_Config ( void );void RC522_Init ( void )/*3?ê??ˉrc522*/ {RC522_SPI_Config (); RC522_Reset_Disable(); RC522_CS_Disable(); }static void RC522_SPI_Config ( void )/*????SPI*/ {/* SPI_InitTypeDef SPI_InitStructure */GPIO_InitTypeDef GPIO_InitStructure;/*????SPI_RC522òy??£oCS*/RC522_GPIO_CS_CLK_FUN ( RC522_GPIO_CS_CLK, ENABLE );/*????ê±?óòy??*/GPIO_InitStructure.GPIO_Pin = RC522_GPIO_CS_PIN;/*????′??úòy??*/GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;/*????′?ê??ù?ê?a50mhz*/GPIO_InitStructure.GPIO_Mode = RC522_GPIO_CS_Mode;/*?????£ê?*/GPIO_Init(RC522_GPIO_CS_PORT, &GPIO_InitStructure);/*3?ê??ˉ*//*????SPI?a?aRC522òy??: SCK */RC522_GPIO_SCK_CLK_FUN ( RC522_GPIO_SCK_CLK, ENABLE );GPIO_InitStructure.GPIO_Pin = RC522_GPIO_SCK_PIN;GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;GPIO_InitStructure.GPIO_Mode = RC522_GPIO_SCK_Mode;GPIO_Init(RC522_GPIO_SCK_PORT, &GPIO_InitStructure);/*????SPI-RC522òy??£oMOSI*/RC522_GPIO_MOSI_CLK_FUN ( RC522_GPIO_MOSI_CLK, ENABLE );GPIO_InitStructure.GPIO_Pin = RC522_GPIO_MOSI_PIN;GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;GPIO_InitStructure.GPIO_Mode = RC522_GPIO_MOSI_Mode;GPIO_Init(RC522_GPIO_MOSI_PORT, &GPIO_InitStructure);/*????SPI-RC522òy??: MISO */RC522_GPIO_MISO_CLK_FUN ( RC522_GPIO_MISO_CLK, ENABLE );GPIO_InitStructure.GPIO_Pin = RC522_GPIO_MISO_PIN;GPIO_InitStructure.GPIO_Mode = RC522_GPIO_MISO_Mode;GPIO_Init(RC522_GPIO_MISO_PORT, &GPIO_InitStructure); /*????SPI-RC522òy??: RST */RC522_GPIO_RST_CLK_FUN ( RC522_GPIO_RST_CLK, ENABLE );GPIO_InitStructure.GPIO_Pin = RC522_GPIO_RST_PIN;GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;GPIO_InitStructure.GPIO_Mode = RC522_GPIO_RST_Mode;GPIO_Init(RC522_GPIO_RST_PORT, &GPIO_InitStructure);}此例程用于野火秉火mini板實現
板子與rc522的連接如圖
各引腳連接如圖
以上;供初學者學習使用。
完整工程在下方鏈接。
F103_MINI-RC522例程工程下載
總結
以上是生活随笔為你收集整理的基于stm32f103rct6(秉火mini板)的rc522RFID读卡例程的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【高老师软件需求分析】20级云班课习题答
- 下一篇: 突破微软远程桌面帧率限制