[第九課] 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; //QUITif (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被感應到,將會自動回到等待母片狀態。
這樣的設計,就是在沒有多餘輸入指示的按鍵下,透過計時來作為切換程序的範例之一。
留言
張貼留言