[第九課] NFC感應魔法-2 (Tag Memory Read/Write)

每次挫折都孕育著成功的種子。“Every failure carries with it the seed of an equivalent or greater reward’.” ~ Napoleon Hill, Think and Grow Rich

最後,嵌入式系統的設計,要避免『鎖死』“DEADLOCK” 的狀況發生,特別是在條件式的迴圈設計時,是否有考慮到所有的情況;或是與連接模組通訊時,當遲遲沒有回應時,是否有逾時 (timeout) 的防範設計。

在 [第二課] ,已經介紹了X-DISC所用的第二型標籤晶片的記憶體架構。

ACCP的主程序,會定期在進入  SCAN  狀態時,開啟NFC天線 rfOn() 去掃瞄,是否有X-DISC出現在感應區;而為了節電的考量,當進入  NOP  狀態時,會將天線關閉 rfOff();也就是說當要對NFC標籤存取其記憶體時,必須先使用 isTagPresent() ,先感應並選取了該標籤,才能進行讀寫的程序。

為了方便ACCP的小量生產,特別製作了一個 <TagPgmer.ino> 複製X-DISC的小工具。用 Tag Programmer 的 CONFIG標籤,就可以啟動這個小工具;在這個工具中,我們會用到t2_ReadPage(addrTkt-3, t_mem) 這個指令,將包含曲目索引區與其前3頁,一併先讀入t_mem 的暫存區。如果你還記得,第二課有說到:「READ指令每次會讀出連續4頁的資料。」,所以在這裡的 addrTkt-3 就是指到頁0x24。

如果讀入的 t_mem 資料作為母片( MASR ),當進行複製寫到 SLAV 時,就必須連續寫4頁,對吧!
if (isTagPresent()) {
   int i = addrTkt-3;
   byte temp[4];
   for (int ii=0; ii<4; ii++) {
       for (int jj=0; jj<4; jj++) {
            temp[jj] = t_mem[ii*4+jj];
       }
       t2_WritePage(i+ii, temp);
   }
        ......

其實,講到這裡,你已經可以完全掌握對NFC第2型這類標籤的存取。當然,還有進一步的一些對記憶體存取的保護設定、URL附加功能等...,會因為不同廠家的晶片,各有其不同的指令格式,所以在此就不多做介紹了。  

最後,要特別再呼應一下開頭所述防『鎖死』的機制,在目前這個小工具裡,先靠感應CONFIG標籤進入,然後會自行跳到感應  MASR  的等待迴圈,如果超過10秒,沒有任何TAG被感應到,將會自動離開這個小工具,結束 CONFIG 狀態,回到進入前的狀態;

while (f_tagPGMR) {
   switch (op) {
      case 0: {
         sr = "MASR";
         ss = "Put master tag..";
         draw(SCAN, 0xFF);       
         rwdIdle();
         if (isTagPresent()) {
              int rr = t2_ReadPage(addrTkt-3, t_mem);
              ...... 
              dd = millis();
         }
         if ((millis()-dd) > 10000) {
             f_tagPGMR = false; //QUIT
             if (f_nowPlaying) myDFPlayer.start();
             sysDelay = 1000;
             ......  
         }
         break;
      }
      case 1: {
         sr = "SLAV";
         ss = "Put any tag to copy..";
             if (isTagPresent()) { 
         .....
         }
         if ((millis()-dd) > 5000) {
             op = 0;
             dd = millis();
         }
         break;
      }
    }
  }

如果,有母片被讀取到,會自行跳到感應  SLAV  的等待迴圈,任何在此時放入的標籤,都會進行複製寫入;同樣的只要超過5秒,沒有任何TAG被感應到,將會自動回到等待母片狀態。

這樣的設計,就是在沒有多餘輸入指示的按鍵下,透過計時來作為切換程序的範例之一。
 

留言

熱門文章