Java 如何在NT3H2111 nfc芯片上选择扇区
我用安卓手机在NT3H2111 nfc芯片的EEPROM上读写数据 改变扇区的方法似乎是可行的,但从来没有少过,当我试图阅读内容时,扇区没有改变,它仍然在零扇区上Java 如何在NT3H2111 nfc芯片上选择扇区,java,android,nfc,Java,Android,Nfc,我用安卓手机在NT3H2111 nfc芯片的EEPROM上读写数据 改变扇区的方法似乎是可行的,但从来没有少过,当我试图阅读内容时,扇区没有改变,它仍然在零扇区上 @Override protected void onNewIntent(Intent intent) { try { Tag tag = intent.getParcelableExtra(NfcAdapter.EXTRA_TAG); ntagHandler = new NtagHandler
@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();
}
}
我得到了这个结果,但是从数据中我可以看到扇区仍然是零,并且没有被更改为扇区一
D/Ve95_DataModelHandler:读取节名称
D/:sectorSelect捕获异常,但仍然成功
D/Ve95_DataModelHandler:sectorSelect返回true
D/Ve95_数据模型处理程序:04、B2、87、CA、D4、64、80、00、44、00、00、00、00
有人知道如何改变这个行业吗
问候
亨里克自己解决了这个问题。安装了1K芯片,而不是2K芯片。难怪它不起作用:我自己解决了。安装了1K芯片,而不是2K芯片。难怪它不起作用:你好!select_扇区的具体功能是什么?我应该在读写操作之前选择_扇区吗?谢谢NT3H2211芯片具有2k内存。从NFC端,该EEPROM存储器以4字节块寻址,这意味着只有1K可寻址。因此,扇区选择用于选择2K内存的上限或下限1K:。请看第16页你好!select_扇区的具体功能是什么?我应该在读写操作之前选择_扇区吗?谢谢NT3H2211芯片具有2k内存。从NFC端,该EEPROM存储器以4字节块寻址,这意味着只有1K可寻址。因此,扇区选择用于选择2K内存的上限或下限1K:。请看第16页
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;
}
}