ISO7816是一套協議標準,這套協議不僅規定了智能IC卡的機械電氣特性,而且還規定了智能IC卡的應用方法。智能IC卡的主要用途可歸為身份識別、支付安全、加密/解密和信息存儲四個方面。智能IC卡已經廣泛應用到金融、電信、電子商務等領域,我們平常使用的IC電話卡,充值電卡、燃氣卡和手機中的SIM卡都屬于智能卡的范疇。
ISO7816協議標準中,將協議模型定義為4層:物理層、數據鏈路層、傳輸層、應用層。
? 物理層:定義了位交換,主要定義波特率和字符幀的傳輸方式
? 數據鏈路層:定義了字符交換,傳輸的檢錯與糾錯等
? 傳輸層:定義了針對協議的面向應用的提出報文傳輸
? 應用層:定義報文交換的內容
當ISO7816在基于英創的工控主板上應用時,可將ISO7816智能卡簡單的理解成一個串口設備。串口的物理連接和系統驅動程序實現了ISO7816協議標準中的物理層和數據鏈路層(如圖1中黃線以下部份)。應用程序負責數據的解析與應用,實現ISO7816協議標準的傳輸層與應用層(如圖1中黃線以上部份)。
圖1中黃線與紅線之間是英創的工控主板,提供了硬件接口、操作系統支持和串口驅動支持,既實現ISO7816協議的數據鏈路層和物理層。用戶將ISO7816智能卡正確的連接到工控主板的串口上,編寫應用程序,通過調用系統API函數就能實現對ISO7816智能卡的訪問。
圖 1:英創工控主板連接ISO7816智能卡
本文將以英創工控主板EM9280連接基于ISO7816協議的ESAM模塊為例,討論用戶需要做的兩項工作:
1、將智能卡連接到工控主板的串口
2、應用程序如何訪問已連接到系統中的智能卡
1、智能卡(ESAM)的硬件連接
如圖2中的U2所示,ESAM模塊需要一個工作時鐘和一個復位信號,通過一位IO與主機連接實現數據通訊。ESAM的復位信號使用EM9280的一位GPIO控制,工作時鐘使用EM9280的一路PWM。ESAM模塊使用單個I/O與主機通訊,自動切換收發方向,EM9280提供的是標準3線串口,所以沒有辦法與ESAM直接連接。圖2中利用74HCT157,將串口的RXD,TXD模擬成ISO7816單IO通訊模式,利用串口的RTS#信號實現數據收發方向的自動切換。當EM9280發送數據時,RTS#輸出低電平,選通74HCT157的A組,數據通過TXD6→2A→2Y輸出到I/O腳。而1A通過R2上拉到高電平,所以1Y也是高電平,RXD6不會收到任何數據。數據發送完成后,RTS#被串口驅動程序自動將置為高電平,74HCT157的B組選通,ESAM模塊發送的數據由I/O→1B→1Y到達RXD6,串口接收由ESAM模塊發來的數據。此時2B由R2上拉到高電平,所以2Y亦是高電平,不會影響I/O上的數據傳輸。
圖 2:EM9280連接ESAM模塊
2、應用程序設置方法
對應用程序來講,與ESAM通訊類似于RS485的半雙工通訊,只是在開始串口通訊之前,針對ESAM模塊,還需要一些額外的設置。
2.1 產生ESAM工作時鐘
ESAM模塊缺省工作時鐘是其通訊波特率的372倍,我們使用EM9280的PWM1來產生ESAM的工作時鐘。
// Generate clock for ISO7816.
m_hPWM = CreateFile(_T('PWM1:'), // name of device
GENERIC_READ|GENERIC_WRITE, // desired access
FILE_SHARE_READ|FILE_SHARE_WRITE, // sharing mode
NULL, // security attributes (ignored)
OPEN_EXISTING, // creation disposition
FILE_FLAG_RANDOM_ACCESS, // flags/attributes
NULL); // template file (ignored)
if( m_hPWM == INVALID_HANDLE_VALUE )
{
goto InitClearUp;
}
PWM_INFO PwmInfo;
PwmInfo.dwFreq = dwFI_DI_Ratio * dwBaud; // = 372 * 9600 = 3.5712MHz
PwmInfo.dwDuty = 50; // 50%
PwmInfo.dwResolution = 1;
dwNumberOfBytesWritten = 0;
WriteFile( m_hPWM, &PwmInfo, sizeof(PWM_INFO), &dwNumberOfBytesWritten, NULL);
2.2 打開串口并使能RTS_TOGGLE功能
使用標準的文件操作函數CreateFile打開串口設備,同時通過SetCommState函數設置串口通訊相關參數。此時ESAM模塊的通訊波特率設置為9600bps,8位數據位,1位停止位,偶校驗。
DCB dcb;
GetCommState( m_hSer, &dcb );
dcb.BaudRate = Baud; // 波特率 = 9600
dcb.ByteSize = Databits; // 數據位 = 8
dcb.Parity = EVENPARITY; // 偶校驗
dcb.StopBits = ONESTOPBIT; // 停止位 = 1
SetCommState(m_hSer, &dcb);
在圖2中,將3線串口模擬成單線的ISO7816模式,使用串口的RTS作為數據傳輸方向控制信號。EM9280可以為打開的串口任意指定一位GPIO作為其RTS信號線,實現方法如下:
DCB dcb;
BOOL bRet;
bRet = DeviceIoControl(m_hSer, // 已經打開的串口設置句柄
IOCTL_SET_UART_RTS_PIN, // I/O control code
&dwRTSPin, // 選擇作為RTS的GPIO,如圖2中選擇GPIO7
sizeof(DWORD),
NULL,
0,
NULL,
NULL);
if( bRet )
{
GetCommState( m_hSer, &dcb ); // Get dcb
dcb.fRtsControl = RTS_CONTROL_TOGGLE; // Enable RTS Toggle
SetCommState(m_hSer, &dcb); // update dcb
}
2.3 數據收發
應用程序可以創建一個線程,然后等待串口事件接收串口數據。
應用程序調用WriteFile函數發送數據,但需要特別注意ISO7816傳輸協議中關于“保護時間”要求,協議中規定兩個連續的字符幀之間必需要有一個最小時間間隔,即保護時間,當波特率為9600bps時,保護時間最小大約為200uS。
如果直接調用WriteFile將要發送的數據一次性發送
WriteFile( m_hSer, Buf, len, &dwLen, NULL);
在EM9280上測得的字符間時間間隔大約為30uS,顯示不能滿足協議保護時間的要求。為了達到保護時間的要求,可以采用下面的方式,將需要發送的數據一個字節一個字節的發送。
for( int i; i
WriteFile( m_hSer, Buf+i, 1, &dwLen, NULL);
上面的for循環每調用一次WriteFile函數,只發送1個字節,在EM9280上測得的字符間時間間隔最小大約為500uS,滿足協議保護時間的要求,實際測試也能正常與ESAM模塊通訊。
如果主機串口硬件沒有支持ISO7816模式,如英創公司工控主板EM9170、EM9283等,就可以按本文的方法,增加很少的幾個器件就能連接ISO7816設備。
英創公司Atmel系列工控主板,CPU的串口本身就支持ISO7816模式,可直接連接IS07816智能卡。我們實現了相應的驅動程序,相關的使用方法可參考下面的文章:
ISO7816通訊協議在工控主板EM9160中的實現方案
工控主板EM9161對ISO7816協議的支持
英創嵌入式Linux工控主板如何實現ISO7816協議
我們還提供了ESAM模塊完整的測試程序,需要的用戶可與我們聯系獲取相關代碼。
-
Linux
+關注
關注
87文章
11296瀏覽量
209358 -
嵌入式主板
+關注
關注
7文章
6085瀏覽量
35303
發布評論請先 登錄
相關推薦
評論