首先得感谢群里的大侠们:@renpeng009 用LGT单片机做的125kHz ID卡 读卡器+复制卡 RFID 模拟小蓝片门禁卡 @fm007 以前用单片机DIY的RFID模拟卡,能模拟现有125KHz的卡! @mengxp RFID模拟卡一卡四号DIY,已制成成品 制作起因: 突然对125KHz RFID感兴趣,想自己做个RFID复制器玩玩,论坛搜索相关资料时,发现有人用单片机模拟EM4100卡,所以也自己做了个玩玩。经实际测试发现,只需要改一下中断周期,也可以用于模拟250Khz、375Khz、500Khz的偏频ID卡,刚在房东250Khz的门禁上试了下,成功开门,哈哈。
单片机选型: 先说说单片机吧,AVR、STM8、STM32都会点,但是比较熟练的只有AVR单片机,因为当时入门就学的AVR,而且DS看起来一目了然,而STM的可能是因为功能过于强大吧,DS看起来各种迷乱,各种傻傻分不清楚,刚好又看到“renpeng009 ”大侠使用了LGT单片机,LGT是在教主论坛里兴起、应该是属于山寨AVR的吧,但是功能又强于AVR的一款国产单片机,寄存器都差不多,本着偷懒的想法想着移植起来比较方便,所以就采用了ATtiny13。
单片机对比:
AVR单片机虽然耐操,截止目前还没玩坏过一片AVR,手残把熔丝位设置错除外,但是价格目前相比其它单片机还是比较贵的,而且片内资源也比较可怜,仅有1K的Flash,64字节的SRAN和EEPROM。近几年常见到性价比比较高的就是STM8S003F3P6了,高手们发现它与STM8S103F3P6内部资源完全一致,也就是说可能厂家为了方便,只是印上了不同的型号而已,拥有8K的Flash,640字节的EEPROM,1K的RAN,而售价也只有1.0—1.2元,也就是上一次WC的价格,但是感觉并不是很耐操,上次帮人家开发个东西短短几天就被我搞坏N片。总之两者各有利弊。
原理图(renpeng009发的原理图中的线圈驱动及取电电路): 原理分析(摘自百度到的各种文档资料):EM4100数据存储格式:
要模拟EM4100卡,当然得先了解其发生的数据结构了,EM4100的64位数据信息[引,它由5个区组成:9个引导位、10个行偶校验位“P0~P9”、4个列偶校验位“PC0 PC3”、40个数据位“D00~D93”和1个停止位SO。9个引导位是出厂时就已掩膜在芯片内的,其值为“111111111”,当它输出数据时,首先输出9个引导位,然后是10组由4个数据位和1个行偶校验位组成的数据串,其次是4个列偶校验位,最后是停止位“0”。“D00~D13”是一个8位的晶体版本号或ID识别码。“D20~D93”是8组32位的芯片信息,即卡号。每当EM4100将64个信息位传输完毕后,只要ID卡仍处于读卡器的工作区域内,它将再次按照图3顺序发送64位信息,如此重复,直至lD卡退出读卡器的有效工作区域。
EM4100数据编码方式:
在曼彻斯特码调制方式下,EM4100每传送一位数据的时间是64个振荡周期,其值由RF/n决定。若载波频率为125 kHz,则每传送一位的时间为振荡周期的64分频,即位传送时间为:1P一64/125kHz=512us,则半个周期的时间为256us。
也就是说,我们要对读卡器发送的数据为:9位引导码 + 厂商码、ID分为高4位、低4位,并分别生成行偶校验位,然后把这些数据转成二进制后连起来,再分别分为8个16进制即可。
转换例子如下:
厂商号:228(255内随便编,反正读卡器从来不输出这个编号)
卡 号:0011928481
写空白卡的16进制数据:E4 00 B6 03 A1
数据结构:
引导位:111111111 行校验
厂商码高4位:1110 1
厂商码低4位:0100 1 11100100=E4
第01位高4位:0000 0
第01位低4位:0000 0 00000000=00
第02位高4位:1011 1
第02位低4位:0110 0 10110110=6B
第03位高4位:0000 0
第03位低4位:0011 0 00000011=03
第04位高4位:1010 0
第04位低4位:0001 1 10100001=A1
列校验: 1111 结束位:0
共 计:64位
转换后写空白卡的数据:
11111111 11110101 00100000 00000101 11011000 00000011 01010000 01111110
0xFF 0xF5 0x20 0x05 0xD8 0x03 0x50 0x7E
其实淘宝卖的空白ID卡,输出的数据格式与M4100卡并不相同,只是对空白卡写入了这些数据后,通讯时逐字节发送,用以模仿EM4100卡的数据格式,本地做的这个模拟卡也是同样的道理,仅此而已。
编程思路: 因为想偷懒,开始使用了“renpeng009”的方法,使用CTC比较模式,比较匹配时清零并产生中断,然后在CTC中断中改变OCA的输出边沿方向的方法:“1”由OCR0A置位和清零组成,“0”由OCR0A清零和置位组成,但是实际中用示波器测量发现,中断周期本来仅有512us,但是对寄存器操作改变输出边沿后周期变成了3ms,不知道为什么LGT单片机就可以,所以最后只好关闭对应的引脚输出,采用直接操作IO口方法,再一看中断周期正常,把线圈在读卡器放了一下,发出了期待的:滴。。。并输出了正确的ID号。
代码我就不上,参考“renpeng009”大侠的就OK,简单来说就是定时器根据所需频率产生中断,然后在中断中按要发送的数据发送10,或者01即可。
发现问题及疑问: 线圈是125KHz老式售饭机中拆的,通过线圈整流电路对单片机供电,不知道为什么最后电压只有2V,而且使用连接电脑的读卡器没问题,但是用那种手持ID卡复制器就不行,电压只有1.6V,单片机无法工作,我看各位大侠的原理图,在线圈两端也并上了谐振电容,是因为我没有谐振电容造成的吗?ID卡应答器天线也需要谐振吗?
洞洞板搭的线圈部分:
另外,求MBBBBBBBBBBBBBBBBBBB,为什么你们随便都好几万。。。

[ 此帖被40560335在2017-01-26 21:29重新编辑 ]