2025年6月11日水曜日

NFCアンテナ(5)

 


実験用のNFCアンテナを作って、、、性能を見てたつもりなんだけど、性能確認に使っていたPN5180ってDPC(Dynamic Power Control)ってのが有効になっていて、アンテナそのものの性能が比較できない状態だったので、これを無効にする。クソッ

PN5180のデータシートはこちら(https://www.nxp.jp/docs/en/data-sheet/PN5180A0XX_C3_C4.pdf)
で、NXPが提供しているライブラリとかを参照できればEEPROMとかレジスタとかのアドレスとか書いてあるんだろうけど、NXPってこういうのをホビーユーザーに公開してないんよね。ホビーユーザー?知らんがなって態度がマジむかつく。が、NFCってなるとNXPがメジャーだから使うしかない。で、データシートからがんばってEEPROMのアドレスとサイズを抽出して、
  1. #include <PN5180.h>
  2. #include <PN5180ISO14443.h>
  3. #define PN5180_NSS 1
  4. #define PN5180_BUSY 2
  5. #define PN5180_RST 3
  6.  
  7. #define EEADDR_Die_identifier (0x00)
  8. #define EEADDR_Product_Version (0x10)
  9. #define EEADDR_Firmware_Version (0x12)
  10. #define EEADDR_EEPROM_Version (0x14)
  11. #define EEADDR_IDLE_IRQ_AFTER_BOOT (0x16)
  12. #define EEADDR_TESTBUS_ENABLE (0x17)
  13. #define EEADDR_XTAL_BOOT_TIME (0x18)
  14. #define EEADDR_IRQ_PIN_CONFIG (0x1A)
  15. #define EEADDR_MISO_PULLUP_ENABLE (0x1B)
  16. #define EEADDR_PLL_DEFAULT_SETTING (0x1C)
  17. #define EEADDR_PLL_DEFAULT_SETTING_ALM (0x24)
  18. #define EEADDR_PLL_LOCK_SETTING (0x2C)
  19. #define EEADDR_CLOCK_CONFIG (0x30)
  20. #define EEADDR_MFC_AUTH_TIMEOUT (0x32)
  21. #define EEADDR_LPCD_REFERENCE_VALUE (0x34)
  22. #define EEADDR_LPCD_FIELD_ON_TIME (0x36)
  23. #define EEADDR_LPCD_THRESHOLD (0x37)
  24. #define EEADDR_LPCD_REFVAL_GPO_CONTROL (0x38)
  25. #define EEADDR_LPCD_GPO_TOGGLE_BEFORE_FIELD_ON (0x39)
  26. #define EEADDR_LPCD_GPO_TOGGLE_AFTER_FIELD_OFF (0x3A)
  27. #define EEADDR_NFCLD_SENSITIVITY_VAL (0x3B)
  28. #define EEADDR_FIELD_ON_CP_SETTLE_TIME (0x3C)
  29. #define EEADDR_RF_DEBOUNCE_TIMEOUT (0x3F)
  30. #define EEADDR_SENS_RES (0x40)
  31. #define EEADDR_NFCID1 (0x42)
  32. #define EEADDR_SEL_RES (0x45)
  33. #define EEADDR_FELICA_POLLING_RESPONSE (0x46)
  34. #define EEADDR_RANDOM_UID_ENABLE (0x58)
  35. #define EEADDR_DPC_CONTROL (0x59)
  36. #define EEADDR_DPC_TIME (0x5A)
  37. #define EEADDR_DPC_XI (0x5C)
  38. #define EEADDR_AGC_CONTROL (0x5D)
  39. #define EEADDR_DPC_THRSH_HIGH (0x5F)
  40. #define EEADDR_DPC_THRSH_LOW (0x7D)
  41. #define EEADDR_DPC_DEBUG (0x7F)
  42. #define EEADDR_DPC_AGC_SHIFT_VALUE (0x80)
  43. #define EEADDR_DPC_AGC_GEAR_LUT__SIZE (0x81)
  44. #define EEADDR_DPC_AGC_GEAR_LUT (0x82)
  45. #define EEADDR_DPC_GUARD_FAST__MODE (0x91)
  46. #define EEADDR_DPC_GUARD_SOF__DETECTED (0x93)
  47. #define EEADDR_DPC_GUARD_FIELD_ON (0x95)
  48. #define EEADDR_PCD_AWC_DRC_LUT_SIZE (0x97)
  49. #define EEADDR_PCD_AWC_DRC_LUT (0x98)
  50. #define EEADDR_Misc_Config (0xE8)
  51. #define EEADDR_DigiDelay_A_848_RW (0xE9)
  52. #define EEADDR_DigiDelay_B_848_RW (0xEA)
  53. #define EEADDR_DigiDelay_F_424_RW (0xEB)
  54. #define EEADDR_DigiDelay_15693_RW_FastHigh (0xEC)
  55. #define EEADDR_DigiDelay_18000_2_848 (0xED)
  56. #define EEADDR_DigiDelay_18000_4_848 (0xEE)
  57. #define EEADDR_TestbusMode (0xF0)
  58. #define EEADDR_TbSelect (0xF1)
  59. #define EEADDR_MapTb1_to_Tb0 (0xF2)
  60. #define EEADDR_NumPadSignalMaps (0xF3)
  61. #define EEADDR_PadSignalMap (0xF4)
  62. #define EEADDR_TbDac1 (0xF8)
  63. #define EEADDR_TbDac2 (0xF9)
  64. #define EEADDR_Legacy_typeB_handling_enable (0xFA)
  65. #define EEADDR_Legacy_typeB_handling_interval (0xFB)
  66. #define EEADDR_DPC_Config (0xFC)
  67.  
  68. #define EELEN_Die_identifier (16)
  69. #define EELEN_Product_Version (2)
  70. #define EELEN_Firmware_Version (2)
  71. #define EELEN_EEPROM_Version (2)
  72. #define EELEN_IDLE_IRQ_AFTER_BOOT (1)
  73. #define EELEN_TESTBUS_ENABLE (1)
  74. #define EELEN_XTAL_BOOT_TIME (2)
  75. #define EELEN_IRQ_PIN_CONFIG (1)
  76. #define EELEN_MISO_PULLUP_ENABLE (1)
  77. #define EELEN_PLL_DEFAULT_SETTING (8)
  78. #define EELEN_PLL_DEFAULT_SETTING_ALM (8)
  79. #define EELEN_PLL_LOCK_SETTING (4)
  80. #define EELEN_CLOCK_CONFIG (1)
  81. #define EELEN_MFC_AUTH_TIMEOUT (2)
  82. #define EELEN_LPCD_REFERENCE_VALUE (1)
  83. #define EELEN_LPCD_FIELD_ON_TIME (1)
  84. #define EELEN_LPCD_THRESHOLD (1)
  85. #define EELEN_LPCD_REFVAL_GPO_CONTROL (1)
  86. #define EELEN_LPCD_GPO_TOGGLE_BEFORE_FIELD_ON (1)
  87. #define EELEN_LPCD_GPO_TOGGLE_AFTER_FIELD_OFF (1)
  88. #define EELEN_NFCLD_SENSITIVITY_VAL (1)
  89. #define EELEN_FIELD_ON_CP_SETTLE_TIME (1)
  90. #define EELEN_RF_DEBOUNCE_TIMEOUT (1)
  91. #define EELEN_SENS_RES (2)
  92. #define EELEN_NFCID1 (3)
  93. #define EELEN_SEL_RES (1)
  94. #define EELEN_FELICA_POLLING_RESPONSE (18)
  95. #define EELEN_RANDOM_UID_ENABLE (1)
  96. #define EELEN_DPC_CONTROL (1)
  97. #define EELEN_DPC_TIME (2)
  98. #define EELEN_DPC_XI (1)
  99. #define EELEN_AGC_CONTROL (2)
  100. #define EELEN_DPC_THRSH_HIGH (30)
  101. #define EELEN_DPC_THRSH_LOW (2)
  102. #define EELEN_DPC_DEBUG (1)
  103. #define EELEN_DPC_AGC_SHIFT_VALUE (1)
  104. #define EELEN_DPC_AGC_GEAR_LUT__SIZE (1)
  105. #define EELEN_DPC_AGC_GEAR_LUT (15)
  106. #define EELEN_DPC_GUARD_FAST__MODE (2)
  107. #define EELEN_DPC_GUARD_SOF__DETECTED (2)
  108. #define EELEN_DPC_GUARD_FIELD_ON (2)
  109. #define EELEN_PCD_AWC_DRC_LUT_SIZE (1)
  110. #define EELEN_PCD_AWC_DRC_LUT (80)
  111. #define EELEN_Misc_Config (1)
  112. #define EELEN_DigiDelay_A_848_RW (1)
  113. #define EELEN_DigiDelay_B_848_RW (1)
  114. #define EELEN_DigiDelay_F_424_RW (1)
  115. #define EELEN_DigiDelay_15693_RW_FastHigh (1)
  116. #define EELEN_DigiDelay_18000_2_848 (1)
  117. #define EELEN_DigiDelay_18000_4_848 (1)
  118. #define EELEN_TestbusMode (1)
  119. #define EELEN_TbSelect (1)
  120. #define EELEN_MapTb1_to_Tb0 (1)
  121. #define EELEN_NumPadSignalMaps (1)
  122. #define EELEN_PadSignalMap (1)
  123. #define EELEN_TbDac1 (1)
  124. #define EELEN_TbDac2 (1)
  125. #define EELEN_Legacy_typeB_handling_enable (1)
  126. #define EELEN_Legacy_typeB_handling_interval (1)
  127. #define EELEN_DPC_Config (1)
  128.  
  129. #define EESETUP_SIZE (60)
  130.  
  131. typedef struct {
  132.     uint8_t EEADR;
  133.     uint8_t EELEN;
  134. }EESETUP_T;
  135. EESETUP_T EESETUP[]={
  136. {EEADDR_Die_identifier,EELEN_Die_identifier},
  137. {EEADDR_Product_Version,EELEN_Product_Version},
  138. {EEADDR_Firmware_Version,EELEN_Firmware_Version},
  139. {EEADDR_EEPROM_Version,EELEN_EEPROM_Version},
  140. {EEADDR_IDLE_IRQ_AFTER_BOOT,EELEN_IDLE_IRQ_AFTER_BOOT},
  141. {EEADDR_TESTBUS_ENABLE,EELEN_TESTBUS_ENABLE},
  142. {EEADDR_XTAL_BOOT_TIME,EELEN_XTAL_BOOT_TIME},
  143. {EEADDR_IRQ_PIN_CONFIG,EELEN_IRQ_PIN_CONFIG},
  144. {EEADDR_MISO_PULLUP_ENABLE,EELEN_MISO_PULLUP_ENABLE},
  145. {EEADDR_PLL_DEFAULT_SETTING,EELEN_PLL_DEFAULT_SETTING},
  146. {EEADDR_PLL_DEFAULT_SETTING_ALM,EELEN_PLL_DEFAULT_SETTING_ALM},
  147. {EEADDR_PLL_LOCK_SETTING,EELEN_PLL_LOCK_SETTING},
  148. {EEADDR_CLOCK_CONFIG,EELEN_CLOCK_CONFIG},
  149. {EEADDR_MFC_AUTH_TIMEOUT,EELEN_MFC_AUTH_TIMEOUT},
  150. {EEADDR_LPCD_REFERENCE_VALUE,EELEN_LPCD_REFERENCE_VALUE},
  151. {EEADDR_LPCD_FIELD_ON_TIME,EELEN_LPCD_FIELD_ON_TIME},
  152. {EEADDR_LPCD_THRESHOLD,EELEN_LPCD_THRESHOLD},
  153. {EEADDR_LPCD_REFVAL_GPO_CONTROL,EELEN_LPCD_REFVAL_GPO_CONTROL},
  154. {EEADDR_LPCD_GPO_TOGGLE_BEFORE_FIELD_ON,EELEN_LPCD_GPO_TOGGLE_BEFORE_FIELD_ON},
  155. {EEADDR_LPCD_GPO_TOGGLE_AFTER_FIELD_OFF,EELEN_LPCD_GPO_TOGGLE_AFTER_FIELD_OFF},
  156. {EEADDR_NFCLD_SENSITIVITY_VAL,EELEN_NFCLD_SENSITIVITY_VAL},
  157. {EEADDR_FIELD_ON_CP_SETTLE_TIME,EELEN_FIELD_ON_CP_SETTLE_TIME},
  158. {EEADDR_RF_DEBOUNCE_TIMEOUT,EELEN_RF_DEBOUNCE_TIMEOUT},
  159. {EEADDR_SENS_RES,EELEN_SENS_RES},
  160. {EEADDR_NFCID1,EELEN_NFCID1},
  161. {EEADDR_SEL_RES,EELEN_SEL_RES},
  162. {EEADDR_FELICA_POLLING_RESPONSE,EELEN_FELICA_POLLING_RESPONSE},
  163. {EEADDR_RANDOM_UID_ENABLE,EELEN_RANDOM_UID_ENABLE},
  164. {EEADDR_DPC_CONTROL,EELEN_DPC_CONTROL},
  165. {EEADDR_DPC_TIME,EELEN_DPC_TIME},
  166. {EEADDR_DPC_XI,EELEN_DPC_XI},
  167. {EEADDR_AGC_CONTROL,EELEN_AGC_CONTROL},
  168. {EEADDR_DPC_THRSH_HIGH,EELEN_DPC_THRSH_HIGH},
  169. {EEADDR_DPC_THRSH_LOW,EELEN_DPC_THRSH_LOW},
  170. {EEADDR_DPC_DEBUG,EELEN_DPC_DEBUG},
  171. {EEADDR_DPC_AGC_SHIFT_VALUE,EELEN_DPC_AGC_SHIFT_VALUE},
  172. {EEADDR_DPC_AGC_GEAR_LUT__SIZE,EELEN_DPC_AGC_GEAR_LUT__SIZE},
  173. {EEADDR_DPC_AGC_GEAR_LUT,EELEN_DPC_AGC_GEAR_LUT},
  174. {EEADDR_DPC_GUARD_FAST__MODE,EELEN_DPC_GUARD_FAST__MODE},
  175. {EEADDR_DPC_GUARD_SOF__DETECTED,EELEN_DPC_GUARD_SOF__DETECTED},
  176. {EEADDR_DPC_GUARD_FIELD_ON,EELEN_DPC_GUARD_FIELD_ON},
  177. {EEADDR_PCD_AWC_DRC_LUT_SIZE,EELEN_PCD_AWC_DRC_LUT_SIZE},
  178. {EEADDR_PCD_AWC_DRC_LUT,EELEN_PCD_AWC_DRC_LUT},
  179. {EEADDR_Misc_Config,EELEN_Misc_Config},
  180. {EEADDR_DigiDelay_A_848_RW,EELEN_DigiDelay_A_848_RW},
  181. {EEADDR_DigiDelay_B_848_RW,EELEN_DigiDelay_B_848_RW},
  182. {EEADDR_DigiDelay_F_424_RW,EELEN_DigiDelay_F_424_RW},
  183. {EEADDR_DigiDelay_15693_RW_FastHigh,EELEN_DigiDelay_15693_RW_FastHigh},
  184. {EEADDR_DigiDelay_18000_2_848,EELEN_DigiDelay_18000_2_848},
  185. {EEADDR_DigiDelay_18000_4_848,EELEN_DigiDelay_18000_4_848},
  186. {EEADDR_TestbusMode,EELEN_TestbusMode},
  187. {EEADDR_TbSelect,EELEN_TbSelect},
  188. {EEADDR_MapTb1_to_Tb0,EELEN_MapTb1_to_Tb0},
  189. {EEADDR_NumPadSignalMaps,EELEN_NumPadSignalMaps},
  190. {EEADDR_PadSignalMap,EELEN_PadSignalMap},
  191. {EEADDR_TbDac1,EELEN_TbDac1},
  192. {EEADDR_TbDac2,EELEN_TbDac2},
  193. {EEADDR_Legacy_typeB_handling_enable,EELEN_Legacy_typeB_handling_enable},
  194. {EEADDR_Legacy_typeB_handling_interval,EELEN_Legacy_typeB_handling_interval},
  195. {EEADDR_DPC_Config,EELEN_DPC_Config}
  196. };
  197.  
  198. PN5180ISO14443 nfc(PN5180_NSS, PN5180_BUSY, PN5180_RST);
  199.  
  200. void setup()
  201. {
  202.     delay(3000);
  203.     pinMode(LED_BUILTIN, OUTPUT);
  204.     digitalWrite(LED_BUILTIN, HIGH);
  205.     Serial.begin(115200);
  206.     Serial.println(F("=================================="));
  207.     Serial.println(F("Uploaded: " __DATE__ " " __TIME__));
  208.     Serial.println(F("PN5180 ISO14443 Test Sketch"));
  209.     nfc.begin();
  210.     Serial.println(F("----------------------------------"));
  211.     Serial.println(F("PN5180 Hard-Reset..."));
  212.     nfc.reset();
  213.     Serial.println(F("----------------------------------"));
  214.     Serial.println(F("Reading product version..."));
  215.     uint8_t productVersion[2];
  216.     nfc.readEEprom(PRODUCT_VERSION, productVersion, sizeof(productVersion));
  217.     Serial.print(F("Product version="));
  218.     Serial.print(productVersion[1]);
  219.     Serial.print(".");
  220.     Serial.println(productVersion[0]);
  221.     if (0xff == productVersion[1])
  222.     { // if product version 255, the initialization failed
  223.         Serial.println(F("Initialization failed!?"));
  224.         Serial.println(F("Press reset to restart..."));
  225.         Serial.flush();
  226.         exit(-1); // halt
  227.     }
  228.  
  229.     Serial.println(F("----------------------------------"));
  230.     Serial.println(F("Reading firmware version..."));
  231.     uint8_t firmwareVersion[2];
  232.     nfc.readEEprom(FIRMWARE_VERSION, firmwareVersion, sizeof(firmwareVersion));
  233.     Serial.print(F("Firmware version="));
  234.     Serial.print(firmwareVersion[1]);
  235.     Serial.print(".");
  236.     Serial.println(firmwareVersion[0]);
  237.     Serial.println(F("----------------------------------"));
  238.     Serial.println(F("Reading EEPROM version..."));
  239.     uint8_t eepromVersion[2];
  240.     nfc.readEEprom(EEPROM_VERSION, eepromVersion, sizeof(eepromVersion));
  241.     Serial.print(F("EEPROM version="));
  242.     Serial.print(eepromVersion[1]);
  243.     Serial.print(".");
  244.     Serial.println(eepromVersion[0]);
  245.     Serial.println(F("----------------------------------"));
  246.     uint8_t eereadbuf[80];
  247.     char prnbuf[256];
  248.     for(uint8_t i=0;i<EESETUP_SIZE;i++){
  249.         nfc.readEEprom(EESETUP[i].EEADR, eereadbuf, EESETUP[i].EELEN);
  250.         sprintf(prnbuf,"%02X=",EESETUP[i].EEADR);
  251.         Serial.print(prnbuf);
  252.         for(uint8_t j=0;j<EESETUP[i].EELEN;j++){
  253.             sprintf(prnbuf," %02X",eereadbuf[j]);
  254.             Serial.print(prnbuf);
  255.         }
  256.         Serial.println("");
  257.     }
  258.     Serial.println(F("----------------------------------"));
  259.     nfc.readEEprom(EEADDR_DPC_CONTROL, eereadbuf, EELEN_DPC_CONTROL);
  260.     sprintf(prnbuf,"DPC_CONTROL=%02X",eereadbuf[0]);Serial.println(prnbuf);
  261.     eereadbuf[0]&=0xFE;
  262.     nfc.writeEEPROM(EEADDR_DPC_CONTROL, eereadbuf, EELEN_DPC_CONTROL);
  263.     nfc.readEEprom(EEADDR_DPC_CONTROL, eereadbuf, EELEN_DPC_CONTROL);
  264.     sprintf(prnbuf,"DPC_CONTROL=%02X",eereadbuf[0]);Serial.println(prnbuf);
  265.  
  266.     Serial.println(F("----------------------------------"));
  267.     Serial.println(F("Enable RF field..."));
  268.     nfc.setupRF();
  269.     digitalWrite(LED_BUILTIN, LOW);
  270. }
  271. uint32_t loopCnt = 0;
  272. bool errorFlag = false;
  273. void loop()
  274. {
  275.     digitalWrite(LED_BUILTIN, HIGH); // turn the LED on (HIGH is the voltage level)
  276.     Serial.println(F("----------------------------------"));
  277.     Serial.print(F("Loop #"));
  278.     Serial.println(loopCnt++);
  279.     uint8_t uid[20];
  280.     // check for ISO14443 card
  281.     nfc.reset();
  282.     nfc.setupRF();
  283.     uint8_t uidLength = nfc.readCardSerial(uid);
  284.     if (uidLength > 0)
  285.     {
  286.         Serial.print(F("ISO14443 card found, UID="));
  287.         for (int i = 0; i < uidLength; i++)
  288.         {
  289.             Serial.print(uid[i] < 0x10 ? " 0" : " ");
  290.             Serial.print(uid[i], HEX);
  291.         }
  292.         Serial.println();
  293.         Serial.println(F("----------------------------------"));
  294.         delay(1000);
  295.         return;
  296.     }
  297.  
  298.     // no card detected
  299.     Serial.println(F("*** No card detected!"));
  300.     digitalWrite(LED_BUILTIN, LOW); // turn the LED off by making the voltage LOW
  301.     delay(100); // wait for a second
  302. }
って感じ。DPCをDisableにするのも実装した。↓これ参照
ちなみに、データシートにめっちゃ間違いがあるんよ。まじクソ。
で、実行すると、こんな感じで書き換えてくれる。
----------------------------------
DPC_CONTROL=73
DPC_CONTROL=72
----------------------------------
EEPROMを書き替えるので、一度だけ書き換えてしまえばいい。

なお、「NFCアンテナ(4)」の記事は諸事情により非公開です。たぶん、この後もかなり非公開。非公開だとモチベーションないんだけど、諸事情により、、、

0 件のコメント:

コメントを投稿