Как выбрать сектор на чипе NT3H2111 NFC - PullRequest
1 голос
/ 11 октября 2019

Я использую телефон Android для чтения и записи некоторых данных в EEPROM микросхемы NT3H2111 nfc.

Метод изменения сектора, кажется, работает, но тем не менее, сектор не изменяетсякогда я пытаюсь прочитать содержимое, оно все еще находится в нулевом секторе.

@Override
protected void onNewIntent(Intent intent) {
    try {
        Tag tag = intent.getParcelableExtra(NfcAdapter.EXTRA_TAG);
        ntagHandler = new NtagHandler(tag);
        ntagHandler.connect();
        if(mode == AppMode.READ) {
            Ve95_DataModelHandler.readSectionNames(ve95DataModel, ntagHandler);
            populateView();
        } else if(mode == AppMode.WRITE) {
            populateDataModel();
            Ve95_DataModelHandler.writeSectionNames(ve95DataModel, ntagHandler);
        }
        ntagHandler.close();
        ImageView img = findViewById(R.id.imageViewNFCConnect);
        if(img != null) {
            img.setVisibility(View.INVISIBLE);
            mode = AppMode.READ;
        }
    } catch(IOException e) {
        Toast.makeText(this, "Caught exception: " + e.toString(), Toast.LENGTH_LONG).show();
    }
}

...

public boolean sectorSelect(int sector) throws IOException {
    byte[] cmd_sel1 = { (byte)0xC2, (byte)0xFF };
    byte[] cmd_sel2 = { (byte)sector, (byte)0x00, (byte)0x00, (byte)0x00 };
    byte[] result1 = nfca.transceive(cmd_sel1);
    if (result1 == null) {
        throw new TagLostException();
    } else if ((result1.length == 1) && ((result1[0] & 0x00A) == 0x000)) {
        return false;
    } else {
        try {
            byte[] result2 = nfca.transceive(cmd_sel2);
            if (result2 == null) {
                throw new TagLostException();
            } else if ((result2.length == 1) && ((result2[0] & 0x00A) == 0x000)) {
                // NACK response according to DigitalProtocol
                return false;
            } else {
                return true;
            }
        } catch (Exception e) {
            // passive ACK
            Log.d(TAG, "sectorSelect caught exception, but succeeded anyway");
            return true;
        }
    }
}

...

/*
 *  Read section names from EEPROM and put them into the data model
 */
public static boolean readSectionNames(@NonNull Ve95_DataModel ve95DataModel,
                                       @NonNull NtagHandler ntagHandler)
{
    try {
        Log.d(TAG, "Reading section names");
        boolean retVal = ntagHandler.sectorSelect((byte) 1);
        Log.d(TAG, String.format("sectorSelect returned %b", retVal));
        byte[] data = ntagHandler.fastRead((byte) BASE_ADDRESS_SECTION_NAMES, (byte) 0x2C);
        Log.d(TAG, Utils.bytesToHex(data));
        byte[] subArray;
        int size = 16;
        for(int i=0; i < 20; i++) {
            subArray = Arrays.copyOfRange(data, i * size, (i+1) * size);
            String name = new String(subArray, StandardCharsets.UTF_8);
            ve95DataModel.setSectionName(i, name);
            Log.d(TAG, String.format("section %d name %s", i, name));
        }
        return true;
    } catch (IOException e) {
        return false;
    }
}

Я получаюэтот результат, но из данных я вижу, что сектор по-прежнему равен нулю и не был изменен на первый сектор.

D / Ve95_DataModelHandler: чтение имен разделов

D /: sectorSelect перехватилисключение, но все равно удалось

D / Ve95_DataModelHandler: sectorSelect вернул true

D / Ve95_DataModelHandler: 04, B2,87, CA, D4,64,80,00,44,00,00,00,00 ....

Кто-нибудь знает, как изменить сектор?

С уважением

Хенрик

1 Ответ

0 голосов
/ 14 октября 2019

Решили сами. Чип 1K был установлен вместо чипа 2K. Не удивительно, что это не сработало:)

...