DS5250與磁卡讀卡器的連接
2013/11/26 14:40:21
簡介
背面帶有編碼磁條的卡通常稱為磁卡,廣泛用于銀行、儲值等金融領(lǐng)域。信用卡、ATM和借記卡都是典型的磁卡,有的卡片還嵌入了智能卡芯片。其它應(yīng)用包括:游戲、影印和公交等領(lǐng)域的禮品卡、安全卡以及房間鑰匙卡等。采用標(biāo)準(zhǔn)ISO格式時,這些磁卡的最大容量只有160字節(jié),一般不能存儲大量數(shù)據(jù)。與智能卡或便攜式閃存相比,磁卡的存儲容量足以支持金融和銀行應(yīng)用,被廣泛應(yīng)用于該領(lǐng)域。而且,磁卡價格低,比較可靠,不需要內(nèi)部供電,讀取相對方便。
本應(yīng)用筆記介紹怎樣使用DS5250安全微控制器實現(xiàn)和磁卡讀卡器的接口。之所以選擇DS5250,是因為它具有開發(fā)常用讀卡設(shè)備(例如銷售終端POS等設(shè)備)所需要的安全和加密功能。
磁卡讀卡器電路可以執(zhí)行底層任務(wù):把磁條磁通量解碼成比特流。DS5250管理頂層任務(wù):將這些比特轉(zhuǎn)換成字符,讀取并驗證數(shù)據(jù)。
硬件和軟件要求
硬件
本實例采用了DS5250評估(EV)板(B版),進(jìn)行了以下改動:
去掉了端口0的上拉電阻(RN2)
實際應(yīng)用還需要以下硬件:
讀卡器—MagTek?三磁道讀卡器,含有3V解碼器ASIC;序列號為21030001,G版或更新版本 (www.magtek.com/)
兩個上拉電阻(大約10kΩ)
線性穩(wěn)壓器(能夠從5V電源產(chǎn)生3V至3.6V供電)
用于測試的磁卡(ATM卡、信用卡等)
軟件
本實例應(yīng)用程序以C語言編寫,采用了Keil的μVision? IDE 2.40a版進(jìn)行編譯(www.keil.com/)。利用Maxim的微控制器工具包(MTK)將編譯后的應(yīng)用程序裝載到DS5250中。
應(yīng)用程序的詳細(xì)信息
下面幾節(jié)介紹實例應(yīng)用程序的實現(xiàn)??梢詮腗axim的FTP網(wǎng)站下載完整的C語言代碼。
連接讀卡器
MagTek讀卡器有5個接口引腳(包括電源和地):
引腳1—STROBE
該信號僅用于讀卡器輸入。由主機(jī)微控制器驅(qū)動,逐位輸出卡的數(shù)據(jù)位,觸發(fā)復(fù)位過程。
引腳2—DATA
該信號通常是讀卡器的輸出,包含磁道A/B/C的卡數(shù)據(jù)位,由STROBE信號同步輸出。在某些情況下(例如,觸發(fā)復(fù)位時),可以由主機(jī)微控制器驅(qū)動該信號。
引腳3—VDD
讀卡器的電源(2.7V至3.6V)。
引腳4—GND
引腳5—GND
由于STROBE和DATA引腳的工作電平為3V,DS5250無法直接通過標(biāo)準(zhǔn)端口引腳驅(qū)動。因此,以端口0 (該端口工作在開漏模式)替代,當(dāng)DS5250將引腳置為三態(tài)時,通過電阻將信號電平上拉至3.6V。由于DS5250端口的VIH電平能夠兼容3V I/O電平,因此,DS5250可以直接從DATA線讀取DATA信號(請參考DS5250數(shù)據(jù)資料,了解詳細(xì)信息)。
讀卡器工作電平為3V;它不能直接采用DS5250的5V電源供電。由于DS5250評估板不提供3V供電,因此,采用了單獨的線性穩(wěn)壓器(例如, MAX1658)對讀卡器供電。
復(fù)位
首次上電后,主機(jī)微控制器在進(jìn)行讀卡之前必須復(fù)位讀卡器。每次進(jìn)行卡掃描之后,也必須按順序進(jìn)行復(fù)位,以清除內(nèi)部讀卡器ASIC的內(nèi)存,使讀卡器能夠準(zhǔn)備就緒。接收新的讀卡操作。
復(fù)位讀卡器時,主機(jī)微控制器(例如,本應(yīng)用筆記的DS5250)必須按照以下順序驅(qū)動STROBE和DATA (請參考MagTek文檔,了解確切的電壓電平和時序參數(shù))。
DATA和STROBE都以高電平(空閑)狀態(tài)開始。
將DATA置為低電平。
保持DATA為低電平,將STROBE驅(qū)動為低電平,然后再次驅(qū)動為高電平。
再次驅(qū)動STROBE為低電平,隨后釋放DATA,使其能夠浮空至高電平。
當(dāng)DATA浮空為高電平時,將STROBE驅(qū)動為低電平,然后再次驅(qū)動為高電平。在這一點,復(fù)位讀卡器,處于低功耗等待狀態(tài)。
將STROBE驅(qū)動為低電平,然后再次驅(qū)動為高電平。對讀卡器進(jìn)行“配置”,使其能夠進(jìn)行讀卡操作。
// Generate a long delay for card reset and read intervals.
void longDelay()
{
int i, j;
for (i = 1; i < 5; i++) {
for (j = 1; j < 5000; j++) {
;
}
}
}
// Generate a shorter delay (used between STROBE/DATA transitions).
void delay()
{
int i;
for (i = 1; i < 1000; i++) {
;
}
}
// Release the DATA line (P0.0) and allow it to float high.
void dataHigh()
{
P0 |= 0x01;
delay();
}
// Drive the DATA line (P0.0) low.
void dataLow()
{
P0 &= 0xFE;
delay();
}
// Release the STROBE line (P0.1) and allow it to float high.
void strobeHigh()
{
P0 |= 0x02;
delay();
}
// Drive the STROBE line (P0.1) low.
void strobeLow()
{
P0 &= 0xFD;
delay();
}
void resetCardReader()
{
dataHigh();
strobeHigh();
longDelay();
dataLow(); // Force DATA low.
longDelay();
strobeLow(); // Drive STROBE low, then high again.
strobeHigh();
strobeLow(); // Drive STROBE low, then release DATA.
dataHigh();
longDelay();
strobeHigh(); // Drive STROBE low and high again two more times
strobeLow(); // to complete the reset and leave the card reader
strobeHigh(); // in the ready state, prepared to scan a card.
strobeLow();
}
檢測讀卡操作
讀卡器一旦復(fù)位并進(jìn)行配置后,就可以進(jìn)行讀卡操作。讀卡時,MagTek讀卡器執(zhí)行一次完整的讀周期;不需要主控制器干預(yù)??ǖ拇艞l中所有三個磁道A、B、C的全部內(nèi)容都被存儲到讀卡器IC中。讀卡周期完成后,可以由主控制器將數(shù)據(jù)逐位同步輸出。
讀卡器通過握手周期告訴主機(jī)什么時候開始讀卡,什么時候完成讀卡。
該周期以STROBE低電平和DATA浮空高電平(空閑狀態(tài))開始。
當(dāng)讀卡器探測到磁條移過讀卡器探頭時,開始對卡進(jìn)行掃描。它將DATA線驅(qū)動為低電平,告訴主機(jī)開始讀卡操作。
主機(jī)驅(qū)動STROBE為高電平,然后再變?yōu)榈碗娖?,做出響?yīng)。
讀卡器將DATA再次驅(qū)動為高電平。
一旦讀卡周期完成后,讀卡器再次將DATA驅(qū)動為低電平。這一操作告訴主機(jī)已經(jīng)完成了讀卡過程,可以同步輸出卡數(shù)據(jù)。
// Wait for the DATA line to be driven low by the card reader.
void waitForDataLow()
{
int i = 0xFF;
dataHigh(); // Make sure that DATA is floating high.
while ((i & 1) == 1) {
i = P0;
}
}
....
resetCardReader();
printf("\r\n");
printf("Waiting for card swipe...\r\n");
printf("\r\n");
waitForDataLow(); // DATA low indicates that card swipe has begun.
strobeHigh();
longDelay();
strobeLow();
longDelay();
waitForDataLow(); // DATA low indicates that card swipe is complete.
{$Page$}
讀取并解碼卡數(shù)據(jù)
完成讀卡,并且所有卡數(shù)據(jù)經(jīng)過解碼并存儲在讀卡器ASIC后,讀卡器將DATA線驅(qū)動為低電平。如上所述,這一操作提示DS5250可以同步輸出卡數(shù)據(jù)。在這一點,DS5250在同步輸出每一位數(shù)據(jù)時,將STROBE驅(qū)動為高電平,然后再驅(qū)動低電平,以順序讀出每一位卡數(shù)據(jù)。在STROBE驅(qū)動為高電平,然后再驅(qū)動為低電平后,讀卡器ASIC將下一位數(shù)據(jù)在DATA線上同步輸出。ASIC在第0位將DATA驅(qū)動為高電平,第1位時將DATA驅(qū)動為低電平。
// Clock a single bit value out of the card reader by driving STROBE high,
// then low, and reading the DATA line.
int readBit()
{
int i;
strobeHigh(); // Drive STROBE high.
strobeLow(); // Drive STROBE low (DATA line now contains bit).
i = P0;
if ((i & 1) == 0) {
return 1; // Low on DATA line indicates a 1 bit.
} else {
return 0; // High on DATA line indicates a 0 bit.
}
}
讀卡器同步輸出的前16位是“前導(dǎo)”位,指出讀卡器ASIC的版本。這些為并非卡的數(shù)據(jù),應(yīng)用程序可以忽略它們。
磁道A譯碼
16位前導(dǎo)碼之后,DATA線上同步輸出704位數(shù)據(jù),其中包括從磁卡磁道A讀取的數(shù)據(jù)。當(dāng)采用標(biāo)準(zhǔn)ISO格式進(jìn)行編碼時,磁道A含有76個字符,使用的7位字符集含有字母、數(shù)字等符號。
每7位字符在同步輸出時最低有效位(LSB)在前,最高位(即,第7位)是奇偶校驗位,可用于驗證卡數(shù)據(jù)的完整性。除去奇偶校驗位,其余6位定義了64個字符中的某一個,可以編碼到磁道A上。例如,000000b代表空格符,000001b代表感嘆號。以下代碼為char7bit[64]字符陣列。
// 0123456789012345678901234567890123456789012345678901234567890 123
char char7bit[64] =
" !'#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_";
// Clock out and decode a 7-bit character from the track memory, returning the
// character value. 7-bit (alphanumeric) characters are found on Track A only.
char read7BitChar()
{
int i, c;
// Each character is composed of 7 bits, which we clock out of the track memory
// beginning with the least significant bit. Bit 7 is parity, which is ignored.
c = 0;
for (i = 1; i < 128; i *= 2) {
c |= (readBit() * i);
}
c &= 0x3F;
return char7bit[c]; // Decode/return the character using the 7-bit table.
}
....
// Track A - 76 characters, 7 bits per alphanumberic character including parity.
printf("Track A > ");
for (i = 0; i < 76; i++) {
putchar(read7BitChar());
}
printf("\r\n\r\n");
// At this point, we have read 532 bits of the 704-bit Track A memory on the
// card reader IC. Flush the remaining 172 bits.
for (i = 0; i < 172; i++) {
readBit();
}
不同類型的卡在磁道A上有不同的數(shù)據(jù)。磁道A還可以含有字母字符。因此,磁道A常用于存儲持卡人的姓名、地址和賬號等數(shù)字信息。正如上面代碼所示,在同步輸出磁道B的數(shù)據(jù)之前,必須讀出磁道A的所有704位數(shù)據(jù)(即使并非所有位都含有編碼數(shù)據(jù))。
磁道B譯碼
磁道B的編碼和磁道A相似,只是采用了5位(4位數(shù)據(jù)和1位奇偶校驗位)編碼,而不是7位編碼。磁道B的字符集只含有數(shù)字字符和符號,如下面的char5bit[16]字符陣列所示。
// 0123456789012345
char char5bit[16] = "0123456789:;<=>?";
// Clock out and decode a 5-bit character from the track memory, returning the
// character value. 5-bit (numeric+symbol) characters are found on Tracks B and C.
char read5BitChar()
{
int i, c;
// Each character is composed of 5 bits, which we clock out of the track memory
// beginning with the least significant bit. Bit 5 is parity, which is ignored.
c = 0;
for (i = 1; i < 32; i *= 2) {
c |= (readBit() * i);
}
c &= 0x0F;
return char5bit[c]; // Decode/return the character using the 5-bit table.
}
....
// Track B - 40 characters, 5 bits per numeric/symbol character including parity.
printf("Track B > ");
for (i = 0; i < 40; i++) {
putchar(read5BitChar());
}
printf("\r\n\r\n");
在磁道A的最后,讀取磁道C之前,必須讀取磁道B的所有剩余位(如果需要用到磁道C)。由于已經(jīng)從磁道B (40個字符 x 5位)讀取了200位,在訪問磁道C之前,必須同步輸出其余504位。
磁道C譯碼
磁道C的編碼方式和磁道B一樣,并采用了同一字符集,最多可編碼107個7位字符。磁道C最初的目的是作為可寫數(shù)據(jù)區(qū),以支持離線金融交易,但不常用。大部分磁卡在磁道C上不帶有編碼數(shù)據(jù)。
結(jié)論
磁卡廣泛應(yīng)用于金融、接入控制、政府以及儲值等領(lǐng)域。通過加入一個簡單的MagTek卡掃描讀卡器,為DS5250評估板提供少量的支持硬件,開發(fā)系統(tǒng)即可支持磁卡讀取功能以及安全微控制器的高級安全加密功能。利用Keil的μVision C編譯器,很容易在DS5250安全微控制器上演示磁卡讀取和解碼功能。
注意:由于其內(nèi)在的安全特性,DS5250安全微控制器受美國出口法的控制。如需獲得包括數(shù)據(jù)資料、用戶指南在內(nèi)的所有DS5250文檔,需要簽署保密協(xié)議(NDA)。而本應(yīng)用筆記及其源代碼都可以免費提供,直接裝載到Maxim的任一8051微控制器中。 .
背面帶有編碼磁條的卡通常稱為磁卡,廣泛用于銀行、儲值等金融領(lǐng)域。信用卡、ATM和借記卡都是典型的磁卡,有的卡片還嵌入了智能卡芯片。其它應(yīng)用包括:游戲、影印和公交等領(lǐng)域的禮品卡、安全卡以及房間鑰匙卡等。采用標(biāo)準(zhǔn)ISO格式時,這些磁卡的最大容量只有160字節(jié),一般不能存儲大量數(shù)據(jù)。與智能卡或便攜式閃存相比,磁卡的存儲容量足以支持金融和銀行應(yīng)用,被廣泛應(yīng)用于該領(lǐng)域。而且,磁卡價格低,比較可靠,不需要內(nèi)部供電,讀取相對方便。
本應(yīng)用筆記介紹怎樣使用DS5250安全微控制器實現(xiàn)和磁卡讀卡器的接口。之所以選擇DS5250,是因為它具有開發(fā)常用讀卡設(shè)備(例如銷售終端POS等設(shè)備)所需要的安全和加密功能。
磁卡讀卡器電路可以執(zhí)行底層任務(wù):把磁條磁通量解碼成比特流。DS5250管理頂層任務(wù):將這些比特轉(zhuǎn)換成字符,讀取并驗證數(shù)據(jù)。
硬件和軟件要求
硬件
本實例采用了DS5250評估(EV)板(B版),進(jìn)行了以下改動:
去掉了端口0的上拉電阻(RN2)
實際應(yīng)用還需要以下硬件:
讀卡器—MagTek?三磁道讀卡器,含有3V解碼器ASIC;序列號為21030001,G版或更新版本 (www.magtek.com/)
兩個上拉電阻(大約10kΩ)
線性穩(wěn)壓器(能夠從5V電源產(chǎn)生3V至3.6V供電)
用于測試的磁卡(ATM卡、信用卡等)
軟件
本實例應(yīng)用程序以C語言編寫,采用了Keil的μVision? IDE 2.40a版進(jìn)行編譯(www.keil.com/)。利用Maxim的微控制器工具包(MTK)將編譯后的應(yīng)用程序裝載到DS5250中。
應(yīng)用程序的詳細(xì)信息
下面幾節(jié)介紹實例應(yīng)用程序的實現(xiàn)??梢詮腗axim的FTP網(wǎng)站下載完整的C語言代碼。
連接讀卡器
MagTek讀卡器有5個接口引腳(包括電源和地):
引腳1—STROBE
該信號僅用于讀卡器輸入。由主機(jī)微控制器驅(qū)動,逐位輸出卡的數(shù)據(jù)位,觸發(fā)復(fù)位過程。
引腳2—DATA
該信號通常是讀卡器的輸出,包含磁道A/B/C的卡數(shù)據(jù)位,由STROBE信號同步輸出。在某些情況下(例如,觸發(fā)復(fù)位時),可以由主機(jī)微控制器驅(qū)動該信號。
引腳3—VDD
讀卡器的電源(2.7V至3.6V)。
引腳4—GND
引腳5—GND
由于STROBE和DATA引腳的工作電平為3V,DS5250無法直接通過標(biāo)準(zhǔn)端口引腳驅(qū)動。因此,以端口0 (該端口工作在開漏模式)替代,當(dāng)DS5250將引腳置為三態(tài)時,通過電阻將信號電平上拉至3.6V。由于DS5250端口的VIH電平能夠兼容3V I/O電平,因此,DS5250可以直接從DATA線讀取DATA信號(請參考DS5250數(shù)據(jù)資料,了解詳細(xì)信息)。
讀卡器工作電平為3V;它不能直接采用DS5250的5V電源供電。由于DS5250評估板不提供3V供電,因此,采用了單獨的線性穩(wěn)壓器(例如, MAX1658)對讀卡器供電。
復(fù)位
首次上電后,主機(jī)微控制器在進(jìn)行讀卡之前必須復(fù)位讀卡器。每次進(jìn)行卡掃描之后,也必須按順序進(jìn)行復(fù)位,以清除內(nèi)部讀卡器ASIC的內(nèi)存,使讀卡器能夠準(zhǔn)備就緒。接收新的讀卡操作。
復(fù)位讀卡器時,主機(jī)微控制器(例如,本應(yīng)用筆記的DS5250)必須按照以下順序驅(qū)動STROBE和DATA (請參考MagTek文檔,了解確切的電壓電平和時序參數(shù))。
DATA和STROBE都以高電平(空閑)狀態(tài)開始。
將DATA置為低電平。
保持DATA為低電平,將STROBE驅(qū)動為低電平,然后再次驅(qū)動為高電平。
再次驅(qū)動STROBE為低電平,隨后釋放DATA,使其能夠浮空至高電平。
當(dāng)DATA浮空為高電平時,將STROBE驅(qū)動為低電平,然后再次驅(qū)動為高電平。在這一點,復(fù)位讀卡器,處于低功耗等待狀態(tài)。
將STROBE驅(qū)動為低電平,然后再次驅(qū)動為高電平。對讀卡器進(jìn)行“配置”,使其能夠進(jìn)行讀卡操作。
// Generate a long delay for card reset and read intervals.
void longDelay()
{
int i, j;
for (i = 1; i < 5; i++) {
for (j = 1; j < 5000; j++) {
;
}
}
}
// Generate a shorter delay (used between STROBE/DATA transitions).
void delay()
{
int i;
for (i = 1; i < 1000; i++) {
;
}
}
// Release the DATA line (P0.0) and allow it to float high.
void dataHigh()
{
P0 |= 0x01;
delay();
}
// Drive the DATA line (P0.0) low.
void dataLow()
{
P0 &= 0xFE;
delay();
}
// Release the STROBE line (P0.1) and allow it to float high.
void strobeHigh()
{
P0 |= 0x02;
delay();
}
// Drive the STROBE line (P0.1) low.
void strobeLow()
{
P0 &= 0xFD;
delay();
}
void resetCardReader()
{
dataHigh();
strobeHigh();
longDelay();
dataLow(); // Force DATA low.
longDelay();
strobeLow(); // Drive STROBE low, then high again.
strobeHigh();
strobeLow(); // Drive STROBE low, then release DATA.
dataHigh();
longDelay();
strobeHigh(); // Drive STROBE low and high again two more times
strobeLow(); // to complete the reset and leave the card reader
strobeHigh(); // in the ready state, prepared to scan a card.
strobeLow();
}
檢測讀卡操作
讀卡器一旦復(fù)位并進(jìn)行配置后,就可以進(jìn)行讀卡操作。讀卡時,MagTek讀卡器執(zhí)行一次完整的讀周期;不需要主控制器干預(yù)??ǖ拇艞l中所有三個磁道A、B、C的全部內(nèi)容都被存儲到讀卡器IC中。讀卡周期完成后,可以由主控制器將數(shù)據(jù)逐位同步輸出。
讀卡器通過握手周期告訴主機(jī)什么時候開始讀卡,什么時候完成讀卡。
該周期以STROBE低電平和DATA浮空高電平(空閑狀態(tài))開始。
當(dāng)讀卡器探測到磁條移過讀卡器探頭時,開始對卡進(jìn)行掃描。它將DATA線驅(qū)動為低電平,告訴主機(jī)開始讀卡操作。
主機(jī)驅(qū)動STROBE為高電平,然后再變?yōu)榈碗娖?,做出響?yīng)。
讀卡器將DATA再次驅(qū)動為高電平。
一旦讀卡周期完成后,讀卡器再次將DATA驅(qū)動為低電平。這一操作告訴主機(jī)已經(jīng)完成了讀卡過程,可以同步輸出卡數(shù)據(jù)。
// Wait for the DATA line to be driven low by the card reader.
void waitForDataLow()
{
int i = 0xFF;
dataHigh(); // Make sure that DATA is floating high.
while ((i & 1) == 1) {
i = P0;
}
}
....
resetCardReader();
printf("\r\n");
printf("Waiting for card swipe...\r\n");
printf("\r\n");
waitForDataLow(); // DATA low indicates that card swipe has begun.
strobeHigh();
longDelay();
strobeLow();
longDelay();
waitForDataLow(); // DATA low indicates that card swipe is complete.
{$Page$}
讀取并解碼卡數(shù)據(jù)
完成讀卡,并且所有卡數(shù)據(jù)經(jīng)過解碼并存儲在讀卡器ASIC后,讀卡器將DATA線驅(qū)動為低電平。如上所述,這一操作提示DS5250可以同步輸出卡數(shù)據(jù)。在這一點,DS5250在同步輸出每一位數(shù)據(jù)時,將STROBE驅(qū)動為高電平,然后再驅(qū)動低電平,以順序讀出每一位卡數(shù)據(jù)。在STROBE驅(qū)動為高電平,然后再驅(qū)動為低電平后,讀卡器ASIC將下一位數(shù)據(jù)在DATA線上同步輸出。ASIC在第0位將DATA驅(qū)動為高電平,第1位時將DATA驅(qū)動為低電平。
// Clock a single bit value out of the card reader by driving STROBE high,
// then low, and reading the DATA line.
int readBit()
{
int i;
strobeHigh(); // Drive STROBE high.
strobeLow(); // Drive STROBE low (DATA line now contains bit).
i = P0;
if ((i & 1) == 0) {
return 1; // Low on DATA line indicates a 1 bit.
} else {
return 0; // High on DATA line indicates a 0 bit.
}
}
讀卡器同步輸出的前16位是“前導(dǎo)”位,指出讀卡器ASIC的版本。這些為并非卡的數(shù)據(jù),應(yīng)用程序可以忽略它們。
磁道A譯碼
16位前導(dǎo)碼之后,DATA線上同步輸出704位數(shù)據(jù),其中包括從磁卡磁道A讀取的數(shù)據(jù)。當(dāng)采用標(biāo)準(zhǔn)ISO格式進(jìn)行編碼時,磁道A含有76個字符,使用的7位字符集含有字母、數(shù)字等符號。
每7位字符在同步輸出時最低有效位(LSB)在前,最高位(即,第7位)是奇偶校驗位,可用于驗證卡數(shù)據(jù)的完整性。除去奇偶校驗位,其余6位定義了64個字符中的某一個,可以編碼到磁道A上。例如,000000b代表空格符,000001b代表感嘆號。以下代碼為char7bit[64]字符陣列。
// 0123456789012345678901234567890123456789012345678901234567890 123
char char7bit[64] =
" !'#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_";
// Clock out and decode a 7-bit character from the track memory, returning the
// character value. 7-bit (alphanumeric) characters are found on Track A only.
char read7BitChar()
{
int i, c;
// Each character is composed of 7 bits, which we clock out of the track memory
// beginning with the least significant bit. Bit 7 is parity, which is ignored.
c = 0;
for (i = 1; i < 128; i *= 2) {
c |= (readBit() * i);
}
c &= 0x3F;
return char7bit[c]; // Decode/return the character using the 7-bit table.
}
....
// Track A - 76 characters, 7 bits per alphanumberic character including parity.
printf("Track A > ");
for (i = 0; i < 76; i++) {
putchar(read7BitChar());
}
printf("\r\n\r\n");
// At this point, we have read 532 bits of the 704-bit Track A memory on the
// card reader IC. Flush the remaining 172 bits.
for (i = 0; i < 172; i++) {
readBit();
}
不同類型的卡在磁道A上有不同的數(shù)據(jù)。磁道A還可以含有字母字符。因此,磁道A常用于存儲持卡人的姓名、地址和賬號等數(shù)字信息。正如上面代碼所示,在同步輸出磁道B的數(shù)據(jù)之前,必須讀出磁道A的所有704位數(shù)據(jù)(即使并非所有位都含有編碼數(shù)據(jù))。
磁道B譯碼
磁道B的編碼和磁道A相似,只是采用了5位(4位數(shù)據(jù)和1位奇偶校驗位)編碼,而不是7位編碼。磁道B的字符集只含有數(shù)字字符和符號,如下面的char5bit[16]字符陣列所示。
// 0123456789012345
char char5bit[16] = "0123456789:;<=>?";
// Clock out and decode a 5-bit character from the track memory, returning the
// character value. 5-bit (numeric+symbol) characters are found on Tracks B and C.
char read5BitChar()
{
int i, c;
// Each character is composed of 5 bits, which we clock out of the track memory
// beginning with the least significant bit. Bit 5 is parity, which is ignored.
c = 0;
for (i = 1; i < 32; i *= 2) {
c |= (readBit() * i);
}
c &= 0x0F;
return char5bit[c]; // Decode/return the character using the 5-bit table.
}
....
// Track B - 40 characters, 5 bits per numeric/symbol character including parity.
printf("Track B > ");
for (i = 0; i < 40; i++) {
putchar(read5BitChar());
}
printf("\r\n\r\n");
在磁道A的最后,讀取磁道C之前,必須讀取磁道B的所有剩余位(如果需要用到磁道C)。由于已經(jīng)從磁道B (40個字符 x 5位)讀取了200位,在訪問磁道C之前,必須同步輸出其余504位。
磁道C譯碼
磁道C的編碼方式和磁道B一樣,并采用了同一字符集,最多可編碼107個7位字符。磁道C最初的目的是作為可寫數(shù)據(jù)區(qū),以支持離線金融交易,但不常用。大部分磁卡在磁道C上不帶有編碼數(shù)據(jù)。
結(jié)論
磁卡廣泛應(yīng)用于金融、接入控制、政府以及儲值等領(lǐng)域。通過加入一個簡單的MagTek卡掃描讀卡器,為DS5250評估板提供少量的支持硬件,開發(fā)系統(tǒng)即可支持磁卡讀取功能以及安全微控制器的高級安全加密功能。利用Keil的μVision C編譯器,很容易在DS5250安全微控制器上演示磁卡讀取和解碼功能。
注意:由于其內(nèi)在的安全特性,DS5250安全微控制器受美國出口法的控制。如需獲得包括數(shù)據(jù)資料、用戶指南在內(nèi)的所有DS5250文檔,需要簽署保密協(xié)議(NDA)。而本應(yīng)用筆記及其源代碼都可以免費提供,直接裝載到Maxim的任一8051微控制器中。 .
提交
查看更多評論
其他資訊
工業(yè)機(jī)器人控制系統(tǒng)的開放體系結(jié)構(gòu)
工業(yè)機(jī)器人離線編程及無碰撞路徑規(guī)劃系統(tǒng)的開發(fā)研究
工業(yè)機(jī)器人手臂結(jié)構(gòu)的有限元分析與研究
工業(yè)機(jī)器人通用控制器研究開發(fā)
工業(yè)機(jī)器人網(wǎng)絡(luò)控制與編程