STM8RC522读写IC卡程序.docx
- 文档编号:13677293
- 上传时间:2023-06-16
- 格式:DOCX
- 页数:24
- 大小:19.22KB
STM8RC522读写IC卡程序.docx
《STM8RC522读写IC卡程序.docx》由会员分享,可在线阅读,更多相关《STM8RC522读写IC卡程序.docx(24页珍藏版)》请在冰点文库上搜索。
STM8RC522读写IC卡程序
#include"stm8s.h"
#include"uart.h"
voidDelay(u32nCount);
externu8RxBuffer[RxBufferSize];
externu8UART_RX_NUM;
unsignedcharCT[2];//卡类型
unsignedcharSN[4];//卡号
unsignedcharwrite[16]={0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08,0x09,0x0A,0x0B,0x0C,0x0D,0x0E,0x0F,0x10};
unsignedcharread[16]={0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00};
unsignedcharkey[6]={0xFF,0xFF,0xFF,0xFF,0xFF,0xFF};
#definecountof(a)(sizeof(a)/sizeof(*(a)))
#defineBufferSize(countof(Tx_Buffer)-1)
u8Tx_Buffer[]="STM8SRFIDTEST";
u8Rx_Buffer[BufferSize];
u32FLASH_ID;
voidcardNo2String(u8*cardNo,u8*str);
voidmain(void)
{
unsignedcharstatus;
/*设置内部时钟16M为主时钟*/
CLK_HSIPrescalerConfig(CLK_PRESCALER_HSIDIV1);
status=memcmp(read,write,16);
GPIO_DeInit(GPIOA);
GPIO_DeInit(GPIOC);
Uart_Init();
GPIO_Init(GPIOA,GPIO_PIN_4,GPIO_MODE_OUT_PP_HIGH_FAST);
InitRc522();
UART2_SendString(Tx_Buffer,BufferSize);
while
(1)
{
status=PcdRequest(PICC_REQALL,CT);/*扫描卡*/
status=PcdAnticoll(SN);/*防冲撞*/
if(status==MI_OK)
{
GPIO_LOW(GPIOA,GPIO_PIN_4);//寻卡成功
UART2_SendString("ThecardIdis:
",15);//串口发送卡号
cardNo2String(SN,Tx_Buffer);
UART2_SendString(Tx_Buffer,17);
Reset_RC522();
}
else
{
GPIO_HIGH(GPIOA,GPIO_PIN_4);
}
}
}
voidDelay(u32nCount)
{
while(nCount!
=0)
{
nCount--;
}
}
voidHex2String(u8hex,u8*str)
{
str[0]=(hex/100)+'0';
str[1]=(hex%100/10)+'0';
str[2]=(hex%10)+'0';
}
voidcardNo2String(u8*cardNo,u8*str)
{
u8Count=0;
for(Count=0;Count<4;Count++)
{
Hex2String(cardNo[Count],str+Count*4);
if(Count==3)
{
str[15]='\n';
}
else
{
str[Count*4+3]=':
';
}
}
}
voiddelay_ns(u32ns)
{
u32i;
for(i=0;i { asm("nop"); asm("nop"); asm("nop"); } } u8SPIWriteByte(u8Byte) { u8tmp; while(SPI_GetFlagStatus(SPI_FLAG_TXE)==RESET); SPI_SendData(Byte); if(SPI_GetFlagStatus(SPI_FLAG_RXNE)) { tmp=SPI_ReceiveData(); } returntmp; } voidSPI2_Init(void) { SPI_DeInit(); SPI_Init( SPI_FIRSTBIT_MSB,//帧模式,先发送MSB还是LSB SPI_BAUDRATEPRESCALER_8,//波特率分频值 SPI_MODE_MASTER,//模式,主从模式 SPI_CLOCKPOLARITY_LOW,//时钟极性,空闲时SCK为高/空闲时SCK为低 SPI_CLOCKPHASE_1EDGE,//数据采样的边沿选择 SPI_DATADIRECTION_2LINES_FULLDUPLEX,//双线单向数据模式,使用C6/C7两条线,数据传输方向位单向 SPI_NSS_SOFT,//软件从设备 0x07); SPI_Cmd(ENABLE); } voidInitRc522(void) { SPI2_Init(); PcdReset(); PcdAntennaOff(); PcdAntennaOn(); M500PcdConfigISOType('A'); } voidReset_RC522(void) { PcdReset(); PcdAntennaOff(); PcdAntennaOn(); } ///////////////////////////////////////////////////////////////////// //功能: 寻卡 //参数说明: 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 ///////////////////////////////////////////////////////////////////// charPcdRequest(u8req_code,u8*pTagType) { charstatus; u8unLen; u8ucComMF522Buf[MAXRLEN]; ClearBitMask(Status2Reg,0x08); WriteRawRC(BitFramingReg,0x07); SetBitMask(TxControlReg,0x03); 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;} returnstatus; } ///////////////////////////////////////////////////////////////////// //功能: 防冲撞 //参数说明: pSnr[OUT]: 卡片序列号,4字节 //返回: 成功返回MI_OK ///////////////////////////////////////////////////////////////////// charPcdAnticoll(u8*pSnr) { charstatus; u8i,snr_check=0; u8unLen; u8ucComMF522Buf[MAXRLEN]; ClearBitMask(Status2Reg,0x08); WriteRawRC(BitFramingReg,0x00); ClearBitMask(CollReg,0x80); 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); returnstatus; } ///////////////////////////////////////////////////////////////////// //功能: 选定卡片 //参数说明: pSnr[IN]: 卡片序列号,4字节 //返回: 成功返回MI_OK ///////////////////////////////////////////////////////////////////// charPcdSelect(u8*pSnr) { charstatus; u8i; u8unLen; u8ucComMF522Buf[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); status=PcdComMF522(PCD_TRANSCEIVE,ucComMF522Buf,9,ucComMF522Buf,&unLen); if((status==MI_OK)&&(unLen==0x18)) {status=MI_OK;} else {status=MI_ERR;} returnstatus; } ///////////////////////////////////////////////////////////////////// //功能: 验证卡片密码 //参数说明: auth_mode[IN]: 密码验证模式 //0x60=验证A密钥 //0x61=验证B密钥 //addr[IN]: 块地址 //pKey[IN]: 密码 //pSnr[IN]: 卡片序列号,4字节 //返回: 成功返回MI_OK ///////////////////////////////////////////////////////////////////// charPcdAuthState(u8auth_mode,u8addr,u8*pKey,u8*pSnr) { charstatus; u8unLen; u8ucComMF522Buf[MAXRLEN]; ucComMF522Buf[0]=auth_mode; ucComMF522Buf[1]=addr; memcpy(&ucComMF522Buf[2],pKey,6); memcpy(&ucComMF522Buf[8],pSnr,4); status=PcdComMF522(PCD_AUTHENT,ucComMF522Buf,12,ucComMF522Buf,&unLen); if((status! =MI_OK)||(! (ReadRawRC(Status2Reg)&0x08))) {status=MI_ERR;} returnstatus; } ///////////////////////////////////////////////////////////////////// //功能: 读取M1卡一块数据 //参数说明: addr[IN]: 块地址 //p[OUT]: 读出的数据,16字节 //返回: 成功返回MI_OK ///////////////////////////////////////////////////////////////////// charPcdRead(u8addr,u8*p) { charstatus; u8unLen; u8i,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++) {*(p+i)=ucComMF522Buf[i];} } else {status=MI_ERR;} returnstatus; } ///////////////////////////////////////////////////////////////////// //功能: 写数据到M1卡一块 //参数说明: addr[IN]: 块地址 //p[IN]: 写入的数据,16字节 //返回: 成功返回MI_OK ///////////////////////////////////////////////////////////////////// charPcdWrite(u8addr,u8*p) { charstatus; u8unLen; u8i,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]=*(p+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;} } returnstatus; } ///////////////////////////////////////////////////////////////////// //功能: 命令卡片进入休眠状态 //返回: 成功返回MI_OK ///////////////////////////////////////////////////////////////////// charPcdHalt(void) { u8status; u8unLen; u8ucComMF522Buf[MAXRLEN]; ucComMF522Buf[0]=PICC_HALT; ucComMF522Buf[1]=0; CalulateCRC(ucComMF522Buf,2,&ucComMF522Buf[2]); status=PcdComMF522(PCD_TRANSCEIVE,ucComMF522Buf,4,ucComMF522Buf,&unLen); returnMI_OK; } ///////////////////////////////////////////////////////////////////// //用MF522计算CRC16函数 ///////////////////////////////////////////////////////////////////// voidCalulateCRC(u8*pIn,u8len,u8*pOut) { u8i,n; ClearBitMask(DivIrqReg,0x04); WriteRawRC(CommandReg,PCD_IDLE); SetBitMask(FIFOLevelReg,0x80); for(i=0;i {WriteRawRC(FIFODataReg,*(pIn+i));} WriteRawRC(CommandReg,PCD_CALCCRC); i=0xFF; do { n=ReadRawRC(DivIrqReg); i--; } while((i! =0)&&! (n&0x04)); pOut[0]=ReadRawRC(CRCResultRegL); pOut[1]=ReadRawRC(CRCResultRegM); } ///////////////////////////////////////////////////////////////////// //功能: 复位RC522 //返回: 成功返回MI_OK ///////////////////////////////////////////////////////////////////// charPcdReset(void) { GPIO_HIGH(RC522RST_GPIO_PORT,RC522RST_GPIO_PIN); delay_ns(10); GPIO_LOW(RC522RST_GPIO_PORT,RC522RST_GPIO_PIN); delay_ns(10); GPIO_HIGH(RC522RST_GPIO_PORT,RC522RST_GPIO_PIN); delay_ns(10); WriteRawRC(CommandReg,PCD_RESETPHASE); delay_ns(10); WriteRawRC(ModeReg,0x3D);//和Mifare卡通讯,CRC初始值0x6363 WriteRawRC(TReloadRegL,30); WriteRawRC(TReloadRegH,0); WriteRawRC(TModeReg,0x8D); WriteRawRC(TPrescalerReg,0x3E); WriteRawRC(TxAutoReg,0x40);//必须要 returnMI_OK; } ////////////////////////////////////////////////////////////////////// //设置RC632的工作方式 ////////////////////////////////////////////////////////////////////// charM500PcdConfigISOType(u8type) { if(type=='A')//ISO14443_A { ClearBitMask(Status2Reg,0x08); WriteRawRC(ModeReg,0x3D); WriteRawRC(RxSelReg,0x86); WriteRawRC(RFCfgReg,0x7F); WriteRawRC(TReloadRegL,30); WriteRawRC(TReloadRegH,0); WriteRawRC(TModeReg,0x8D); WriteRawRC(TPrescalerReg,0x3E); delay_ns(1000); PcdAntennaOn(); } else { return1; } returnMI_OK; } ///////////////////////////////////////////////////////////////////// //功能: 读RC632寄存器 //参数说明: Address[IN]: 寄存器地址 //返回: 读出的值 /////////////////////////////////////////////////////////////////////
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- STM8RC522 读写 IC 程序