對於剛接觸智慧卡的工程師來說,在閱讀
7816-3
規範的時候,常常被其中的一些術語迷惑,讀起來會覺得有些彆扭。尤其是在看到復位應答中的f和
d設定以及對應的
etu的時候,會覺得有些複雜和難以理解。
其實從本質上說
7816-3
定義了智慧卡(這裡指的是接觸式
cpu卡,對於邏輯加密卡以及非接觸
ic卡不在此列)和讀寫裝置之間的通訊協議,說白了就是資料位傳輸的格式。
如果學習或者接觸過微控制器,那麼對於
rs232
一定不會陌生,它屬於非同步序列通訊介面(
uart
),通過
rxd、
txd進行資料的收發,
rs232
曾經是pc
機的標配,但是目前在多數
pc上基本不復存在了(當然還可以通過
usb-232
轉換器來擴充套件)。
接下來我們看看
7816-3
定義的通訊協議,其實基本上可以說是
rs232
的翻版並在此基礎上進行的改進,
7816
中只有乙個
io同時兼具資料收發的功能,這點和
rs232
用rxd
和txd
進行資料收發是不同的。在
rs232
中我們有
9600
波特率、起始位、奇偶校驗位、停止位這些概念,而在
7816-3
中都完整地保留了下來,只不過
7816-3
中引入了
etu,沒有使用
bps,但是基本原理是一致的。
etu的定義可以更加精確地描述每個資料位在傳輸過程中收發雙方的職責和角色轉換。
根據定義在智慧卡上電復位的時候
1 etu = 372 / f
,其中f =
讀寫裝置通過
clk管腳提供給智慧卡的時鐘頻率,通常在
1--5 mhz
之間。
etu的單位是時間單位秒(毫秒、微秒),等同於傳輸每個資料位所需的時間。對其取倒數得出來的就是每秒傳輸的資料位,也就是
bps。我們取
f = 3.579545 mhz
,用3579545
除以372
結果等於
9622.4
約為9600 bps。
通用的etu
計算公式:
1 etu = (f / d) * (1 / f),f
和d的值根據
7816-3
規範中的約定來進行設定。對於上電復位時的取值
f = 372
,d = 1
即作為預設值fd和
dd。如果智慧卡支援其他速率則需要在
atr中的
ta1來指出其他的f和
d的值,比如設定
f=372
,可以把
d分別設定為
2/4,那麼智慧卡能支援的通訊速率可以分別為
19200/38400。
那麼為什麼要選擇時鐘頻率為
3.579545 mhz
?為什麼預設的
f值選擇為
372呢?首先
3.579545 mhz
是常用石英晶振的標稱值,
9600 * 372 = 3.5712 mhz
,與之最為接近。再說為什麼是
372,
372 = 12 * 31
。標準的
8051
微控制器每個指令週期為
12個時鐘週期,而且定時
/計數器也按照
1/12
進行分頻後再計數的,這樣設定對於智慧卡晶元來說可以比較容易實現對
io資料通訊的控制,也可以更好地和pc機串列埠9600速率配合(當然這是指上個世紀
80年代的時候,對於現在的智慧卡晶元設計技術而言實現任意分頻的控制都不是問題了)。
由此可見,這些引數的選擇都是為了能夠更好地利用當時既有的標準和技術,要知道
7816-3
在1989
年的時候就已經制定了,按照當時的主流
pc機配置把串列埠速率設為
9600
,用乙個
232介面晶元(比如
max232
)再加上
3.579545mhz
的晶振,再配合幾片
74系列的閘電路外加
5伏的直流電源
和幾個阻容器件
,這就是最基本的
rs232
串列埠讀卡器了。
深入理解7816(1)
關於f d和etu rel noopener noreferrer 深入理解7816 1 關於f d和etu 智慧卡技術 深入理解7816 1 關於f d和etu 對於剛接觸智慧卡的工程師來說,在閱讀7816 3規範的時候,常常被其中的一些術語迷惑,讀起來會覺得有些彆扭。尤其是在看到復位應答中的f和...
關於fflush的深入理解
求fflush stdin 和fflush stdout 用法 include void main 這樣的乙個問題。假如輸入的不是3個而是大於3個時候,是不是要清空緩衝區呢?輸出的時候是不是也要清空一下呢?謝謝您幫我解答。3q gfxiang 一般不用。btw fflush 似乎只對輸出緩衝區清空,...
深入理解7816(2) 關於ATR
智慧卡 此處主要指接觸式 cpu卡 本身始終處於被動的狀態,所以終端裝置在和智慧卡進行資料互動的時候,需要首先給智慧卡發指令,智慧卡才會對應地給出應答。而智慧卡告訴終端的第一句話就是 atr,亦即 復位應答 想象一下,如果讓你為智慧卡設計乙個通訊協議,該怎麼設計?因為 atr是智慧卡上電後說的第一句...