暂时只贴代码
main.c

#include "public.h"int main(void)
{delay_init();           //延时函数初始化    uart_init(115200);        //串口初始化为115200LED_Init();               //初始化与LED连接的硬件接口OLED_Init();OLED_ShowString(0,0,"Welcome To STM32",16);RC522_Init();      //初始化射频卡模块printf("init is ok!\r\n");while(1){RC522_Handel();}
}

rc522.c

#include "sys.h"
#include "rc522.h"
#include "delay.h"
#include "usart.h"
#include "string.h"
#include "oled.h"
// M1卡分为16个扇区,每个扇区由四个块(块0、块1、块2、块3)组成
// 将16个扇区的64个块按绝对地址编号为:0~63
// 第0个扇区的块0(即绝对地址0块),用于存放厂商代码,已经固化不可更改
// 每个扇区的块0、块1、块2为数据块,可用于存放数据
// 每个扇区的块3为控制块(绝对地址为:块3、块7、块11.....)包括密码A,存取控制、密码B等/*******************************
*连线说明:
*1--SDA  <----->PA4
*2--SCK  <----->PA5
*3--MOSI <----->PA7
*4--MISO <----->PA6
*5--悬空
*6--GND <----->GND
*7--RST <----->PB0
*8--VCC <----->VCC
************************************/
//用于密码验证,密码错误将读卡失败(在块1中存储,卡默认密码,勿修改)
unsigned char DefaultKey[6] = {0xff, 0xff, 0xff, 0xff, 0xff, 0xff};
/*全局变量*/
unsigned char CT[2];//卡类型
unsigned char SN[4]; //卡号
unsigned char RFID[16];         //存放RFID
unsigned char total=0;
unsigned char card_1[4]={83,106,11,1};
unsigned char card_2[4]={208,121,31,57};
unsigned char card_3[4]={176,177,143,165};
unsigned char card_4[4]={5,158,10,136};
u8 KEY[6]={0xff,0xff,0xff,0xff,0xff,0xff};
u8 AUDIO_OPEN[6] = {0xAA, 0x07, 0x02, 0x00, 0x09, 0xBC};
unsigned char RFID1[16]={0x00,0x00,0x00,0x00,0x00,0x00,0xff,0x07,0x80,0x29,0xff,0xff,0xff,0xff,0xff,0xff};
/*函数声明*/
unsigned char status;
unsigned char s=0x08;#define   RC522_DELAY()  delay_us( 20 )
void RC522_Handel(void)
{char cStr [ 30 ], tStr[30];unsigned char ucArray_ID [16],mi[16];   /*先后存放IC卡的类型和UID(IC卡序列号)*/                                                                                          uint8_t ucStatusReturn;     /*返回状态 */  if ( ( ucStatusReturn = PcdRequest ( PICC_REQALL, ucArray_ID ) ) != MI_OK )  /*寻卡*/ucStatusReturn = PcdRequest ( PICC_REQALL, ucArray_ID );/*若失败再次寻卡*/if ( ucStatusReturn == MI_OK  ){  /*防冲撞(当有多张卡进入读写器操作范围时,防冲突机制会从其中选择一张进行操作)*/if ( PcdAnticoll ( ucArray_ID ) == MI_OK )                                                                   {sprintf ( cStr, "IDcard is:%02X%02X%02X%02X",ucArray_ID[0],ucArray_ID[1],ucArray_ID[2],ucArray_ID[3]);printf ( "%s\r\n",cStr);}      }
}void RC522_Init ( void )
{SPI1_Init();RC522_Reset_Disable();RC522_CS_Disable();PcdReset ();M500PcdConfigISOType ( 'A' );//设置工作方式
}void SPI1_Init(void)
{GPIO_InitTypeDef GPIO_InitStructure;RCC_APB2PeriphClockCmd(    RCC_APB2Periph_GPIOA | RCC_APB2Periph_GPIOB, ENABLE );//PORTB时钟使能 // CSGPIO_InitStructure.GPIO_Pin = GPIO_Pin_4;    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;       //推挽输出GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;        //IO口速度为50MHzGPIO_Init(GPIOA, &GPIO_InitStructure);                     //根据设定参数初始化PF0、PF1// SCKGPIO_InitStructure.GPIO_Pin = GPIO_Pin_5;  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;       //推挽输出GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;        //IO口速度为50MHzGPIO_Init(GPIOA, &GPIO_InitStructure);// MISOGPIO_InitStructure.GPIO_Pin = GPIO_Pin_6;    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;          //推挽输出GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;        //IO口速度为50MHzGPIO_Init(GPIOA, &GPIO_InitStructure);// MOSIGPIO_InitStructure.GPIO_Pin = GPIO_Pin_7;    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;       //推挽输出GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;        //IO口速度为50MHzGPIO_Init(GPIOA, &GPIO_InitStructure);// RSTGPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;     GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;       //推挽输出GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;        //IO口速度为50MHzGPIO_Init(GPIOB, &GPIO_InitStructure);
}/** 函数名:SPI_RC522_SendByte* 描述  :向RC522发送1 Byte 数据* 输入  :byte,要发送的数据* 返回  : RC522返回的数据* 调用  :内部调用*/
void SPI_RC522_SendByte ( u8 byte )
{u8 counter;for(counter = 0; counter < 8; counter++){     if ( byte & 0x80 )RC522_MOSI_1 ();else RC522_MOSI_0 ();RC522_DELAY();RC522_SCK_0 ();RC522_DELAY();RC522_SCK_1();RC522_DELAY();byte <<= 1; }
}/** 函数名:SPI_RC522_ReadByte* 描述  :从RC522发送1 Byte 数据* 输入  :无* 返回  : RC522返回的数据* 调用  :内部调用*/
u8 SPI_RC522_ReadByte ( void )
{u8 counter;u8 SPI_Data;for(counter=0;counter<8;counter++){SPI_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;
}/** 函数名:ReadRawRC* 描述  :读RC522寄存器* 输入  :ucAddress,寄存器地址* 返回  : 寄存器的当前值* 调用  :内部调用*/
u8 ReadRawRC ( u8 ucAddress )
{u8 ucAddr, ucReturn;ucAddr = ( ( ucAddress << 1 ) & 0x7E ) | 0x80;RC522_CS_Enable();SPI_RC522_SendByte ( ucAddr );ucReturn = SPI_RC522_ReadByte ();RC522_CS_Disable();return ucReturn;
}/** 函数名:WriteRawRC* 描述  :写RC522寄存器* 输入  :ucAddress,寄存器地址*         ucValue,写入寄存器的值* 返回  : 无* 调用  :内部调用*/
void WriteRawRC ( u8 ucAddress, u8 ucValue )
{  u8 ucAddr;ucAddr = ( ucAddress << 1 ) & 0x7E;RC522_CS_Enable();SPI_RC522_SendByte ( ucAddr );SPI_RC522_SendByte ( ucValue );RC522_CS_Disable();
}/** 函数名:SetBitMask* 描述  :对RC522寄存器置位* 输入  :ucReg,寄存器地址*         ucMask,置位值* 返回  : 无* 调用  :内部调用*/
void SetBitMask ( u8 ucReg, u8 ucMask )
{u8 ucTemp;ucTemp = ReadRawRC ( ucReg );WriteRawRC ( ucReg, ucTemp | ucMask );         // set bit mask
}/** 函数名:ClearBitMask* 描述  :对RC522寄存器清位* 输入  :ucReg,寄存器地址*         ucMask,清位值* 返回  : 无* 调用  :内部调用*/
void ClearBitMask ( u8 ucReg, u8 ucMask )
{u8 ucTemp;ucTemp = ReadRawRC ( ucReg );WriteRawRC ( ucReg, ucTemp & ( ~ ucMask) );  // clear bit mask
}/** 函数名:PcdAntennaOn* 描述  :开启天线 * 输入  :无* 返回  : 无* 调用  :内部调用*/
void PcdAntennaOn ( void )
{u8 uc;uc = ReadRawRC ( TxControlReg );if ( ! ( uc & 0x03 ) )SetBitMask(TxControlReg, 0x03);
}/** 函数名:PcdAntennaOff* 描述  :开启天线 * 输入  :无* 返回  : 无* 调用  :内部调用*/
void PcdAntennaOff ( void )
{ClearBitMask ( TxControlReg, 0x03 );
}/** 函数名:PcdRese* 描述  :复位RC522 * 输入  :无* 返回  : 无* 调用  :外部调用*/
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 );WriteRawRC ( ModeReg, 0x3D );            //定义发送和接收常用模式 和Mifare卡通讯,CRC初始值0x6363WriteRawRC ( TReloadRegL, 30 );          //16位定时器低位    WriteRawRC ( TReloadRegH, 0 );               //16位定时器高位WriteRawRC ( TModeReg, 0x8D );                  //定义内部定时器的设置WriteRawRC ( TPrescalerReg, 0x3E );           //设置定时器分频系数WriteRawRC ( TxAutoReg, 0x40 );                //调制发送信号为100%ASK
}/** 函数名:M500PcdConfigISOType* 描述  :设置RC522的工作方式* 输入  :ucType,工作方式* 返回  : 无* 调用  :外部调用*/
void M500PcdConfigISOType ( u8 ucType )
{if ( ucType == 'A')                     //ISO14443_A{ClearBitMask ( Status2Reg, 0x08 );WriteRawRC ( ModeReg, 0x3D );//3FWriteRawRC ( RxSelReg, 0x86 );//84WriteRawRC( RFCfgReg, 0x7F );   //4FWriteRawRC( TReloadRegL, 30 );//tmoLength);// TReloadVal = 'h6a =tmoLength(dec) WriteRawRC ( TReloadRegH, 0 );WriteRawRC ( TModeReg, 0x8D );WriteRawRC ( TPrescalerReg, 0x3E );delay_us ( 2 );PcdAntennaOn ();//开天线}
}/** 函数名:PcdComMF522* 描述  :通过RC522和ISO14443卡通讯* 输入  :ucCommand,RC522命令字*         pInData,通过RC522发送到卡片的数据*         ucInLenByte,发送数据的字节长度*         pOutData,接收到的卡片返回数据*         pOutLenBit,返回数据的位长度* 返回  : 状态值*         = MI_OK,成功* 调用  :内部调用*/
char PcdComMF522 ( u8 ucCommand, u8 * pInData, u8 ucInLenByte, u8 * pOutData, u32 * pOutLenBit )
{char cStatus = MI_ERR;u8 ucIrqEn   = 0x00;u8 ucWaitFor = 0x00;u8 ucLastBits;u8 ucN;u32 ul;switch ( ucCommand ){case PCD_AUTHENT:        //Mifare认证ucIrqEn   = 0x12;        //允许错误中断请求ErrIEn  允许空闲中断IdleIEnucWaitFor = 0x10;       //认证寻卡等待时候 查询空闲中断标志位break;case PCD_TRANSCEIVE:      //接收发送 发送接收ucIrqEn   = 0x77;       //允许TxIEn RxIEn IdleIEn LoAlertIEn ErrIEn TimerIEnucWaitFor = 0x30;        //寻卡等待时候 查询接收中断标志位与 空闲中断标志位break; default:break; }WriteRawRC ( ComIEnReg, ucIrqEn | 0x80 );     //IRqInv置位管脚IRQ与Status1Reg的IRq位的值相反 ClearBitMask ( ComIrqReg, 0x80 );           //Set1该位清零时,CommIRqReg的屏蔽位清零WriteRawRC ( CommandReg, PCD_IDLE );     //写空闲命令SetBitMask ( FIFOLevelReg, 0x80 );           //置位FlushBuffer清除内部FIFO的读和写指针以及ErrReg的BufferOvfl标志位被清除for ( ul = 0; ul < ucInLenByte; ul ++ )WriteRawRC ( FIFODataReg, pInData [ ul ] );          //写数据进FIFOdataWriteRawRC ( CommandReg, ucCommand );                 //写命令if ( ucCommand == PCD_TRANSCEIVE )SetBitMask(BitFramingReg,0x80);                //StartSend置位启动数据发送 该位与收发命令使用时才有效ul = 1000;//根据时钟频率调整,操作M1卡最大等待时间25msdo                                                         //认证 与寻卡等待时间    {ucN = ReadRawRC ( ComIrqReg );                            //查询事件中断ul --;} while ( ( ul != 0 ) && ( ! ( ucN & 0x01 ) ) && ( ! ( ucN & ucWaitFor ) ) );        //退出条件i=0,定时器中断,与写空闲命令ClearBitMask ( BitFramingReg, 0x80 );                 //清理允许StartSend位if ( ul != 0 ){if ( ! (( ReadRawRC ( ErrorReg ) & 0x1B )) )            //读错误标志寄存器BufferOfI CollErr ParityErr ProtocolErr{cStatus = MI_OK;if ( ucN & ucIrqEn & 0x01 )                  //是否发生定时器中断cStatus = MI_NOTAGERR;   if ( ucCommand == PCD_TRANSCEIVE ){ucN = ReadRawRC ( FIFOLevelReg );            //读FIFO中保存的字节数ucLastBits = ReadRawRC ( ControlReg ) & 0x07;    //最后接收到得字节的有效位数if ( ucLastBits )* pOutLenBit = ( ucN - 1 ) * 8 + ucLastBits;      //N个字节数减去1(最后一个字节)+最后一位的位数 读取到的数据总位数else* pOutLenBit = ucN * 8;                     //最后接收到的字节整个字节有效if ( ucN == 0 )   ucN = 1;    if ( ucN > MAXRLEN )ucN = MAXRLEN;   for ( ul = 0; ul < ucN; ul ++ )pOutData [ ul ] = ReadRawRC ( FIFODataReg );   }        }elsecStatus = MI_ERR;
//          printf(ErrorReg);}SetBitMask ( ControlReg, 0x80 );           // stop timer nowWriteRawRC ( CommandReg, PCD_IDLE ); return cStatus;}/** 函数名:PcdRequest* 描述  :寻卡* 输入  :ucReq_code,寻卡方式*                     = 0x52,寻感应区内所有符合14443A标准的卡*                     = 0x26,寻未进入休眠状态的卡*         pTagType,卡片类型代码*                   = 0x4400,Mifare_UltraLight*                   = 0x0400,Mifare_One(S50)*                   = 0x0200,Mifare_One(S70)*                   = 0x0800,Mifare_Pro(X))*                   = 0x4403,Mifare_DESFire* 返回  : 状态值*         = MI_OK,成功* 调用  :外部调用*/
char PcdRequest ( u8 ucReq_code, u8 * pTagType )
{char cStatus;  u8 ucComMF522Buf [ MAXRLEN ]; u32 ulLen;ClearBitMask ( Status2Reg, 0x08 );  //清理指示MIFARECyptol单元接通以及所有卡的数据通信被加密的情况WriteRawRC ( BitFramingReg, 0x07 );   //  发送的最后一个字节的 七位SetBitMask ( TxControlReg, 0x03 ); //TX1,TX2管脚的输出信号传递经发送调制的13.56的能量载波信号ucComMF522Buf [ 0 ] = ucReq_code;      //存入 卡片命令字cStatus = PcdComMF522 ( PCD_TRANSCEIVE,  ucComMF522Buf, 1, ucComMF522Buf, & ulLen ); //寻卡  if ( ( cStatus == MI_OK ) && ( ulLen == 0x10 ) )  //寻卡成功返回卡类型 {    * pTagType = ucComMF522Buf [ 0 ];* ( pTagType + 1 ) = ucComMF522Buf [ 1 ];}elsecStatus = MI_ERR;return cStatus;}/** 函数名:PcdAnticoll* 描述  :防冲撞* 输入  :pSnr,卡片序列号,4字节* 返回  : 状态值*         = MI_OK,成功* 调用  :外部调用*/
char PcdAnticoll ( u8 * pSnr )
{char cStatus;u8 uc, ucSnr_check = 0;u8 ucComMF522Buf [ MAXRLEN ]; u32 ulLen;ClearBitMask ( Status2Reg, 0x08 );        //清MFCryptol On位 只有成功执行MFAuthent命令后,该位才能置位WriteRawRC ( BitFramingReg, 0x00);     //清理寄存器 停止收发ClearBitMask ( CollReg, 0x80 );         //清ValuesAfterColl所有接收的位在冲突后被清除ucComMF522Buf [ 0 ] = 0x93; //卡片防冲突命令ucComMF522Buf [ 1 ] = 0x20;cStatus = PcdComMF522 ( PCD_TRANSCEIVE, ucComMF522Buf, 2, ucComMF522Buf, & ulLen);//与卡片通信if ( cStatus == MI_OK)     //通信成功{for ( uc = 0; uc < 4; uc ++ ){* ( pSnr + uc )  = ucComMF522Buf [ uc ];           //读出UIDucSnr_check ^= ucComMF522Buf [ uc ];}if ( ucSnr_check != ucComMF522Buf [ uc ] )cStatus = MI_ERR;    }SetBitMask ( CollReg, 0x80 );return cStatus;}/** 函数名:CalulateCRC* 描述  :用RC522计算CRC16* 输入  :pIndata,计算CRC16的数组*         ucLen,计算CRC16的数组字节长度*         pOutData,存放计算结果存放的首地址* 返回  : 无* 调用  :内部调用*/
void CalulateCRC ( u8 * pIndata, u8 ucLen, u8 * pOutData )
{u8 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 );}/** 函数名:PcdSelect* 描述  :选定卡片* 输入  :pSnr,卡片序列号,4字节* 返回  : 状态值*         = MI_OK,成功* 调用  :外部调用*/
char PcdSelect ( u8 * pSnr )
{char ucN;u8 uc;u8 ucComMF522Buf [ MAXRLEN ]; u32  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;
}/** 函数名:PcdAuthState* 描述  :验证卡片密码* 输入  :ucAuth_mode,密码验证模式*                     = 0x60,验证A密钥*                     = 0x61,验证B密钥*         u8 ucAddr,块地址*         pKey,密码*         pSnr,卡片序列号,4字节* 返回  : 状态值*         = MI_OK,成功* 调用  :外部调用*/
char PcdAuthState ( u8 ucAuth_mode, u8 ucAddr, u8 * pKey, u8 * pSnr )
{char cStatus;u8 uc, ucComMF522Buf [ MAXRLEN ];u32 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 ) ) ){//            if(cStatus != MI_OK)//                 printf("666") ;       //          else//              printf("888");cStatus = MI_ERR; }return cStatus;
}/** 函数名:PcdWrite* 描述  :写数据到M1卡一块* 输入  :u8 ucAddr,块地址*         pData,写入的数据,16字节* 返回  : 状态值*         = MI_OK,成功* 调用  :外部调用*/
char PcdWrite ( u8 ucAddr, u8 * pData )
{char cStatus;u8 uc, ucComMF522Buf [ MAXRLEN ];u32 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;
}/** 函数名:PcdRead* 描述  :读取M1卡一块数据* 输入  :u8 ucAddr,块地址*         pData,读出的数据,16字节* 返回  : 状态值*         = MI_OK,成功* 调用  :外部调用*/
char PcdRead ( u8 ucAddr, u8 * pData )
{char cStatus;u8 uc, ucComMF522Buf [ MAXRLEN ]; u32 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;
}/** 函数名:PcdHalt* 描述  :命令卡片进入休眠状态* 输入  :无* 返回  : 状态值*         = MI_OK,成功* 调用  :外部调用*/
char PcdHalt( void )
{u8 ucComMF522Buf [ MAXRLEN ]; u32  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 ( u8 * UID, u8 * KEY, u8 RW, u8 * Dat )
{u8 ucArray_ID [ 4 ] = { 0 };//先后存放IC卡的类型和UID(IC卡序列号)PcdRequest ( 0x52, ucArray_ID );//寻卡PcdAnticoll ( ucArray_ID );//防冲撞PcdSelect ( UID );//选定卡PcdAuthState ( 0x60, 0x10, KEY, UID );//校验if ( RW )//读写选择,1是读,0是写PcdRead ( 0x10, Dat );else PcdWrite ( 0x10, Dat );PcdHalt ();    }

rc522.h

#ifndef __RC522_H
#define __RC522_H
#include "sys.h"
#include "stm32f10x.h"//MF522命令字
#define PCD_IDLE              0x00               //取消当前命令
#define PCD_AUTHENT           0x0E               //验证密钥
#define PCD_RECEIVE           0x08               //接收数据
#define PCD_TRANSMIT          0x04               //发送数据
#define PCD_TRANSCEIVE        0x0C               //发送并接收数据
#define PCD_RESETPHASE        0x0F               //复位
#define PCD_CALCCRC           0x03               //CRC计算//Mifare_One卡片命令字
#define PICC_REQIDL           0x26               //寻天线区内未进入休眠状态
#define PICC_REQALL           0x52               //寻天线区内全部卡
#define PICC_ANTICOLL1        0x93               //防冲撞
#define PICC_ANTICOLL2        0x95               //防冲撞
#define PICC_AUTHENT1A        0x60               //验证A密钥
#define PICC_AUTHENT1B        0x61               //验证B密钥
#define PICC_READ             0x30               //读块
#define PICC_WRITE            0xA0               //写块
#define PICC_DECREMENT        0xC0               //扣款
#define PICC_INCREMENT        0xC1               //充值
#define PICC_RESTORE          0xC2               //调块数据到缓冲区
#define PICC_TRANSFER         0xB0               //保存缓冲区中数据
#define PICC_HALT             0x50               //休眠//MF522 FIFO长度定义
#define DEF_FIFO_LENGTH       64                 //FIFO size=64byte
#define MAXRLEN  18//MF522寄存器定义
// PAGE 0
#define     RFU00                 0x00
#define     CommandReg            0x01
#define     ComIEnReg             0x02
#define     DivlEnReg             0x03
#define     ComIrqReg             0x04
#define     DivIrqReg             0x05
#define     ErrorReg              0x06
#define     Status1Reg            0x07
#define     Status2Reg            0x08
#define     FIFODataReg           0x09
#define     FIFOLevelReg          0x0A
#define     WaterLevelReg         0x0B
#define     ControlReg            0x0C
#define     BitFramingReg         0x0D
#define     CollReg               0x0E
#define     RFU0F                 0x0F
// PAGE 1
#define     RFU10                 0x10
#define     ModeReg               0x11
#define     TxModeReg             0x12
#define     RxModeReg             0x13
#define     TxControlReg          0x14
#define     TxAutoReg             0x15
#define     TxSelReg              0x16
#define     RxSelReg              0x17
#define     RxThresholdReg        0x18
#define     DemodReg              0x19
#define     RFU1A                 0x1A
#define     RFU1B                 0x1B
#define     MifareReg             0x1C
#define     RFU1D                 0x1D
#define     RFU1E                 0x1E
#define     SerialSpeedReg        0x1F
// PAGE 2
#define     RFU20                 0x20
#define     CRCResultRegM         0x21
#define     CRCResultRegL         0x22
#define     RFU23                 0x23
#define     ModWidthReg           0x24
#define     RFU25                 0x25
#define     RFCfgReg              0x26
#define     GsNReg                0x27
#define     CWGsCfgReg            0x28
#define     ModGsCfgReg           0x29
#define     TModeReg              0x2A
#define     TPrescalerReg         0x2B
#define     TReloadRegH           0x2C
#define     TReloadRegL           0x2D
#define     TCounterValueRegH     0x2E
#define     TCounterValueRegL     0x2F
// PAGE 3
#define     RFU30                 0x30
#define     TestSel1Reg           0x31
#define     TestSel2Reg           0x32
#define     TestPinEnReg          0x33
#define     TestPinValueReg       0x34
#define     TestBusReg            0x35
#define     AutoTestReg           0x36
#define     VersionReg            0x37
#define     AnalogTestReg         0x38
#define     TestDAC1Reg           0x39
#define     TestDAC2Reg           0x3A
#define     TestADCReg            0x3B
#define     RFU3C                 0x3C
#define     RFU3D                 0x3D
#define     RFU3E                 0x3E
#define     RFU3F                       0x3F//和MF522通讯时返回的错误代码
#define     MI_OK                 0
#define     MI_NOTAGERR           (1)
#define     MI_ERR                (2)#define    SHAQU1  0X01
#define KUAI4   0X04
#define KUAI7   0X07
#define REGCARD 0xa1
#define CONSUME 0xa2
#define READCARD    0xa3
#define ADDMONEY    0xa4//
//#define  spi_cs 1;
//sbit  spi_ck=P0^6;
//sbit  spi_mosi=P0^7;
//sbit  spi_miso=P4^1;
//sbit  spi_rst=P2^7;
#define SPIReadByte()   SPIWriteByte(0)
u8 SPIWriteByte(u8 byte);
void SPI1_Init(void);#define SET_SPI_CS  (GPIOF->BSRR=0X01)
#define CLR_SPI_CS  (GPIOF->BRR=0X01)#define SET_RC522RST  GPIOF->BSRR=0X02
#define CLR_RC522RST  GPIOF->BRR=0X02/***********************RC522 函数宏定义**********************/
#define          RC522_CS_Enable()         GPIO_ResetBits ( GPIOA, GPIO_Pin_4 )
#define          RC522_CS_Disable()        GPIO_SetBits ( GPIOA, GPIO_Pin_4 )#define          RC522_Reset_Enable()      GPIO_ResetBits( GPIOB, GPIO_Pin_0 )
#define          RC522_Reset_Disable()     GPIO_SetBits ( GPIOB, GPIO_Pin_0 )#define          RC522_SCK_0()             GPIO_ResetBits( GPIOA, GPIO_Pin_5 )
#define          RC522_SCK_1()             GPIO_SetBits ( GPIOA, GPIO_Pin_5 )#define          RC522_MOSI_0()            GPIO_ResetBits( GPIOA, GPIO_Pin_7 )
#define          RC522_MOSI_1()            GPIO_SetBits ( GPIOA, GPIO_Pin_7 )#define          RC522_MISO_GET()          GPIO_ReadInputDataBit ( GPIOA, GPIO_Pin_6 )void             RC522_Handel               (void);
void             RC522_Init                 ( void );                       //初始化
void             PcdReset                   ( void );                       //复位
void             M500PcdConfigISOType       ( u8 type );                    //工作方式
char             PcdRequest                 ( u8 req_code, u8 * pTagType ); //寻卡
char             PcdAnticoll                ( u8 * pSnr);                   //读卡号char             PcdSelect                  ( u8 * pSnr );
char             PcdAuthState               ( u8 ucAuth_mode, u8 ucAddr, u8 * pKey, u8 * pSnr );
char             PcdWrite                   ( u8 ucAddr, u8 * pData );
char             PcdRead                    ( u8 ucAddr, u8 * pData );
void ShowID(u16 x,u16 y, u8 *p, u16 charColor, u16 bkColor);     //显示卡的卡号,以十六进制显示#endif

STM32F103:二.(6)mrc522卡号读取相关推荐

  1. web调用IC卡读卡器开发第三章--高频卡读卡号

    高频卡介绍 读取ISO14443A卡号 读取ISO14443B卡号 ISO15693标签的寻卡操作 目前的高频智能卡分为3种,分别为ISO14443A, ISO14443B和ISO15693协议的,这 ...

  2. Arduino + RFID 读取 IC 卡 Arduino uno中获得RFID的UID 并通过串口转发RFID卡号

    RFID简介:射频识别即RFID(Radio Frequency IDentification)技术,又称无线射频识别,是一种通信技术,可通过无线电讯号识别特定目标并读写相关数据,而无需识别系统与特定 ...

  3. 【嵌入式20】STM32F103完成对SD卡的数据读取详细操作

    本文主要利用STM32F103完成对SD卡的数据读取,介绍该实验的详细操作 一.题目要求 二.SD卡协议原理 1.SD卡简述 2.SD卡物理结构 3.SD卡寄存器 4.SD卡操作模式 5.SD卡初始化 ...

  4. STM32系列(HAL库)——F103C8T6通过MFRC522、RFID射频卡、门禁卡模块读取卡片ID(二)

    本文继上一篇:STM32系列(HAL库)--F103C8T6通过MFRC522.RFID射频卡.门禁卡模块读取卡片ID 本文介绍在运用RC522模块时,运用链表结构存储数据的操作 Let's go! ...

  5. STM32F103完成对SD卡的数据读取(fat文件模式)

    目录 一.关于SD卡 1.简介 2.SD卡的寄存器 3.SD卡读取与写入(SPI模式) 二.实验操作 1.仪器 2.代码 3.连线 4.烧录程序 5.串口调试助手初始化并写入文件 6.sd卡里hell ...

  6. 使用Altium Designer 绘制原理图并且使用STM32F103完成对SD卡的数据读取

    使用Altium Designer 绘制原理图并且使用STM32F103完成对SD卡的数据读取 前言 实验要求 一. 电路原理图绘制 软件安装配置过程 (一)绘制stm32最小系统的电路原理图 1.新 ...

  7. 基于STM32F103完成对SD卡的数据读取(fat文件模式)

    文章目录 实验内容 一.SD卡协议 (一).SD卡简介 (二).SD 卡物理结构 (三).SD卡总线 二.基于STM32F103完成对SD卡的数据读取 (一).创建工程 (二).修改代码 (三).串口 ...

  8. STM32F103完成对SD卡的数据读取

    目录 一.SD卡介绍 1.概述 2.SD模式 3.SD卡读取与写入(SPI模式) 二. STM32F103完成对SD卡的数据读取 1.代码部分 2.U盘格式化 3.电路连接 4.具体实现 三.参考资料 ...

  9. Linux下读取RFID卡号(C串口编程)

    由于项目需要用到RFID.GPRS.摄像头等模块所以便看了一下,整理了一下学习思路,本篇先是整理一下串口读取RFID卡号的程序思路,后面还会更其他的 RFID模块: 本次采用的是125K的RFID读卡 ...

最新文章

  1. python 发邮件 timeout_python发送邮件
  2. GDCM:gdcm::IOD的测试程序
  3. 用户id可以出现在url中吗_下载Google Drive中的文件
  4. Android开发周报:Google 推出AR SDK、Android 8.0 Oreo 最终版发布
  5. 什么叫做展望_在迷茫的时代,选择相信:关于2021经济的一些展望。
  6. hdu---2087---剪花布条
  7. 用单片机c51电子秤的c语言,原创基于51单片机的电子秤设计 带源代码,原理图毕业设计论文...
  8. 阿里云域名怎么注册和使用(新手教程)
  9. 2022基金定投数字货币理财程序源码
  10. 获奖!CACTER邮件安全网关荣获电子邮件安全优秀产品奖项
  11. YY0709标准解读
  12. 计算机协会游园活动方案,计算机爱好者协会建设策划方案
  13. 通过Alertmanager实现Prometheus的告警告警配置(邮箱加钉钉)
  14. API采集接口源码电商采集工具接口
  15. 阿里巴巴Java 开发手册 码出高效,码出质量 1.4.0
  16. nginx 入门简介
  17. 最常用的前 100 个 PHP 函数总结
  18. access数据库应用系统客观题_数据库技术复习—ACCESS习题及答案(汇总)
  19. Android OpenGLES Camera2绿幕抠图
  20. 产品经理培训大概多少钱

热门文章

  1. 计算机office2010高级应用程序,计算机办公软件应用office2010高级解题步骤
  2. linux抹掉所有分区,找到了linux分区顺序错乱修复方法
  3. DevEco Studio的下载
  4. 喵喵的华为DevCloud使用指南(3)-项目构建和部署
  5. 喵喵的QQ小程序登录
  6. from gluonts.trainer import Trainer报错
  7. 用代码转换整数规划 max{ } 与 min{ } 形式至代码形式
  8. PipeCAD之管道标准库PipeStd(3)
  9. javaScript——原型
  10. luoguP2701 [USACO5.3]巨大的牛棚Big Barn(极大子矩阵)