切换到宽版
  • 11726阅读
  • 17回复

[AVR]基于AVR单片机ATtiny13做的125KHz RFID模拟卡 [复制链接]

上一主题 下一主题
离线40560335
 

发帖
1067
M币
318
专家
1
粉丝
17
只看楼主 倒序阅读 我要置顶 楼主  发表于: 2017-01-20

首先得感谢群里的大侠们:
@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重新编辑 ]
本文内容包含图片或附件,获取更多资讯,请 登录 后查看;或者 注册 成为会员获得更多权限
本帖提到的人: @mengxp @fm007 @renpeng009
本帖最近打赏记录:共12条打赏M币+41
12
离线lvehe

发帖
94
M币
220
专家
4
粉丝
7
只看该作者 1楼 发表于: 2017-01-20
请登录后查看
离线renpeng009

发帖
324
M币
3196
专家
9
粉丝
47
只看该作者 2楼 发表于: 2017-01-20
请登录后查看
离线yanxue11

发帖
547
M币
4776
专家
9
粉丝
96
只看该作者 3楼 发表于: 2017-01-20
请登录后查看
离线fm007

发帖
3045
M币
6515
专家
24
粉丝
78
只看该作者 4楼 发表于: 2017-01-21
请登录后查看
离线40560335

发帖
1067
M币
318
专家
1
粉丝
17
只看该作者 5楼 发表于: 2017-01-21
回 renpeng009 的帖子
请登录后查看
离线cao57508

发帖
2265
M币
3657
专家
9
粉丝
85
只看该作者 6楼 发表于: 2017-01-21
请登录后查看
离线maidoo

发帖
621
M币
6805
专家
19
粉丝
84
只看该作者 7楼 发表于: 2017-01-21
请登录后查看
离线faladay

发帖
1349
M币
3950
专家
16
粉丝
23
只看该作者 8楼 发表于: 2017-01-22
请登录后查看
离线mengxp
发帖
101
M币
357
专家
3
粉丝
15
只看该作者 9楼 发表于: 2017-01-24
请登录后查看
快速回复
限80 字节
如果您提交过一次失败了,可以用”恢复数据”来恢复帖子内容
 
上一个 下一个