実験用の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のアドレスとサイズを抽出して、
- #include <PN5180.h>
- #include <PN5180ISO14443.h>
- #define PN5180_NSS 1
- #define PN5180_BUSY 2
- #define PN5180_RST 3
-
- #define EEADDR_Die_identifier (0x00)
- #define EEADDR_Product_Version (0x10)
- #define EEADDR_Firmware_Version (0x12)
- #define EEADDR_EEPROM_Version (0x14)
- #define EEADDR_IDLE_IRQ_AFTER_BOOT (0x16)
- #define EEADDR_TESTBUS_ENABLE (0x17)
- #define EEADDR_XTAL_BOOT_TIME (0x18)
- #define EEADDR_IRQ_PIN_CONFIG (0x1A)
- #define EEADDR_MISO_PULLUP_ENABLE (0x1B)
- #define EEADDR_PLL_DEFAULT_SETTING (0x1C)
- #define EEADDR_PLL_DEFAULT_SETTING_ALM (0x24)
- #define EEADDR_PLL_LOCK_SETTING (0x2C)
- #define EEADDR_CLOCK_CONFIG (0x30)
- #define EEADDR_MFC_AUTH_TIMEOUT (0x32)
- #define EEADDR_LPCD_REFERENCE_VALUE (0x34)
- #define EEADDR_LPCD_FIELD_ON_TIME (0x36)
- #define EEADDR_LPCD_THRESHOLD (0x37)
- #define EEADDR_LPCD_REFVAL_GPO_CONTROL (0x38)
- #define EEADDR_LPCD_GPO_TOGGLE_BEFORE_FIELD_ON (0x39)
- #define EEADDR_LPCD_GPO_TOGGLE_AFTER_FIELD_OFF (0x3A)
- #define EEADDR_NFCLD_SENSITIVITY_VAL (0x3B)
- #define EEADDR_FIELD_ON_CP_SETTLE_TIME (0x3C)
- #define EEADDR_RF_DEBOUNCE_TIMEOUT (0x3F)
- #define EEADDR_SENS_RES (0x40)
- #define EEADDR_NFCID1 (0x42)
- #define EEADDR_SEL_RES (0x45)
- #define EEADDR_FELICA_POLLING_RESPONSE (0x46)
- #define EEADDR_RANDOM_UID_ENABLE (0x58)
- #define EEADDR_DPC_CONTROL (0x59)
- #define EEADDR_DPC_TIME (0x5A)
- #define EEADDR_DPC_XI (0x5C)
- #define EEADDR_AGC_CONTROL (0x5D)
- #define EEADDR_DPC_THRSH_HIGH (0x5F)
- #define EEADDR_DPC_THRSH_LOW (0x7D)
- #define EEADDR_DPC_DEBUG (0x7F)
- #define EEADDR_DPC_AGC_SHIFT_VALUE (0x80)
- #define EEADDR_DPC_AGC_GEAR_LUT__SIZE (0x81)
- #define EEADDR_DPC_AGC_GEAR_LUT (0x82)
- #define EEADDR_DPC_GUARD_FAST__MODE (0x91)
- #define EEADDR_DPC_GUARD_SOF__DETECTED (0x93)
- #define EEADDR_DPC_GUARD_FIELD_ON (0x95)
- #define EEADDR_PCD_AWC_DRC_LUT_SIZE (0x97)
- #define EEADDR_PCD_AWC_DRC_LUT (0x98)
- #define EEADDR_Misc_Config (0xE8)
- #define EEADDR_DigiDelay_A_848_RW (0xE9)
- #define EEADDR_DigiDelay_B_848_RW (0xEA)
- #define EEADDR_DigiDelay_F_424_RW (0xEB)
- #define EEADDR_DigiDelay_15693_RW_FastHigh (0xEC)
- #define EEADDR_DigiDelay_18000_2_848 (0xED)
- #define EEADDR_DigiDelay_18000_4_848 (0xEE)
- #define EEADDR_TestbusMode (0xF0)
- #define EEADDR_TbSelect (0xF1)
- #define EEADDR_MapTb1_to_Tb0 (0xF2)
- #define EEADDR_NumPadSignalMaps (0xF3)
- #define EEADDR_PadSignalMap (0xF4)
- #define EEADDR_TbDac1 (0xF8)
- #define EEADDR_TbDac2 (0xF9)
- #define EEADDR_Legacy_typeB_handling_enable (0xFA)
- #define EEADDR_Legacy_typeB_handling_interval (0xFB)
- #define EEADDR_DPC_Config (0xFC)
-
- #define EELEN_Die_identifier (16)
- #define EELEN_Product_Version (2)
- #define EELEN_Firmware_Version (2)
- #define EELEN_EEPROM_Version (2)
- #define EELEN_IDLE_IRQ_AFTER_BOOT (1)
- #define EELEN_TESTBUS_ENABLE (1)
- #define EELEN_XTAL_BOOT_TIME (2)
- #define EELEN_IRQ_PIN_CONFIG (1)
- #define EELEN_MISO_PULLUP_ENABLE (1)
- #define EELEN_PLL_DEFAULT_SETTING (8)
- #define EELEN_PLL_DEFAULT_SETTING_ALM (8)
- #define EELEN_PLL_LOCK_SETTING (4)
- #define EELEN_CLOCK_CONFIG (1)
- #define EELEN_MFC_AUTH_TIMEOUT (2)
- #define EELEN_LPCD_REFERENCE_VALUE (1)
- #define EELEN_LPCD_FIELD_ON_TIME (1)
- #define EELEN_LPCD_THRESHOLD (1)
- #define EELEN_LPCD_REFVAL_GPO_CONTROL (1)
- #define EELEN_LPCD_GPO_TOGGLE_BEFORE_FIELD_ON (1)
- #define EELEN_LPCD_GPO_TOGGLE_AFTER_FIELD_OFF (1)
- #define EELEN_NFCLD_SENSITIVITY_VAL (1)
- #define EELEN_FIELD_ON_CP_SETTLE_TIME (1)
- #define EELEN_RF_DEBOUNCE_TIMEOUT (1)
- #define EELEN_SENS_RES (2)
- #define EELEN_NFCID1 (3)
- #define EELEN_SEL_RES (1)
- #define EELEN_FELICA_POLLING_RESPONSE (18)
- #define EELEN_RANDOM_UID_ENABLE (1)
- #define EELEN_DPC_CONTROL (1)
- #define EELEN_DPC_TIME (2)
- #define EELEN_DPC_XI (1)
- #define EELEN_AGC_CONTROL (2)
- #define EELEN_DPC_THRSH_HIGH (30)
- #define EELEN_DPC_THRSH_LOW (2)
- #define EELEN_DPC_DEBUG (1)
- #define EELEN_DPC_AGC_SHIFT_VALUE (1)
- #define EELEN_DPC_AGC_GEAR_LUT__SIZE (1)
- #define EELEN_DPC_AGC_GEAR_LUT (15)
- #define EELEN_DPC_GUARD_FAST__MODE (2)
- #define EELEN_DPC_GUARD_SOF__DETECTED (2)
- #define EELEN_DPC_GUARD_FIELD_ON (2)
- #define EELEN_PCD_AWC_DRC_LUT_SIZE (1)
- #define EELEN_PCD_AWC_DRC_LUT (80)
- #define EELEN_Misc_Config (1)
- #define EELEN_DigiDelay_A_848_RW (1)
- #define EELEN_DigiDelay_B_848_RW (1)
- #define EELEN_DigiDelay_F_424_RW (1)
- #define EELEN_DigiDelay_15693_RW_FastHigh (1)
- #define EELEN_DigiDelay_18000_2_848 (1)
- #define EELEN_DigiDelay_18000_4_848 (1)
- #define EELEN_TestbusMode (1)
- #define EELEN_TbSelect (1)
- #define EELEN_MapTb1_to_Tb0 (1)
- #define EELEN_NumPadSignalMaps (1)
- #define EELEN_PadSignalMap (1)
- #define EELEN_TbDac1 (1)
- #define EELEN_TbDac2 (1)
- #define EELEN_Legacy_typeB_handling_enable (1)
- #define EELEN_Legacy_typeB_handling_interval (1)
- #define EELEN_DPC_Config (1)
-
- #define EESETUP_SIZE (60)
-
- typedef struct {
- uint8_t EEADR;
- uint8_t EELEN;
- }EESETUP_T;
- EESETUP_T EESETUP[]={
- {EEADDR_Die_identifier,EELEN_Die_identifier},
- {EEADDR_Product_Version,EELEN_Product_Version},
- {EEADDR_Firmware_Version,EELEN_Firmware_Version},
- {EEADDR_EEPROM_Version,EELEN_EEPROM_Version},
- {EEADDR_IDLE_IRQ_AFTER_BOOT,EELEN_IDLE_IRQ_AFTER_BOOT},
- {EEADDR_TESTBUS_ENABLE,EELEN_TESTBUS_ENABLE},
- {EEADDR_XTAL_BOOT_TIME,EELEN_XTAL_BOOT_TIME},
- {EEADDR_IRQ_PIN_CONFIG,EELEN_IRQ_PIN_CONFIG},
- {EEADDR_MISO_PULLUP_ENABLE,EELEN_MISO_PULLUP_ENABLE},
- {EEADDR_PLL_DEFAULT_SETTING,EELEN_PLL_DEFAULT_SETTING},
- {EEADDR_PLL_DEFAULT_SETTING_ALM,EELEN_PLL_DEFAULT_SETTING_ALM},
- {EEADDR_PLL_LOCK_SETTING,EELEN_PLL_LOCK_SETTING},
- {EEADDR_CLOCK_CONFIG,EELEN_CLOCK_CONFIG},
- {EEADDR_MFC_AUTH_TIMEOUT,EELEN_MFC_AUTH_TIMEOUT},
- {EEADDR_LPCD_REFERENCE_VALUE,EELEN_LPCD_REFERENCE_VALUE},
- {EEADDR_LPCD_FIELD_ON_TIME,EELEN_LPCD_FIELD_ON_TIME},
- {EEADDR_LPCD_THRESHOLD,EELEN_LPCD_THRESHOLD},
- {EEADDR_LPCD_REFVAL_GPO_CONTROL,EELEN_LPCD_REFVAL_GPO_CONTROL},
- {EEADDR_LPCD_GPO_TOGGLE_BEFORE_FIELD_ON,EELEN_LPCD_GPO_TOGGLE_BEFORE_FIELD_ON},
- {EEADDR_LPCD_GPO_TOGGLE_AFTER_FIELD_OFF,EELEN_LPCD_GPO_TOGGLE_AFTER_FIELD_OFF},
- {EEADDR_NFCLD_SENSITIVITY_VAL,EELEN_NFCLD_SENSITIVITY_VAL},
- {EEADDR_FIELD_ON_CP_SETTLE_TIME,EELEN_FIELD_ON_CP_SETTLE_TIME},
- {EEADDR_RF_DEBOUNCE_TIMEOUT,EELEN_RF_DEBOUNCE_TIMEOUT},
- {EEADDR_SENS_RES,EELEN_SENS_RES},
- {EEADDR_NFCID1,EELEN_NFCID1},
- {EEADDR_SEL_RES,EELEN_SEL_RES},
- {EEADDR_FELICA_POLLING_RESPONSE,EELEN_FELICA_POLLING_RESPONSE},
- {EEADDR_RANDOM_UID_ENABLE,EELEN_RANDOM_UID_ENABLE},
- {EEADDR_DPC_CONTROL,EELEN_DPC_CONTROL},
- {EEADDR_DPC_TIME,EELEN_DPC_TIME},
- {EEADDR_DPC_XI,EELEN_DPC_XI},
- {EEADDR_AGC_CONTROL,EELEN_AGC_CONTROL},
- {EEADDR_DPC_THRSH_HIGH,EELEN_DPC_THRSH_HIGH},
- {EEADDR_DPC_THRSH_LOW,EELEN_DPC_THRSH_LOW},
- {EEADDR_DPC_DEBUG,EELEN_DPC_DEBUG},
- {EEADDR_DPC_AGC_SHIFT_VALUE,EELEN_DPC_AGC_SHIFT_VALUE},
- {EEADDR_DPC_AGC_GEAR_LUT__SIZE,EELEN_DPC_AGC_GEAR_LUT__SIZE},
- {EEADDR_DPC_AGC_GEAR_LUT,EELEN_DPC_AGC_GEAR_LUT},
- {EEADDR_DPC_GUARD_FAST__MODE,EELEN_DPC_GUARD_FAST__MODE},
- {EEADDR_DPC_GUARD_SOF__DETECTED,EELEN_DPC_GUARD_SOF__DETECTED},
- {EEADDR_DPC_GUARD_FIELD_ON,EELEN_DPC_GUARD_FIELD_ON},
- {EEADDR_PCD_AWC_DRC_LUT_SIZE,EELEN_PCD_AWC_DRC_LUT_SIZE},
- {EEADDR_PCD_AWC_DRC_LUT,EELEN_PCD_AWC_DRC_LUT},
- {EEADDR_Misc_Config,EELEN_Misc_Config},
- {EEADDR_DigiDelay_A_848_RW,EELEN_DigiDelay_A_848_RW},
- {EEADDR_DigiDelay_B_848_RW,EELEN_DigiDelay_B_848_RW},
- {EEADDR_DigiDelay_F_424_RW,EELEN_DigiDelay_F_424_RW},
- {EEADDR_DigiDelay_15693_RW_FastHigh,EELEN_DigiDelay_15693_RW_FastHigh},
- {EEADDR_DigiDelay_18000_2_848,EELEN_DigiDelay_18000_2_848},
- {EEADDR_DigiDelay_18000_4_848,EELEN_DigiDelay_18000_4_848},
- {EEADDR_TestbusMode,EELEN_TestbusMode},
- {EEADDR_TbSelect,EELEN_TbSelect},
- {EEADDR_MapTb1_to_Tb0,EELEN_MapTb1_to_Tb0},
- {EEADDR_NumPadSignalMaps,EELEN_NumPadSignalMaps},
- {EEADDR_PadSignalMap,EELEN_PadSignalMap},
- {EEADDR_TbDac1,EELEN_TbDac1},
- {EEADDR_TbDac2,EELEN_TbDac2},
- {EEADDR_Legacy_typeB_handling_enable,EELEN_Legacy_typeB_handling_enable},
- {EEADDR_Legacy_typeB_handling_interval,EELEN_Legacy_typeB_handling_interval},
- {EEADDR_DPC_Config,EELEN_DPC_Config}
- };
-
- PN5180ISO14443 nfc(PN5180_NSS, PN5180_BUSY, PN5180_RST);
-
- void setup()
- {
- delay(3000);
- pinMode(LED_BUILTIN, OUTPUT);
- digitalWrite(LED_BUILTIN, HIGH);
- Serial.begin(115200);
- Serial.println(F("=================================="));
- Serial.println(F("Uploaded: " __DATE__ " " __TIME__));
- Serial.println(F("PN5180 ISO14443 Test Sketch"));
- nfc.begin();
- Serial.println(F("----------------------------------"));
- Serial.println(F("PN5180 Hard-Reset..."));
- nfc.reset();
- Serial.println(F("----------------------------------"));
- Serial.println(F("Reading product version..."));
- uint8_t productVersion[2];
- nfc.readEEprom(PRODUCT_VERSION, productVersion, sizeof(productVersion));
- Serial.print(F("Product version="));
- Serial.print(productVersion[1]);
- Serial.print(".");
- Serial.println(productVersion[0]);
- if (0xff == productVersion[1])
- { // if product version 255, the initialization failed
- Serial.println(F("Initialization failed!?"));
- Serial.println(F("Press reset to restart..."));
- Serial.flush();
- exit(-1); // halt
- }
-
- Serial.println(F("----------------------------------"));
- Serial.println(F("Reading firmware version..."));
- uint8_t firmwareVersion[2];
- nfc.readEEprom(FIRMWARE_VERSION, firmwareVersion, sizeof(firmwareVersion));
- Serial.print(F("Firmware version="));
- Serial.print(firmwareVersion[1]);
- Serial.print(".");
- Serial.println(firmwareVersion[0]);
- Serial.println(F("----------------------------------"));
- Serial.println(F("Reading EEPROM version..."));
- uint8_t eepromVersion[2];
- nfc.readEEprom(EEPROM_VERSION, eepromVersion, sizeof(eepromVersion));
- Serial.print(F("EEPROM version="));
- Serial.print(eepromVersion[1]);
- Serial.print(".");
- Serial.println(eepromVersion[0]);
- Serial.println(F("----------------------------------"));
- uint8_t eereadbuf[80];
- char prnbuf[256];
- for(uint8_t i=0;i<EESETUP_SIZE;i++){
- nfc.readEEprom(EESETUP[i].EEADR, eereadbuf, EESETUP[i].EELEN);
- sprintf(prnbuf,"%02X=",EESETUP[i].EEADR);
- Serial.print(prnbuf);
- for(uint8_t j=0;j<EESETUP[i].EELEN;j++){
- sprintf(prnbuf," %02X",eereadbuf[j]);
- Serial.print(prnbuf);
- }
- Serial.println("");
- }
- Serial.println(F("----------------------------------"));
- nfc.readEEprom(EEADDR_DPC_CONTROL, eereadbuf, EELEN_DPC_CONTROL);
- sprintf(prnbuf,"DPC_CONTROL=%02X",eereadbuf[0]);Serial.println(prnbuf);
- eereadbuf[0]&=0xFE;
- nfc.writeEEPROM(EEADDR_DPC_CONTROL, eereadbuf, EELEN_DPC_CONTROL);
- nfc.readEEprom(EEADDR_DPC_CONTROL, eereadbuf, EELEN_DPC_CONTROL);
- sprintf(prnbuf,"DPC_CONTROL=%02X",eereadbuf[0]);Serial.println(prnbuf);
-
- Serial.println(F("----------------------------------"));
- Serial.println(F("Enable RF field..."));
- nfc.setupRF();
- digitalWrite(LED_BUILTIN, LOW);
- }
- uint32_t loopCnt = 0;
- bool errorFlag = false;
- void loop()
- {
- digitalWrite(LED_BUILTIN, HIGH); // turn the LED on (HIGH is the voltage level)
- Serial.println(F("----------------------------------"));
- Serial.print(F("Loop #"));
- Serial.println(loopCnt++);
- uint8_t uid[20];
- // check for ISO14443 card
- nfc.reset();
- nfc.setupRF();
- uint8_t uidLength = nfc.readCardSerial(uid);
- if (uidLength > 0)
- {
- Serial.print(F("ISO14443 card found, UID="));
- for (int i = 0; i < uidLength; i++)
- {
- Serial.print(uid[i] < 0x10 ? " 0" : " ");
- Serial.print(uid[i], HEX);
- }
- Serial.println();
- Serial.println(F("----------------------------------"));
- delay(1000);
- return;
- }
-
- // no card detected
- Serial.println(F("*** No card detected!"));
- digitalWrite(LED_BUILTIN, LOW); // turn the LED off by making the voltage LOW
- delay(100); // wait for a second
- }
ちなみに、データシートにめっちゃ間違いがあるんよ。まじクソ。
で、実行すると、こんな感じで書き換えてくれる。
----------------------------------
DPC_CONTROL=73
DPC_CONTROL=72
----------------------------------
EEPROMを書き替えるので、一度だけ書き換えてしまえばいい。
なお、「NFCアンテナ(4)」の記事は諸事情により非公開です。たぶん、この後もかなり非公開。非公開だとモチベーションないんだけど、諸事情により、、、