STM8RC522读写IC卡程序_第1页
STM8RC522读写IC卡程序_第2页
STM8RC522读写IC卡程序_第3页
STM8RC522读写IC卡程序_第4页
STM8RC522读写IC卡程序_第5页
已阅读5页,还剩10页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、#include "stm8s.h"#include "uart.h"void Delay(u32 nCount);extern u8 RxBufferRxBufferSize;extern u8 UART_RX_NUM;unsigned char CT2;/卡类型unsigned char SN4; /卡号unsigned char write16 = 0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08,0x09,0x0A,0x0B,0x0C,0x0D,0x0E,0x0F,0x10;unsigned char read16

2、= 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00;unsigned char key6 = 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF;#define countof(a) (sizeof(a) / sizeof(*(a)#define BufferSize (countof(Tx_Buffer)-1)u8 Tx_Buffer = "STM8S RFID TEST"u8 Rx_BufferBufferSize;u32 FLASH_ID ;void

3、 cardNo2String(u8 *cardNo, u8 *str);void main(void) unsigned char status; /*设置内部时钟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(); UART

4、2_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("The card Id is:",15); /串口发送卡号 cardNo2String(SN, Tx_Buffer); UART2_SendString(Tx_Buffer, 17); Re

5、set_RC522(); else GPIO_HIGH(GPIOA, GPIO_PIN_4); void Delay(u32 nCount) while (nCount != 0) nCount-; void Hex2String(u8 hex,u8 *str) str0 = (hex / 100) + '0' str1 = (hex % 100 / 10) + '0' str2 = (hex % 10) + '0'void cardNo2String(u8 *cardNo, u8 *str) u8 Count = 0; for(Count =

6、0; Count < 4; Count+) Hex2String(cardNoCount, str + Count * 4); if(Count = 3) str15 = 'n' else strCount * 4 + 3 = ':' void delay_ns(u32 ns) u32 i; for(i=0;i<ns;i+) asm("nop"); asm("nop"); asm("nop"); u8 SPIWriteByte(u8 Byte) u8 tmp; while (SPI_GetF

7、lagStatus( SPI_FLAG_TXE) = RESET); SPI_SendData(Byte); if (SPI_GetFlagStatus(SPI_FLAG_RXNE) tmp = SPI_ReceiveData(); return tmp; void SPI2_Init(void) SPI_DeInit(); SPI_Init( SPI_FIRSTBIT_MSB, /帧模式,先发送MSB还是LSB SPI_BAUDRATEPRESCALER_8, /波特率分频值 SPI_MODE_MASTER, /模式,主从模式 SPI_CLOCKPOLARITY_LOW, /时钟极性,空闲时

8、SCK为高/空闲时SCK为低 SPI_CLOCKPHASE_1EDGE, /数据采样的边沿选择 SPI_DATADIRECTION_2LINES_FULLDUPLEX, /双线单向数据模式,使用C6/C7两条线,数据传输方向位单向 SPI_NSS_SOFT, /软件从设备 0x07); SPI_Cmd(ENABLE);void InitRc522(void) SPI2_Init(); PcdReset(); PcdAntennaOff(); PcdAntennaOn(); M500PcdConfigISOType( 'A' );void Reset_RC522(void) Pc

9、dReset(); PcdAntennaOff(); PcdAntennaOn(); /功 能:寻卡/参数说明: req_codeIN:寻卡方式/ 0x52 = 寻感应区内所有符合14443A标准的卡/ 0x26 = 寻未进入休眠状态的卡/ pTagTypeOUT:卡片类型代码/ 0x4400 = Mifare_UltraLight/ 0x0400 = Mifare_One(S50)/ 0x0200 = Mifare_One(S70)/ 0x0800 = Mifare_Pro(X)/ 0x4403 = Mifare_DESFire/返 回: 成功返回MI_OK/char PcdRequest(

10、u8 req_code,u8 *pTagType)char status; u8 unLen;u8 ucComMF522BufMAXRLEN; ClearBitMask(Status2Reg,0x08);WriteRawRC(BitFramingReg,0x07);SetBitMask(TxControlReg,0x03); ucComMF522Buf0 = req_code;status = PcdComMF522(PCD_TRANSCEIVE,ucComMF522Buf,1,ucComMF522Buf,&unLen);if (status = MI_OK) && (

11、unLen = 0x10) *pTagType = ucComMF522Buf0;*(pTagType+1) = ucComMF522Buf1;else status = MI_ERR; return status;/功 能:防冲撞/参数说明: pSnrOUT:卡片序列号,4字节/返 回: 成功返回MI_OK/ char PcdAnticoll(u8 *pSnr) char status; u8 i,snr_check=0; u8 unLen; u8 ucComMF522BufMAXRLEN; ClearBitMask(Status2Reg,0x08); WriteRawRC(BitFrami

12、ngReg,0x00); ClearBitMask(CollReg,0x80); ucComMF522Buf0 = PICC_ANTICOLL1; ucComMF522Buf1 = 0x20; status = PcdComMF522(PCD_TRANSCEIVE,ucComMF522Buf,2,ucComMF522Buf,&unLen); if (status = MI_OK) for (i=0; i<4; i+) *(pSnr+i) = ucComMF522Bufi; snr_check = ucComMF522Bufi; if (snr_check != ucComMF52

13、2Bufi) status = MI_ERR; SetBitMask(CollReg,0x80); return status;/功 能:选定卡片/参数说明: pSnrIN:卡片序列号,4字节/返 回: 成功返回MI_OK/char PcdSelect(u8 *pSnr) char status; u8 i; u8 unLen; u8 ucComMF522BufMAXRLEN; ucComMF522Buf0 = PICC_ANTICOLL1; ucComMF522Buf1 = 0x70; ucComMF522Buf6 = 0; for (i=0; i<4; i+) ucComMF522B

14、ufi+2 = *(pSnr+i); ucComMF522Buf6 = *(pSnr+i); CalulateCRC(ucComMF522Buf,7,&ucComMF522Buf7); ClearBitMask(Status2Reg,0x08); status = PcdComMF522(PCD_TRANSCEIVE,ucComMF522Buf,9,ucComMF522Buf,&unLen); if (status = MI_OK) && (unLen = 0x18) status = MI_OK; else status = MI_ERR; return st

15、atus;/功 能:验证卡片密码/参数说明: auth_modeIN: 密码验证模式/ 0x60 = 验证A密钥/ 0x61 = 验证B密钥 / addrIN:块地址/ pKeyIN:密码/ pSnrIN:卡片序列号,4字节/返 回: 成功返回MI_OK/ char PcdAuthState(u8 auth_mode,u8 addr,u8 *pKey,u8 *pSnr) char status; u8 unLen; u8 ucComMF522BufMAXRLEN; ucComMF522Buf0 = auth_mode; ucComMF522Buf1 = addr; memcpy(&uc

16、ComMF522Buf2, pKey, 6); memcpy(&ucComMF522Buf8, pSnr, 4); status = PcdComMF522(PCD_AUTHENT,ucComMF522Buf,12,ucComMF522Buf,&unLen); if (status != MI_OK) | (!(ReadRawRC(Status2Reg) & 0x08) status = MI_ERR; return status;/功 能:读取M1卡一块数据/参数说明: addrIN:块地址/ p OUT:读出的数据,16字节/返 回: 成功返回MI_OK/ char

17、 PcdRead(u8 addr,u8 *p ) char status; u8 unLen; u8 i,ucComMF522BufMAXRLEN; ucComMF522Buf0 = PICC_READ; ucComMF522Buf1 = addr; CalulateCRC(ucComMF522Buf,2,&ucComMF522Buf2); status = PcdComMF522(PCD_TRANSCEIVE,ucComMF522Buf,4,ucComMF522Buf,&unLen); if (status = MI_OK) && (unLen = 0x90)

18、 for (i=0; i<16; i+) *(p +i) = ucComMF522Bufi; else status = MI_ERR; return status;/功 能:写数据到M1卡一块/参数说明: addrIN:块地址/ p IN:写入的数据,16字节/返 回: 成功返回MI_OK/ char PcdWrite(u8 addr,u8 *p ) char status; u8 unLen; u8 i,ucComMF522BufMAXRLEN; ucComMF522Buf0 = PICC_WRITE; ucComMF522Buf1 = addr; CalulateCRC(ucCom

19、MF522Buf,2,&ucComMF522Buf2); status = PcdComMF522(PCD_TRANSCEIVE,ucComMF522Buf,4,ucComMF522Buf,&unLen); if (status != MI_OK) | (unLen != 4) | (ucComMF522Buf0 & 0x0F) != 0x0A) status = MI_ERR; if (status = MI_OK) for (i=0; i<16; i+) ucComMF522Bufi = *(p +i); CalulateCRC(ucComMF522Buf,1

20、6,&ucComMF522Buf16); status = PcdComMF522(PCD_TRANSCEIVE,ucComMF522Buf,18,ucComMF522Buf,&unLen); if (status != MI_OK) | (unLen != 4) | (ucComMF522Buf0 & 0x0F) != 0x0A) status = MI_ERR; return status;/功 能:命令卡片进入休眠状态/返 回: 成功返回MI_OK/char PcdHalt(void) u8 status; u8 unLen; u8 ucComMF522BufMA

21、XRLEN; ucComMF522Buf0 = PICC_HALT; ucComMF522Buf1 = 0; CalulateCRC(ucComMF522Buf,2,&ucComMF522Buf2); status = PcdComMF522(PCD_TRANSCEIVE,ucComMF522Buf,4,ucComMF522Buf,&unLen); return MI_OK;/用MF522计算CRC16函数/void CalulateCRC(u8 *pIn ,u8 len,u8 *pOut ) u8 i,n; ClearBitMask(DivIrqReg,0x04); Writ

22、eRawRC(CommandReg,PCD_IDLE); SetBitMask(FIFOLevelReg,0x80); for (i=0; i<len; 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(CRCResul

23、tRegM);/功 能:复位RC522/返 回: 成功返回MI_OK/char PcdReset(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); Writ

24、eRawRC(ModeReg,0x3D); /和Mifare卡通讯,CRC初始值0x6363 WriteRawRC(TReloadRegL,30); WriteRawRC(TReloadRegH,0); WriteRawRC(TModeReg,0x8D); WriteRawRC(TPrescalerReg,0x3E); WriteRawRC(TxAutoReg,0x40);/必须要 return MI_OK;/设置RC632的工作方式 /char M500PcdConfigISOType(u8 type) if (type = 'A') /ISO14443_A ClearBit

25、Mask(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 return 1; return MI_OK;/功 能:读RC632寄存器/参数说明:Add

26、ressIN:寄存器地址/返 回:读出的值/u8 ReadRawRC(u8 Address) u8 ucAddr; u8 ucResult=0; GPIO_LOW(RC522NSS_GPIO_PORT,RC522NSS_GPIO_PIN); ucAddr = (Address<<1)&0x7E)|0x80; SPIWriteByte(ucAddr); ucResult=SPIReadByte(); GPIO_HIGH(RC522NSS_GPIO_PORT,RC522NSS_GPIO_PIN); return ucResult;/功 能:写RC632寄存器/参数说明:Addr

27、essIN:寄存器地址/ valueIN:写入的值/void WriteRawRC(u8 Address, u8 value) u8 ucAddr; GPIO_LOW(RC522NSS_GPIO_PORT,RC522NSS_GPIO_PIN); ucAddr = (Address<<1)&0x7E); SPIWriteByte(ucAddr); SPIWriteByte(value);GPIO_HIGH(RC522NSS_GPIO_PORT,RC522NSS_GPIO_PIN);/功 能:置RC522寄存器位/参数说明:regIN:寄存器地址/ maskIN:置位值/voi

28、d SetBitMask(u8 reg,u8 mask) char tmp = 0x0; tmp = ReadRawRC(reg); WriteRawRC(reg,tmp | mask); / set bit mask/功 能:清RC522寄存器位/参数说明:regIN:寄存器地址/ maskIN:清位值/void ClearBitMask(u8 reg,u8 mask) char tmp = 0x0; tmp = ReadRawRC(reg); WriteRawRC(reg, tmp & mask); / clear bit mask /功 能:通过RC522和ISO14443卡通讯

29、/参数说明:CommandIN:RC522命令字/ pIn IN:通过RC522发送到卡片的数据/ InLenByteIN:发送数据的字节长度/ pOut OUT:接收到的卡片返回数据/ *pOutLenBitOUT:返回数据的位长度/char PcdComMF522(u8 Command, u8 *pIn , u8 InLenByte, u8 *pOut , u8 *pOutLenBit) char status = MI_ERR; u8 irqEn = 0x00; u8 waitFor = 0x00; u8 lastBits; u8 n; u16 i; switch (Command) c

30、ase 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+

31、) WriteRawRC(FIFODataReg, pIn i); WriteRawRC(CommandReg, Command); / n = ReadRawRC(CommandReg); if (Command = PCD_TRANSCEIVE) SetBitMask(BitFramingReg,0x80); /开始传送 /i = 600;/根据时钟频率调整,操作M1卡最大等待时间25ms i = 10000; do n = ReadRawRC(ComIrqReg); i-; while (i!=0) && !(n&0x01) && !(n&

32、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 + l

33、astBits; else *pOutLenBit = n*8; if (n = 0) n = 1; if (n > MAXRLEN) n = MAXRLEN; for (i=0; i<n; i+) pOuti = ReadRawRC(FIFODataReg); else status = MI_ERR; SetBitMask(ControlReg,0x80); / stop timer now WriteRawRC(CommandReg,PCD_IDLE); return status;/开启天线 /每次启动或关闭天险发射之间应至少有1ms的间隔/void PcdAntennaOn(void) u8 i; i = ReadRawRC(TxControlReg); if (!(i & 0x03) SetBitMask(TxControlReg, 0x03); /关闭天线/void PcdAntennaOf

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论