1) t0 非同步半雙工字元傳輸協議 停止位是2, t1是1。
2) t1是非同步半雙工塊傳輸協議。 有起始域,資訊域, 中止域 組成乙個 塊。
3) t14叫做私有協議。t14沒有奇偶校驗, atr期間時鐘因子也不同。像irdeto是620。
4、通訊協議說明(字元傳輸)
smart card的字元傳輸採用的是非同步半雙工模式,這種非同步的模式很像個人電腦上的rs232通訊。傳輸乙個字元時,除了8bits的資料外,還加了以下幾個bits:
起始位 -- 用於字元幀的同步
校驗位 -- 用於校驗檢測
guard time -- 兩個字元間的間隔時間
guard time一般為兩個bit的時鐘週期,這一點很像pc上的uart的通訊,用兩個停止位來間隔相連的字元。
復位應答(atr):
當rst訊號被觸發,即將rst管腳被拉低400~4000個時鐘週期,smart card檢測到這個訊號後,將會回傳「復位應答」atr訊號出來,atr最多包含33個位元組,有以下幾個段:
l 初始化字元(ts)
l 格式化字元(to)
l 介面字元(tai, tbi, tci, tdi) (i=0/1)
l 歷史字元(t1, t2, t3 … tk)
l 校驗字元(tck)
它們包含哪些意思呢?請看下面的解析:
首先,ts初始化字元展示了電平的邏輯,反向約定(inverse convention即負邏輯)和正向約定(direct convention即正邏輯)。那麼一般來說,回傳ts有兩個可能的hex值0x3f和0x3b,0x3f代表反向約定,0x3b代表正向約定。
格式化字元to段分為兩個部分,bit map和no of history bytes,各佔4個bits。
介面字元的tai定義了串列埠傳輸中最基本的特性,其中包含兩個4-bits的di和fi,當中的fi時鐘頻率的轉換因子,di則是定義了位元率的調節因子。通過這兩個因子,我們可以通過以下的公式驗算出work etu的大小:
work etu = 1/d*f/f sec (f為工作的時鐘頻率)
正常來說,乙個etu(elementary time unit),乙個bit的時間週期。因此我們計算得出,傳輸乙個字元幀為12個etu=1 start + 8 data + 1 parity + 2 guardtime。
接下來,便會有個問題了,字元通訊是需要d和f這個兩個調節因子,保證其工作時序,而這兩個因子又是smart card復位後,由通過字元傳輸回傳的atr獲得的,那麼誰來保證atr傳輸的時序呢?原因是這樣的,card復位時,會有d和f的兩個初始值,分別 d=1,f=372。而且,復位時時鐘頻率f會在1~5mhz範圍之內,比較常見的是3.579545mhz。
我們可以計算得出default etu = 1/1*372/3579545 sec;
baud rate = 1/default etu = 9600s/s;
tc提供的guard time也是如此,default值為2個bit的時鐘週期。
td則是要說明的是傳輸協議的型別,標準裡羅列了16種,但是常用也就是兩種t0和t1,即非同步半雙工位元組傳輸和非同步半雙工塊傳輸。
因此,我們知道多數smart card復位時,是工作在3.579545mhz和9600s/s上的,一旦復位後,就根據atr的值重新進行配置工作時鐘頻率、波特率和guard time。使其能更高效的通訊。
t=0 傳輸協議:
ifd和smart card之間存在主從裝置關係。在通訊之前,我們知道atr中協議是多於乙個,因此介面裝置會發乙個pts訊號,以便確認通訊協議的型別。
cla - 指令集 (ff 是預留給 pts)
ins - 指令碼 (例如,讀記憶體)
p1 - 指令跟的引數1 (例如,記憶體位址)
p2 - 指令引數2
p3 - 資料長度
另外,再說說smart card的兩個狀態字sw1和sw2。它們是用來通知上位裝置目前smart card的工作狀態,如果工作正常,則返回值如下所示:
sw1,sw2 = 0x90, 0x00
如果工作異常了,也能通過這兩個狀態字獲得一些資訊,如:
sw1= 6e - card 不支援該款指令集
= 6d - 無效的指令碼
integrated circuit card 積體電路卡,也叫ca卡或智慧卡,將乙個微電子晶元嵌入符合iso 7816標準的卡基內,做成卡片形式,也是乙個嵌入式小系統。由cpu,rom,ram及e2prom及序列通行單元組成。
其作業系統稱為cos,一般帶有自已的安全體系,其安全性是衡量cos的重要指標。其功能包含有傳輸管理,檔案管理,安體體系及命令解釋。
一般stb機頂盒與智慧卡連線圖如下:
i/o 序列輸入輸出
clk 時鐘訊號
rst 復位訊號
vcc 供電電壓 一般5v
gnd 接地
智慧卡與cpu之間按照非同步方式傳送位元組,其具有統一的字元傳輸格式,乙個字由連續的10個etu完成傳送,期間傳送1個起始位,8個資料位和1個奇偶檢驗位。其資料幀傳輸格式:10bit
atr結構及內容:
ts初始位元組定義隨後字元的邏輯電平及位序
0x3b 表示高電平為邏輯'1', lsbf
0x3c 表示低電平為邏輯'1', msbf
t0格式字元,標記協議引數,協議型別
協議引數:
其基本的讀寫流程圖如下:
下面重點說一下smartcard驅動編寫主要邏輯:
1、設定卡工作頻率
開啟裝置的時候需要設定頻率引數,而晶元實際給sci 的時鐘是由外部傳入的
時鐘頻率引數計算的分頻因子分頻得來,因為計算公式會捨棄計算的分頻因子的小數部分,
所以通過系統時鐘分頻之後給卡的時鐘會存在增量誤差,實際配置考慮與需求最接近的值來
設定和權衡
具體演算法:
fsci_clk = frefclk/((clkicc+1)*2);
其中frefclk是系統96m時鐘?fsci_clk 是外部需要設定的sci時鐘,實際要配入暫存器分頻因子
clkicc = frefclk/(2*fsci_clk) -1;
clkicc 有時候計算出來是浮點數,但只取整,所以設定的頻率與實際頻率有偏差。
一般來說,其值設定:
對於t0,t1卡,支援頻率1mhz~5mhz;對於t14卡,只支援6mhz。單位為khz
2、etu 串列埠波特率 elementary time unit
etu = f / (clk * d) 其中 f 和 d 為調整因子,在ta1中,初值為372和1
則 etu = 372 / (clk * 1) 則波特率為9600則clk值為 3.57112mhz
對於暫存器設定如下:
etu = ((1 + baud) / f(refclk) ) * value etu範圍:5~255
f(refclk) 參考時鐘頻率,一般為 96000ul
band 為 sci_baud 配置的值 (波特率晚鐘分頻值暫存器)
value 為 sci_value配置的值 (etu內sci_baud 週期數暫存器)
以上的兩個引數可能會導致資料傳送成功但卻無法收到資料的情況!天柏ca就比較特別需要設為[372,2]
3、中斷接收資料
利用gpio作為irq中斷線用於資料處理
request_irq(irq_sci,smartcard_isr,irqf_disabled,null,null); 註冊中斷
利用中斷可檢測到 card in/out和 rx 接收資料
對於atr資料的接收與正常的機**訊資料同樣操作的,只不過card的狀態不同時的操作而已。
init->card in->wait atr->read atr->ready--> 後面就是rx/tx兩種資料狀態
STM32模擬ISO7816智慧卡協議筆記
本人在同stm32晶元模擬iso7816協議的時候,在釋放觸點的函式中發現其中乙個被配製成復用開漏的io管腳怎麼都無法拉低。其 如下 釋放智慧卡觸腳 void psam deinit 經過本人反覆實驗,發現將 釋放usart與gpio管腳 的兩行 與 失能gpio,usart和復用時鐘 的兩行 順序...
RFID與智慧卡
rfid與智慧卡 智慧卡 smartcard 區別於早期的磁卡,是一張上面封裝了整合電 路晶元的塑料卡片,用於儲存和處理資料。智慧卡可以分為一般儲存卡 加密儲存卡 cpu卡和整合了多種功能的超級智慧卡。智慧卡的分類和標 準很多,這裡只對和 rfid 物聯網相關的非接觸式 contactless 智慧...
智慧卡的電源電流
智慧卡的微控制器是通過它的觸點電極c1來獲得其電源電壓的。根據gsm 11.11規範,此電流不能超過10nuaoiso標準的現行版本規定值為200ma,從技術上來說這是過時的,將肯定要改變以反映目前的技術狀態。智慧卡的功率消耗是50mw,即5v的電源電壓和假定的10ma的電源消耗。即使這樣的功率損耗...