版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
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. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2026年三季度感控考核医院感染管理风险评估试题及答案
- 2025-2026年执业药师药学综合知识点巩固习题
- 2026年烟草专卖从业人员岗位业务知识考试题(含答案)
- 2025-2026年网络安全法律法规与伦理道德习题集
- 2026年牙本质敏感干预规范测试题及答案
- 2026年学校食堂后厨从业人员考试题库(含答案)
- (正式版)DB13∕T 1138-2010 《社会单位消防安全“四个能力”建设指南》
- 中华薪酬网薪酬说法34期
- 含氢天然气高压输送管道材料性能劣化及失效后果:基于多因素耦合的深入剖析
- 含固工业废水处理中错流过滤与旋液分离性能的比较研究
- 新版2026秋新人教版道德与法治四年级上册全册核心素养教案教学设计合集
- 甘孜州民政局 甘孜州2026年养老服务管理专员岗招募的(93人)考试参考题库及答案详解
- 2026年城市防灾减灾工程的建设对策
- 第4课 我是中国公民 第1课时 课件(内嵌视频)2026-2027学年道德与法治六年级上册统编版
- 全套电子课件:管理会计(第三版)
- DL∕T 1917-2018 电力用户业扩报装技术规范
- 九宫数独200题(附答案全)
- 再见深海合唱简谱【珠海童年树合唱团】
- 双红活血胶囊作用机制的网络药理学研究
- 穴位埋线疗法调节内分泌与激素平衡
- 退费账户确认书
评论
0/150
提交评论