IC卡读写
- 格式:doc
- 大小:59.50 KB
- 文档页数:15
#include "stm8s.h"#include "uart.h"void Delay(u32 nCount);extern u8 RxBuffer[RxBufferSize];extern u8 UART_RX_NUM;unsigned char CT[2];//卡类型unsigned char SN[4]; //卡号unsigned char write[16] ={0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08,0x09,0x0A,0x0B,0x0C,0x0D,0x0E,0x0F,0x10}; unsigned char read[16] ={0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00}; unsigned char key[6] = {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_Buffer[BufferSize];u32 FLASH_ID ;void 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();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("The card Id is:",15); //串口发送卡号cardNo2String(SN, Tx_Buffer);UART2_SendString(Tx_Buffer, 17);Reset_RC522();}else{GPIO_HIGH(GPIOA, GPIO_PIN_4);}}}void Delay(u32 nCount){while (nCount != 0){nCount--;}}void Hex2String(u8 hex,u8 *str){str[0] = (hex / 100) + '0';str[1] = (hex % 100 / 10) + '0';str[2] = (hex % 10) + '0';}void cardNo2String(u8 *cardNo, u8 *str){u8 Count = 0;for(Count = 0; Count < 4; Count++){Hex2String(cardNo[Count], str + Count * 4);if(Count == 3){str[15] = '\n';}else{str[Count * 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_GetFlagStatus( 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还是LSBSPI_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);}void InitRc522(void){SPI2_Init();PcdReset();PcdAntennaOff();PcdAntennaOn();M500PcdConfigISOType( 'A' );}void Reset_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/////////////////////////////////////////////////////////////////////char PcdRequest(u8 req_code,u8 *pTagType){char status;u8 unLen;u8 ucComMF522Buf[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; }return status;}///////////////////////////////////////////////////////////////////////功能:防冲撞//参数说明: pSnr[OUT]:卡片序列号,4字节//返回: 成功返回MI_OK/////////////////////////////////////////////////////////////////////char PcdAnticoll(u8 *pSnr){char status;u8 i,snr_check=0;u8 unLen;u8 ucComMF522Buf[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);return status;}///////////////////////////////////////////////////////////////////////功能:选定卡片//参数说明: pSnr[IN]:卡片序列号,4字节//返回: 成功返回MI_OK/////////////////////////////////////////////////////////////////////char PcdSelect(u8 *pSnr){char status;u8 i;u8 unLen;u8 ucComMF522Buf[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; }return status;}///////////////////////////////////////////////////////////////////////功能:验证卡片密码//参数说明: auth_mode[IN]: 密码验证模式// 0x60 = 验证A密钥// 0x61 = 验证B密钥// addr[IN]:块地址// pKey[IN]:密码// pSnr[IN]:卡片序列号,4字节//返回: 成功返回MI_OK/////////////////////////////////////////////////////////////////////char PcdAuthState(u8 auth_mode,u8 addr,u8 *pKey,u8 *pSnr){char status;u8 unLen;u8 ucComMF522Buf[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; }return status;}///////////////////////////////////////////////////////////////////////功能:读取M1卡一块数据//参数说明: addr[IN]:块地址// p [OUT]:读出的数据,16字节//返回: 成功返回MI_OK/////////////////////////////////////////////////////////////////////char PcdRead(u8 addr,u8 *p ){char status;u8 unLen;u8 i,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; }return status;}///////////////////////////////////////////////////////////////////////功能:写数据到M1卡一块//参数说明: addr[IN]:块地址// p [IN]:写入的数据,16字节//返回: 成功返回MI_OK/////////////////////////////////////////////////////////////////////char PcdWrite(u8 addr,u8 *p ){char status;u8 unLen;u8 i,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; }}return status;}///////////////////////////////////////////////////////////////////////功能:命令卡片进入休眠状态//返回: 成功返回MI_OK/////////////////////////////////////////////////////////////////////char PcdHalt(void){u8 status;u8 unLen;u8 ucComMF522Buf[MAXRLEN];ucComMF522Buf[0] = PICC_HALT;ucComMF522Buf[1] = 0;CalulateCRC(ucComMF522Buf,2,&ucComMF522Buf[2]);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);WriteRawRC(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(CRCResultRegM);}///////////////////////////////////////////////////////////////////////功能:复位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);WriteRawRC(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{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{return 1;}return MI_OK;}///////////////////////////////////////////////////////////////////////功能:读RC632寄存器//参数说明:Address[IN]:寄存器地址//返回:读出的值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寄存器//参数说明:Address[IN]:寄存器地址// value[IN]:写入的值/////////////////////////////////////////////////////////////////////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寄存器位//参数说明:reg[IN]:寄存器地址// mask[IN]:置位值/////////////////////////////////////////////////////////////////////void SetBitMask(u8 reg,u8 mask){char tmp = 0x0;tmp = ReadRawRC(reg);WriteRawRC(reg,tmp | mask); // set bit mask}///////////////////////////////////////////////////////////////////////功能:清RC522寄存器位//参数说明:reg[IN]:寄存器地址// mask[IN]:清位值/////////////////////////////////////////////////////////////////////void ClearBitMask(u8 reg,u8 mask){char tmp = 0x0;tmp = ReadRawRC(reg);WriteRawRC(reg, tmp & ~mask); // clear bit mask}//功能:通过RC522和ISO14443卡通讯//参数说明:Command[IN]:RC522命令字// pIn [IN]:通过RC522发送到卡片的数据// InLenByte[IN]:发送数据的字节长度// pOut [OUT]:接收到的卡片返回数据// *pOutLenBit[OUT]:返回数据的位长度/////////////////////////////////////////////////////////////////////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){case 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++){WriteRawRC(FIFODataReg, pIn [i]);}WriteRawRC(CommandReg, Command);// n = ReadRawRC(CommandReg);if (Command == PCD_TRANSCEIVE){SetBitMask(BitFramingReg,0x80); //开始传送}//i = 600;//根据时钟频率调整,操作M1卡最大等待时间25msi = 10000;do{n = ReadRawRC(ComIrqReg);i--;}while ((i!=0) && !(n&0x01) && !(n&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 + lastBits;}else{*pOutLenBit = n*8;}if (n == 0){n = 1;}if (n > MAXRLEN){n = MAXRLEN;}for (i=0; i<n; i++){pOut[i] = ReadRawRC(FIFODataReg);}}}else{status = MI_ERR;}}SetBitMask(ControlReg,0x80); // stop timer nowWriteRawRC(CommandReg,PCD_IDLE);return status;}///////////////////////////////////////////////////////////////////////开启天线//每次启动或关闭天险发射之间应至少有1ms的间隔/////////////////////////////////////////////////////////////////////void PcdAntennaOn(void){u8 i;i = ReadRawRC(TxControlReg);if (!(i & 0x03)){SetBitMask(TxControlReg, 0x03);}}///////////////////////////////////////////////////////////////////////关闭天线/////////////////////////////////////////////////////////////////////void PcdAntennaOff(void){ClearBitMask(TxControlReg, 0x03);}///////////////////////////////////////////////////////////////////////功能:扣款和充值//参数说明: dd_mode[IN]:命令字// 0xC0 = 扣款// 0xC1 = 充值// addr[IN]:钱包地址// pValue[IN]:4字节增(减)值,低位在前//返回: 成功返回MI_OK/////////////////////////////////////////////////////////////////////char PcdValue(u8 dd_mode,u8 addr,u8 *pValue){char status;u8 unLen;u8 ucComMF522Buf[MAXRLEN];//u8 i;ucComMF522Buf[0] = dd_mode;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){memcpy(ucComMF522Buf, pValue, 4);//for (i=0; i<16; i++)//{ ucComMF522Buf[i] = *(pValue+i); }CalulateCRC(ucComMF522Buf,4,&ucComMF522Buf[4]);unLen = 0;status =PcdComMF522(PCD_TRANSCEIVE,ucComMF522Buf,6,ucComMF522Buf,&unLen);if (status != MI_ERR){ status = MI_OK; }}if (status == MI_OK){ucComMF522Buf[0] = PICC_TRANSFER;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; }}return status;}。
产品规格书名称:RF系列读写器目录1.产品介绍 (3)2.型号编码 (3)3.产品特性 (4)4.产品价值 (5)5.开发包 (5)6.产品应用 (6)1.产品介绍RF型非接触式智能IC卡读写器,支持非接触式频率13.56MHZ,符合ISO14443A/B,ISO15693标准。
带LED 8位数字显示,也可根据需求选择带LCD显示。
带峰鸣器,为用户清楚地提供读写器和应用程序的状态指示。
可支持多种接口联机方式:USB接口/串口RS232/TTL电平/485/TCP-IP以及PC/SC和USB无驱即插即用方式。
为了提高安全系数,也可选择智能IC读写设备中配置符合ISO7816-3,GSM 11.11标准的SAM卡,最多支持2个。
同时设备随机附送的光盘提供各种开发平台下的驱动开发包及开发例程,附带的演示程序实现访问射频卡的全部功能,并带有自动测卡操作。
2.型号编码用户可根据需要进行选型,编码规则如下所示:例:RF-ASC-00-00表示RF型读卡器支持S50、S70及Ultralight卡,通过串口与PC机进行通信,LCD显示,不包括大卡座(插接触式IC卡)及PSAM卡座(插SIM卡),最后的00代表标准机型,01、02…代表各种定制的特殊机型。
3.产品特性●支持卡型:读写符合ISO14443TYPEA/B、ISO15693标准的非接触卡/MIFARE系列卡 /ICODE2/AT020以及市场上常见的接触式逻辑加密IC卡●安全发卡:可增加2个符合GSM 11.11的SAM卡的卡座●与计算机接口:USB/ RS232/TTL电平/485/TCP-IP以及PC/SC和USB(即插即用)●天线:内置天线●外壳材料:ABS塑料外壳●工作频率:13.56MHz●工作电压:DC5V ± 10%●卡与机具通讯速度:106Kbit●工作温度:-20℃~60℃●所遵循的标准:ISO14443A/B ISO 15693●二次开发语言:支持多种开发语言,提供相应的例程(详见“1.5软件”)●操作系统:Windows 98 、 Me 、 2K 、 XP 、 2003、Vista 及 Unix 和 Linux●存储数据容量:读写器内存储器标准配置为 2K 字节(可根据用户需求量扩大)●状态显示:用户可控蜂鸣器●外型尺寸:长×宽×高:140*110*28 mm4.产品优势●符合GSM 11.11标准的SAM卡座可调整安全级别●多样化的通信方式,USB/RS232/TTL电平及USB(HID);支持TCP-IP及PC/SC协议●可根据用户要求定制,满足用户的特殊需求●指示灯及蜂鸣器可起到提醒作用,避免盲目操作出现故障5.开发包一份完整的开发包包括演示软件、演示软件使用说明书、读写器用户手册、TCP 接口读写器使用说明以及各种开发语言的例程。
文献综述电气工程及其自动化基于51单片机的IC卡读/写控制器随着社会的不断发展和进步,IC卡越来越被人们所青睐。
由于它小巧携带方便、保密性好,功能强大等的优点,使得它成为今后发展的重点。
科技在进步,它的功能会更强大,最后就会实现一卡在手走遍世界。
自1972年法国人罗兰·莫雷诺(Roland Moreno)首先提出IC卡的设想,1976年法国布尔(Bull)公司研制出世界第一张IC卡以来,IC卡技术飞速发展,已经形成涉及全球众多著名电子巨头的新兴技术产业。
我国的IC卡产业及应用始于20世纪90年代初,是伴随着我国政府启动的“金卡工程”而发展起来的,至今已有近十年的历史。
在这短暂的十年里,我国的IC卡产业及应用从无到有、从小到大,迅速走过了启动阶段,发展的速度是惊人的。
一、IC卡及读卡器的发展现状随着科技的发展,IC卡在我们的生活中越来越受到青睐,它的优点和优势也日渐凸显出来。
同时让我们在生活上得到了很多的方便,改善了我们的生活习惯。
所以研究IC卡的课题也将受到关注和发展。
IC卡已是当今国际电子信息产业的热点产品之一,除了在商业、医疗、保险、交通、能源、通讯、安全管理、身份识别等非金融领域得到广泛应用外,在金融领域的应用也日益广泛,影响十分深远。
IC卡的广泛应用也带动了控制器的发展,前几十年在整个计算机行业是通过纸或纸板打孔来储存信息,并且通过编写计算机系统程序,来读取这些被打孔卡的纸板信息。
随着技术的不断进步,计算机技术的日渐成熟,接触式的IC卡读卡器得到了广泛的应用,也在相应的行业发挥的巨大的作用,给各个行业都带来了很多方便。
任何的事物都会随着时间的发展和科技的发展日趋成熟,早期的IC卡系统是接触式的,它有其本身不可克服的缺点,如接触磨损、交易速率慢、难以维护、基础设施投入大等。
随着信息业和服务业的全球化,在一些场合,对信息载体的便携性、安全性及易用性等方面提出更高的要求,于是非接触式IC卡以其无机械磨损、容易维护、方便使用等优点,成为IC卡中潜力最大的新军而备受国内外业界的瞩目。
IC卡工作原理IC卡,也称为智能卡,是一种集成电路芯片的塑料卡片,用于存储和处理数据。
它被广泛应用于各种领域,如金融、交通、通信等。
IC卡的工作原理是通过与读写器进行通信,实现数据的传输和处理。
IC卡的结构包括芯片、封装和接触面。
芯片是IC卡的核心部份,其中包含了处理器、存储器、加密模块等功能模块。
封装是将芯片封装在塑料卡片中,以保护芯片免受外部环境的影响。
接触面是IC卡与读写器进行物理接触的部份,通常采用金属触点。
IC卡的工作过程可以分为初始化、通信和数据处理三个阶段。
首先是初始化阶段。
当IC卡与读写器接触时,读写器会向IC卡发送初始化命令,IC卡接收并解析该命令。
在初始化过程中,IC卡会进行电源管理、芯片复位、寄存器初始化等操作,以确保芯片处于正确的工作状态。
接下来是通信阶段。
IC卡与读写器通过接触面进行双向通信。
通信过程中,读写器会发送指令给IC卡,IC卡接收并执行相应的操作,然后将结果返回给读写器。
通信过程中的指令包括读取数据、写入数据、加密解密等操作。
最后是数据处理阶段。
IC卡接收到读写器发送的指令后,会根据指令进行相应的数据处理。
例如,当读写器发送读取数据的指令时,IC卡会从存储器中读取相应的数据并返回给读写器。
当读写器发送写入数据的指令时,IC卡会将数据写入到指定的存储器中。
在数据处理过程中,IC卡还可以进行加密解密等安全操作,以保护数据的安全性。
除了基本的读写操作,IC卡还可以支持一些高级功能,如身份认证、支付功能等。
例如,在金融领域中,IC卡可以用于存储银行卡信息,并通过密码验证用户身份。
在交通领域中,IC卡可以用于存储公交卡信息,并实现刷卡乘车的功能。
总结起来,IC卡的工作原理是通过与读写器进行通信,实现数据的传输和处理。
它的结构包括芯片、封装和接触面。
工作过程包括初始化、通信和数据处理三个阶段。
IC卡在各个领域都有广泛的应用,为人们的生活带来了便利和安全。
MIFARE & ISO14443A & ISO14443B & ISO15693非接触式, ISO7816接触式IC卡读写模块JMY6801 IC卡读写模块使用说明书(Revision 4.53)北京金木雨电子有限公司2015/1/27在使用本产品前请详细阅读本说明书,如果有任何疑问,请联系我们,我们会给您详尽的解答目录1 简介 (2)2 关键特点 (2)3 技术指标 (2)4 规格和引脚 (3)4.1. 图片 (3)4.2. 外形尺寸 (4)4.3. 引脚说明 (4)4.4. 模块功能配置表 (5)5 通讯协议 (6)6 文档更新记录 (6)1简介JMY6801是一个由用户发送命令,对非接触IC卡进行读写操作的一个模块式电路,区别其他模块的特性是天线背后装有铁氧体材料,可以减少模块周围的金属对读卡性能的影响,尤其适用于模块安装环境中金属物质比较多的情况。
JMY6801对T=CL的非接触CPU卡支持非常完善,除天线尺寸较小而导致天线能量偏低以外,其他部分全部符合EMV或PBOC 3.0对非接触IC卡读写器的标准,如FSDI=8等。
JMY6801支持多种协议和多种卡片,也带有2个SAM卡槽,支持ISO7816(T=0和T=1)。
设计者也对卡片的操作功能进行了优化,能够达到非常好的卡片操作速度。
JMY6801支持IIC、UART、RS232C或USB接口,射频天线与模块采用一体式设计,射频电路与天线之间使用阻抗分析仪调整以匹配阻抗,能达到非常好的读写性能和非常好的稳定性。
2关键特点● 天线背后设计有铁氧体材料,可以用于金属环境中。
● 天线一体式设计,天线性能稳定,一致性好。
● 对T=CL的卡片支持完善,支持FSDI=8,可以收发超过256字节的APDU。
● 模块的RF通讯协议可以通过EMV或PBOC的认证,全面满足支付系统要求。
● 二代证UID读取。
3技术指标● 射频基站:NXP MF RC500 / MF RC531 / SL RC632 / CL RC400● 工作频率:13.56MHz● 支持的标准: ISO14443A,ISO14443B,ISO15693,ISO7816● SAM卡座:2个,T=0 & T=1,支持9600、19200、38400、55800、57600、115200bps● 可读卡型:见:模块功能配置表● 防冲突能力:全功能防冲突,可以同时处理多张卡,可设定为只处理单张卡● 自动寻卡:支持,默认关闭,可设定默认状态● 供电电压:DC 5V(±0.5V)● 接口: IIC、UART、RS232C或USB HID(在订货时选定)● 通讯速率: IIC 最大200Kbps/38400bps/115200bps57600bps/UART/RS232C 19200bps/9600bps2.0HIDUSB USB● 接口电平:UART/IIC:3.3V(TTL电平,5V兼容)● 最大指令长度: JCP04 253字节JCP05 510字节● 最大静态功耗:150mA● 读卡距离:80mm(MIFARE One典型距离,与卡片品质有关)● 尺寸:70mm*50mm*16.5mm● 重量:约120克● 工作温度:-25 ~ +85 ℃● 储存温度:-40 ~ +125 ℃● ISP:支持● RoHS:支持4规格和引脚4.1.图片4.2.外形尺寸4.3.引脚说明引脚功能类型说明1 ICC 输出天线区域有无卡片指示:0:有卡;1:无卡2 TXD/SDA 输入/输出RS232C TXD / UART TXD / IIC SDA / USB D+3 RXD/SCL 输入RS232C RXD / UART RXD / IIC SCL / USB D-4 VCC 电源 VCC5 GND 电源 GND4.4.模块功能配置表JMY6801A JMY6801C JMY6801G JMY6801HPCD MF RC500 MF RC531 SL RC400 CL RC632JCP04通讯协议●●●●JCP05通讯协议●●●●MIFARE 1K ●●●MIFARE 4K ●●●MIFARE Ultra Light ●●●MIFARE Ultra Light C ●●●MIFARE Mini ●●●MIFARE DES fire分立指令●●●MIFARE Plus ●●●T=CL TYPE A ●●●●●SR176●●SRI512●●SRI1K●●SRI2K●●SRI4K●●SRIX4KT=CL TYPE B ●●I.CODE 1 ●●I.CODE SLI ●●I.CODE SLI-S ●●TI Tag-it系列●●ST LRI系列●●SAM卡座 2 ISO7816 (T=0 & T=1) ●●●●On Chip Data FLASH 512 bytesInterface JMY6801AI JMY6801CI JMY6801GI JMY6801HIIICUART Interface JMY6801AT JMY6801CT JMY6801GT JMY6801HTInterface JMY6801AS JMY6801CS JMY6801GS JMY6801HSRS232CInterface JMY6801AU JMY6801CU JMY6801GU JMY6801HUUSB5通讯协议模块的电路通讯接口是多样的,但数据链路层协议遵循JCP04和JCP05通讯协议,请参考《JMY600系列读卡模块通用技术手册.PDF》;我们也提供一个PC端的测试软件,叫做:TransPort,可以协助开发者提高工作效率;我们还提供模块操作的例子代码,这是基于KEIL的C51格式或ASM51格式的工程;以上资源可以在产品光盘上可以找到,也可从我公司网站()下载、联系我公司销售人员或发送E-mail到:****************.com。
门禁ic卡工作原理
门禁IC卡是现代门禁系统中常见的一种认证方式。
它使用射频识别技术(RFID)来识别身份,是一种非接触式的身份认证方式。
门禁IC卡由芯片和天线组成,芯片内存储着用户的身份信息和授权信息,当IC
卡靠近读写器时,读写器通过射频信号驱动IC卡芯片并读出内部的身份信息实现身份认证。
门禁IC卡工作原理主要分为三个步骤:
1. 射频识别
当IC卡靠近读写器时,它会接收到来自读写器的射频信号。
IC卡内置的飞行芯片会通过感应天线接收到信号,并将芯片内部存储的信号返
回给读写器。
读写器以此来确定IC卡的是否有效以及持卡人的身份信息。
2. 身份认证
读写器接收到IC卡返回的身份信息后,会将其与系统内存储的身份数据库进行比对认证。
如果身份信息匹配,读写器会向控制器发出开门
信号,并且门禁系统会记录下持卡人进出记录。
如果身份信息不匹配,
则门禁系统会拒绝开门并记录非法进入信息。
3. 授权管理
除了对持卡人身份进行认证,门禁IC卡还可以根据授权信息来管理访问权限。
授权信息可以根据使用者的安全级别和需求进行定制化设置。
例如,可以根据员工的不同职位和工作性质,分配不同的门禁授权,
实现安全管理和访问控制。
总之,门禁IC卡是一种安全、高效的身份认证方式,它依靠射频技术,快速、准确地完成身份认证,并可根据授权管理实现灵活的门禁控制。
目前,门禁IC卡已广泛应用于各种场所,如公司、商场、学校等。
IC卡工作原理IC卡,即集成电路卡,是一种具有存储和处理功能的智能卡。
IC卡的工作原理是基于集成电路技术,通过内部的芯片实现信息的存储和处理。
本文将从IC卡的基本原理、通信方式、数据存储、安全性和应用领域等五个方面进行详细介绍。
一、基本原理1.1 IC卡的芯片IC卡的芯片是其核心部件,包括存储器、处理器和接口电路等。
1.2 电源供应IC卡通过外部读卡器提供电源,也可以通过接触式或非接触式方式实现电源供应。
1.3 通信接口IC卡通过通信接口与外部读卡器进行数据交换,常见的接口包括接触式和非接触式。
二、通信方式2.1 接触式通信IC卡通过金属触点与读卡器进行数据传输,速度较快但易受损。
2.2 非接触式通信IC卡通过射频信号与读卡器进行无线通信,速度较慢但更安全。
2.3 双向通信IC卡与读卡器之间进行双向通信,可以实现数据的传输和处理。
三、数据存储3.1 存储器类型IC卡的存储器包括只读存储器(ROM)、随机存储器(RAM)和可编程存储器(EEPROM)等。
3.2 数据存储格式IC卡中的数据按照特定的格式进行存储,包括应用数据、个人信息和安全密钥等。
3.3 数据读写IC卡可以通过读卡器进行数据的读取和写入,实现信息的更新和传输。
四、安全性4.1 加密算法IC卡通过内置的加密算法对数据进行加密保护,确保信息的安全性。
4.2 认证机制IC卡通过认证机制验证用户身份,防止未经授权的访问和操作。
4.3 安全协议IC卡与读卡器之间通过安全协议进行通信,保障数据传输的安全性和完整性。
五、应用领域5.1 金融领域IC卡在银行卡、信用卡等金融领域得到广泛应用,实现支付和交易功能。
5.2 通信领域IC卡在手机SIM卡、门禁卡等通信领域发挥重要作用,实现通信和身份认证功能。
5.3 其他领域IC卡还广泛应用于交通卡、健康卡、身份证等领域,为人们的生活提供便利和安全保障。
总结:IC卡作为一种智能卡,通过集成电路技术实现信息的存储和处理,具有安全性高、功能多样等优点,在金融、通信等领域得到广泛应用。
RFID非接触式IC卡读写器用户手册V1.021、通信协议描述1.1 协议概述该协议是上位机与读写器之间的通讯协议。
通讯的格式是:1位起始位,1位长度标志位,若干数据位,1位异或校验位,1位结束位。
通讯的最大长度为64字节。
1.2 字符定义1.3 通讯过程示意图上位机(发送)读写器(接收)STXLENINFO(0)INFO(N)BCCETX发送结束上位机(接收)读写器(发送)STXLENINFO(0)INFO(N)BCCETX接收结束1.4 数据格式2、指令集2.1 指令一览表2.2 状态返回值3、二次开发接口函数说明3.1 适用于符合ISO/IEC14443A标准的存储卡的接口函数3.1.1 Mifare S50/S70卡片特性S50具有1K字节的EEPROM,S70具有4K字节的EEPROMS50分为16个扇区,每个扇区包括4块,每块16个字节,以块为存取单位S70分为40个扇区,共256个块,每块16个字节,以块为存取单位用户可自定义每个存储块的访问条件每张卡有唯一序列号,为32位具有防冲突机制,支持多卡操作非接触传送数据和无源至少10年数据保存期至少10万次擦写读写距离在100mm内工作频率为13.56MHz3.1.2 函数使用注意事项该二次开发接口函数库提供用于下发命令至读写器的函数,这些函数能够控制读写器对卡片进行寻卡及读写操作。
在对卡片进行操作前必须先寻卡,寻卡成功后才能对卡片进行后续操作。
卡片的读写操作是以块为单位,每块为16个字节。
不同扇区可以用不同的密钥进行认证,每个扇区又可以使用A密钥或B密钥进行认证。
3.1.3 函数说明(1)寻卡int find_14443(BYTE* type, BYTE* card_uid );////////////////////////////////////////////////////////////////////////////////////////////////////// ////功能:寻卡////入口参数:////出口参数:type,指示寻卡成功的卡片为A类卡或是B类卡// card_uid,指示用于存放UID的起始地址////返回值:返回0,通信失败// 返回1,操作成功// 返回0xff,操作失败////说明:获取卡片UID////////////////////////////////////////////////////////////////////////////////////////////////////// (2)HALT卡int set_halt();////////////////////////////////////////////////////////////////////////////////////////////////////// ////功能:使卡片休眠////入口参数:////出口参数:////返回值:返回-2,尚未寻卡// 返回0,通信失败// 返回1,操作成功// 返回0xff,操作失败////说明:在HALT卡前必须已经寻卡成功////////////////////////////////////////////////////////////////////////////////////////////////////// (3)激活卡片int set_active();////////////////////////////////////////////////////////////////////////////////////////////////////// ////功能:激活卡片////入口参数:////出口参数:////返回值:返回-2,尚未寻卡// 返回0,通信失败// 返回1,操作成功// 返回0xff,操作失败//说明:可以令处于休眠状态的卡片处于激活状态////////////////////////////////////////////////////////////////////////////////////////////////////// (4)读块int read_block(int page,int block,unsigned char pswtype,unsigned char *psw,unsigned char *des_data,int* des_len);////////////////////////////////////////////////////////////////////////////////////////////////////// ////功能:读取一个块的值////入口参数:page,指定要读取的块所在的扇区// block,指定要读取的块的块号// pswtype,指定用于认证的密钥的类型,其值可为0x0a或者0x0b// psw,指示用于认证的密钥的值的起始地址////出口参数:des_data,指示用于存放读取的数据的起始地址// des_len,指示用于存放返回读取数据长度的起始地址////返回值:返回-2,尚未寻卡// 返回-1,传入参数错误// 返回0,通信失败// 返回1,操作成功// 返回0xff,操作失败////说明:pswtype用于指于认证密钥为A密钥或为B密钥,对应A密钥pswtype必// 须为0x0a,对应B密钥pswtype必须为0x0b。
ic卡读卡原理
IC卡读卡原理是通过读卡器将IC卡与电子设备进行连接,实
现数据的读取与传输。
IC卡内部有一个芯片,芯片上存储有
用户的个人信息和相关数据。
读卡器中的感应线圈通过感应
IC卡内部的电感,识别出卡片的存在并建立起连接。
当IC卡与读卡器连接后,读卡器会向IC卡发送命令,要求
IC卡返回其中存储的数据。
IC卡会接收到读卡器的命令后,
内部的芯片会根据命令执行相应的操作,将需要的数据从芯片中读取出来,并通过读卡器传回去。
具体来说,IC卡的读卡原理主要包括以下几个步骤:
1. 插卡识别:将IC卡插入读卡器中,读卡器的插槽会与IC卡的插针接触,建立物理连接。
2. 电源供给:读卡器为IC卡提供电源,以保证IC卡正常工作。
3. 命令传输:读卡器向IC卡发送相应的命令,包括读取数据、写入数据、验证身份等操作。
4. 数据传输:IC卡接收到读卡器的命令后,从芯片中读取相
应的数据,并传输回读卡器。
5. 数据解析:读卡器对接收到的数据进行解析和处理,以便后续应用程序的使用。
总的来说,IC卡读卡原理就是通过读卡器与IC卡之间的物理
连接和命令传输,实现数据的读取和传输。
这种方式使得IC
卡可以方便地用于各种场景,如门禁系统、公交卡等。
13.3 IC卡应用 IC(Integrated Circuit)卡,也被称作智能卡(Smart Card),具有写入数据和存储数据的功能,IC卡内存储器的内容可以根据需要有条件地供外部读取,完成信息处理和判定。由于其内部具有集成电路,不但可以存储大量信息,具有极强的保密性能,并且还具有抗干扰、无磨损、寿命长等特性。因此在各个领域中得到广泛应用。下面通过两个实例介绍IC卡的简单应用。
实例422 向IC卡中写入数据 实例说明 IC卡是携带应用信息和数据的媒体,空白IC卡是不能立即使用的,必须对IC卡应用系统进行初始化,写入系统IC卡和个人密码,个人专用信息和应用数据。下面介绍如何向IC卡中写入数据。运行本例,在“数据”文本框中输入要存入IC卡中的数据,单击“写数据”按钮,即可将输入的数据写入IC卡中。如图13.6所示。
技术要点 本例使用的是深圳明华生产的明华IC卡读写器,用户在使用时将驱动程序安装完毕后,即可正常使用本系统。
本例通过调用Mwic_32.dll链接库,进行IC卡的读写工作。下面介绍与IC卡写操作相关的几个函数。
(1)auto_init函数 该函数用于初始化IC卡读卡器。语法如下: public static extern int auto_init(int port, int baud); 参数说明如下。 l port:标识端口号,Com1对应的端口号为0;Com2对应的端口号为1,依此类推。 l baud:标识波特率。 l 返回值:如果初始化成功,返回值是IC卡设备句柄;如果初始化失败,返回值小于零。 (2)setsc_md函数 该函数用于设置设备密码模式。语法如下: public static extern int setsc_md(int icdev, int mode); 参数说明如下。 l icdev:标识设备句柄,通常是auto_init函数的返回值。 l mode:标识设备密码模式,如果为0,设备密码有效,设备在加电时必须验证设备密码才能对设备进行操作。如果为1,设备密码无效。
l 返回值:如果函数执行成功返回值为零,否则小于零。 (3)get_status函数 该函数用于获取设备的当前状态。语法如下: public static extern Int16 get_status(int icdev, Int16* state); 参数说明如下。 l icdev:标识设备句柄,通常是auto_init函数的返回值。 l state:用于接收函数返回的结果。如果为0表示读卡器中无卡,为1表示读卡器中有卡。
l 返回值:如果函数执行成功返回值为零,否则小于零。 (4)csc_4442函数 该函数用于核对IC卡密码。语法如下: public static extern Int16 Csc_4442(int icdev, int len, [MarshalAs(UnmanagedType.LPArray)] byte[] p_string);
参数说明如下。 l icdev:标识设备句柄,通常是auto_init函数的返回值。 l len:标识密码长度,其值为3。 l p_string:标识设置的密码。 l 返回值:如果函数执行成功返回值为零,否则小于零。 (5)swr_4442函数 该函数用于向IC卡中写入数据。语法如下: public static extern int swr_4442(int icdev, int offset, int len, char* w_string); 参数说明如下。 l icdev:标识设备句柄,通常是auto_init函数的返回值。 l offset:标识地址的偏移量,范围是0~255。 l len:标识字符串长度。 l w_string:标识写入的数据。 (6)ic_exit函数 该函数用于关闭设备端口。语法如下: public static extern int ic_exit(int icdev); 参数说明如下。 l icdev:标识设备句柄,通常是auto_init函数的返回值。 (7)dv_beep函数 该函数使读卡器嗡鸣。语法如下: public static extern int dv_beep(int icdev, int time); 参数说明如下。 l icdev:标识设备句柄,通常是auto_init函数的返回值。 l time:标识嗡鸣持续的时间,单位是10毫秒。 实现过程 (1)新建一个项目,命名为Ex13_05,默认窗体为Form1。
(2)在Form1窗体中,主要添加两个Button控件,用于执行向卡中写入数据和退出程序的操作,添加一个TextBox控件,将TextBox中数据写入IC卡中。
(3)主要程序代码。 将程序所使用的操作IC卡的函数,封装在类IC中。代码如下: [StructLayout(LayoutKind.Sequential)] public unsafe class IC { //对设备进行初始化 [DllImport("Mwic_32.dll", EntryPoint = "auto_init", SetLastError = true, CharSet = CharSet.Ansi, ExactSpelling = true, CallingConvention = CallingConvention.StdCall)]
public static extern int auto_init(int port, int baud); //设备密码格式 [DllImport("Mwic_32.dll", EntryPoint = "setsc_md", SetLastError = true, CharSet = CharSet.Ansi, ExactSpelling = true, CallingConvention = CallingConvention.StdCall)]
public static extern int setsc_md(int icdev, int mode); //获取设备当前状态 [DllImport("Mwic_32.dll", EntryPoint = "get_status", SetLastError = true, CharSet = CharSet.Ansi, ExactSpelling = true, CallingConvention = CallingConvention.StdCall)]
public static extern Int16 get_status(int icdev, Int16* state); //关闭设备通讯接口 [DllImport("Mwic_32.dll", EntryPoint = "ic_exit", SetLastError = true, CharSet = CharSet.Ansi, ExactSpelling = true, CallingConvention = CallingConvention.StdCall)]
public static extern int ic_exit(int icdev); //使设备发出蜂鸣声 [DllImport("Mwic_32.dll", EntryPoint = "dv_beep", SetLastError = true, CharSet = CharSet.Ansi, ExactSpelling = true, CallingConvention = CallingConvention.StdCall)]
public static extern int dv_beep(int icdev, int time); //向IC卡中写数据 [DllImport("Mwic_32.dll", EntryPoint = "swr_4442", SetLastError = true, CharSet = CharSet.Ansi, ExactSpelling = true, CallingConvention = CallingConvention.StdCall)]
public static extern int swr_4442(int icdev, int offset, int len, char* w_string); //核对卡密码 [DllImport("Mwic_32.dll", EntryPoint = "csc_4442", SetLastError = true, CharSet = CharSet.Auto, ExactSpelling = true, CallingConvention = CallingConvention.Winapi)]
public static extern Int16 Csc_4442(int icdev, int len, [MarshalAs(UnmanagedType.LPArray)] byte[] p_string);
} 下面代码主要用于将TextBox中数据写入到IC卡中。代码如下: private void button1_Click(object sender, EventArgs e) { //初始化 int icdev = IC.auto_init(0, 9600); if (icdev < 0)