工控網(wǎng)首頁
>

應(yīng)用設(shè)計

>

DS5250與磁卡讀卡器的連接

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微控制器中。 .
投訴建議

提交

查看更多評論
其他資訊

查看更多

工業(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ò)控制與編程