📄 ic卡.txt
字号:
-------------------------------------------------------------------------------
IC电话卡后,基本已取代了原来流行的电话磁卡,磁卡存在存在严重的安全问题,已逐步淘汰。
即使IC电话卡,也不能算很安全,卡内所有数据只要有简单的读写装置并按时序操作都能读
取,事实上电话卡和信用卡一样内部没有什么秘密信息,仅仅是带串行输出的128位EPROM而
已(对二类卡是256位PROM),其开始的64位是带写保护的,在出厂时其熔丝位已被编程,你无
法对其更改,其后的40位计数单元受内部逻辑控制在写时只能减少不能增加直至到0为止,因
此你想用一般的IC电话卡打免费电话是不可能的,除非你能用微控制器仿真它。
IC电话卡是一种一次性使用的计数卡,以一次性的计数方式,从写满的计数器中减“1”,
直至存储单元减为空为止。卡片每次消费计数的“单位价值”根据各种应用系统的实际需要而定。
例如:对于中国IC电话卡,如30元卡对应内部计数值为300,每单位值对应0.1元,IC 卡电话机
每分钟产生一次扣费信号,扣费值由当地IC电话管理系统设定,一般是价值0.5元或1元,卡片
被计数5次和10次。对于其它国家属于第一类IC电话卡而言也是如此,只是内部初始计数值不同,
每次扣除额度不一样罢了。其他对于公用加油卡,IC卡计费加油机每一公升(或一加仑)产生一次
扣费操作,卡片被操作一次扣2.5元等等,均属于等同原理。事实上,这类卡内部为128位
(16字节) NMOS存储器,按如下规律分布:
64 位 EPPOM(8字节) 写保护区(芯片数据代码区、发行数据代码区)
40 位 EEPROM(5字节)
24 位 为全“1”(3字节)
共16字节数据。
Ⅰ-2)引脚:(触点朝上)
-------------+-------------
| 1 | 5 | 引 脚:
| | | -------
+-------\ | /-------+
| 2 +----+ + 6 | 1 : Vcc = 5V 5 : Gnd
| | | | 2 : Reset 6 : NC
+--------| |--------+ 3 : Clock 7 : I/O
| 3 | | 7 | 4 : NC 8 : NC
| +----+----+ |
+-------/ | \-------+ Vcc:电源 Gnd:地脚 Reset:复位
| 4 | 8 |
| | | Clock:时钟 I/O:数据 NC: 空脚
-------------+-------------
因有三个脚为空脚,目前一般有采用8脚和6脚封装的,6脚封装的无最下一排两个空脚
Ⅰ-3)主要特性:
-采用单一5V电源供电
-遵循ISO/IEC7816-3同步协议进行双向数据传输
-低功耗
-NMOS技术
-高可靠性,抗静电干扰能力>4KV
Ⅰ-4)时序图
复位:
为使地址计数器复位到0,先让Reset端变高。紧跟着一个Clock脉冲(从低到高再降到0),
Reset重新变低,把Clock脉冲包住。随着Reset端变低,地址0单元的数据从I/O上输出。对
应 Clock端的每个脉冲,其上升沿使地址计数器增加。其下降沿使被选通地址单元的数据从
I/O上输出。地址计数器增加到127后返回到0。
__________________
_____| |_____________________________________________ Reset
: :
: _____ : _____ _____ _____ _____
_____:_______| |____:_| |_____| |_____| |_____| |_ Clk
: : : : : : : : : : :
_____:_______:__________:_:_____:_____:_____:_____:_____:_____:_____:_
_____:___n___|_____0____:_|_____1_____|_____2_____|_____3_____|___4_:_ (Address)
: : : : : :
_____: :_______:___________:___________:___________:_
_____XXXXXXXXXXXXXXXXXXXX_______|___________|___________|___________|_ Data
Bit n Bit 0 Bit 1 Bit2 Bit3
写位:
在Reset和Clk端均为低的情况下,如果某地址单元允许写操作(64-103位,且该位必需为
1),则Reset端上的一个脉冲(即从低到高再回低)将允许芯片进行位写操作。在紧跟着的
时钟脉冲期间执行写操作,调整写操作维持时间至少10ms,在这个CLK脉冲期间,地址计数器
不会增加,在CLK写脉冲下降沿,数据0从I/O端输出。从Reset脉冲的上升沿到CLK写脉冲的
下降沿期间,I/O端的数据是无效的。在下一个才CLK脉冲,且Reset为低时,地址计数器又
增1,并在下降沿时,把选通的地址单元的数据送到I/O端。
_____ _____
_____________| |______________________________| |_______________ Reset
: :
___ : _____ ___ : _____
____| |____:__________| |_________| |_____:__________| |____ Clk
: : : : : : : : :
____:________:__________:_____:_________:___:_____:__________:_____:_____
n | n+1 | n+2 | : n+3 | :
(Address)
----'--------:----------'-----:---------'---:-----:----------'-----:-----
: : : : : : :
_________ _: : : ____________: ___: : :
_________XXX_XXXXXXXXXXXXXXXXXXX____________ XX___XXXXXXXXXXXXXXXXXXXXXXX I/O
n n+1 : : n+1 n+2 : :
: : : :
write write
借位写后的字节擦除:
对位地址72-103的字节单元来说,只要在每个字节的前面一位进行一次正常的写操作,就可
以对此字节后一字节进行字节擦除操作。也就是说,每向高一字节进行借位(即写一位
0),紧接着的擦除时序可以对后一字节按字节擦除(即整个字节写1)。被擦除的字节总是
比借位写的字节低一字节。从以下时序图可以看出,首先,完成一个“位写”操作,在CLK
的写脉冲结束后,在CLK为低电平时,在发一个Reset脉冲即启动字节擦除操作。在第二个
CLK脉冲完成字节擦除,脉冲维持时间整定为擦除周期时间(至少1ms)。芯片逻辑控制电路
验证了借位写确已完成从“1”写“0”后,才擦除其低位字节。从Reset的上升沿到擦除操
作的CLK脉冲的下降沿,I/O脚上的数据无效。地址计数器仍然停留在借位写的地址上。
_____ _____
______| |____________________| |_________________________________ Rst
: :
: _______ : _______ ___
______:___________| |______:_____________| |______| |______ Clk
: : : : : : : :
: : : : : : : :
<------------------------- address n ------------------------>:<--- n+1 ------
: : : : : : :
: : : : : : :
______: : :______: : :__________: _____
______XXXXXXXXXXXXXXXXXXXXX______XXXXXXXXXXXXXXXXXXXXXXX__________XX_____ I/O
: : n : : n n+1
: : : :
Write Erase
计数方法:
在67-103地址单元中分为5个不可重置8单元计数器,芯片初始化时,72-103地址单元所对应
的4个较低的8单元计数器中可以放0到8个“1”而67-71地址单元所对应的第5个计数器可以
放0到5个“1”。所谓计数一次,就是将一个单元从“1”写成“0”。一个计数器中8位全为
“0”后,要计数,需借位操作,即将高位计数器的一位从“1”写成“0”而相应其低位计
数器整个字节从“0”擦除成“1”。可见4个8单元计数器如此逐一递减,其最大计数为8的4
次方=4096。第5个计数器中5个单元因处在最高位只能被写“0”无法擦成“1”。因此只能
计数5次。故芯片总计数为5X4096=20480。当全部计数单元(地址67-103)都被写成“0”
时,卡片就用完了,不过,芯片出厂初始化时,初置的计数值由国家不同和卡片面值不同而
不同,如100元卡初置计数值为1000。
举例: 100元(1000计数单元预置初始值).
--------
Byte9 Byte10 Byte11 Byte12 Byte13
--------------------------------------------------------------
000000 - 00000001 - 01111111 - 00011111 - 00000000
--------------------------------------------------------------
(3)octal (6)octal (7)octal (1)octal (2)octal
--------------------------------------------------------------
Value = 0*8^4 + 1*8^3 + 7*8^2 + 5*8^1 + 0*8^
--------------------------------------------------------------
总值 = 1000 Units
Ⅰ-5)内存数据:
字节 位 二进制 十六进制
+-----------+-----+
1 1 --> 8 | | |
+-----------+-----+
2 9 --> 16 | 0010 1111 | $2F | ---> 德国
| 0011 0111 | $37 | ---> 西班牙
| 0011 1011 | $3B | ---> 希腊
+-----------+-----+
3 17 --> 24 | | |
4 25 --> 32 | | | ---> 出厂编号(写保护)
5 33 --> 40 | | |
6 41 --> 48 | | |
7 49 --> 56 | | |
8 57 --> 64 | | |
+-----------+-----+
9 65 --> 72 | | | ---> c4096 )
10 73 --> 80 | | | ---> c512 )
11 81 --> 88 | | | ---> c64 ) 5个8进制计数区
12 89 --> 96 | | | ---> c8 )
13 97 --> 104 | | | ---> c0 )
+-----------+-----+
14 105 --> 112 | 1111 1111 | $FF |
15 113 --> 120 | 1111 1111 | $FF | ---> 所有位都为"1"
16 120 --> 128 | 1111 1111 | $FF |
+-----------+-----+
---------------------------------------------------------------------------------
下面是根据上述编的一个子程序:
#include "ycc_prj.h"(这个头文件定义了byte、word等宏,51单片机,KeilC编译环境)
sbit RST = P1^7;
sbit CLK = P1^6;
sbit DAT = P1^5;
#define NOP_1 _nop_()
#define NOP_2 \
NOP_1; \
NOP_1;
#define NOP_4 \
NOP_2; \
NOP_2;
#define NOP_8 \
NOP_4; \
NOP_4;
#define NOP_16 \
NOP_8; \
NOP_8;
#define NOP_32 \
NOP_16; \
NOP_16;
#define NOP_64 \
NOP_32; \
NOP_32;
#define NOP_128 \
NOP_64; \
NOP_64;
void wait(byte i){byte j;for(j=0;j<i;j++);}
bit read_a_bit()
{
bit c;
CLK=1;
NOP_16;
c=DAT;
NOP_16;
CLK=0;
// NOP_1;
return c;
}
void read()
{
byte i=0,j=0;
byte card_buf[32];
byte card_r=0;
RST=0;
CLK=0;
DAT=1;
wait(-2);
RST=1;
NOP_8;
CLK=1;
NOP_32;
NOP_16;
CLK=0;
NOP_8;
RST=0;
NOP_8;
NOP_2;
for(j=0;j<=31;j++)
{
card_r=0;
do
{
card_r<<=1;
card_r |= (byte)read_a_bit();
i++;
i&=0x07;
if(i==0)
{
card_buf[j]=card_r;
card_r=0;
}
else
{
card_buf[32]=card_r;
card_r=card_buf[32];
card_buf[32]=card_r;
card_r=card_buf[32];
}
}while(i!=0);
}
RST=0;
NOP_8;
CLK=0;
DAT=1;
card_r=0;
}
我读了一张电信的电话IC卡,内容是
10 2B 22 89 00 A9 2C 10
00 00 7F 1F 3F
FF FF FF
其中面值数据为 00 00 7F 1F 3F 也就是7*8^2 + 5*8^1 + 6*8^0=494,即49.4元。
用外部器件仿真IC卡是可行的,但是51系列单片机的速度不够。
IC电话卡的通讯协议名称为ISO/IEC7816。
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -