Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/flutter/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android TI RF430FRL152HEVM NFC NDEF格式_Android_Nfc_Ndef_Texas Instruments_Iso 15693 - Fatal编程技术网

Android TI RF430FRL152HEVM NFC NDEF格式

Android TI RF430FRL152HEVM NFC NDEF格式,android,nfc,ndef,texas-instruments,iso-15693,Android,Nfc,Ndef,Texas Instruments,Iso 15693,我们设计了一个基于TI RF430FRL152HEVM评估模块的板,具有NFC功能。当安卓手机靠近主板天线时,NFC允许处理器启动并开始读取数据。 它将读取的数据放入内存 然后,手机必须使用NFC(或者ISO 15693)从设备中获取这些数据 目前我们知道的唯一方法是将其写入标准NFC内存块 我们下载了一个名为NFC TagInfo的Android应用程序,这让我们可以扫描传感器并收集传感器内存中的所有数据,即所有数据块 我们正在将其写入芯片制造商所说的FRAM中的NDEF消息区域。我为另一个项

我们设计了一个基于TI RF430FRL152HEVM评估模块的板,具有NFC功能。当安卓手机靠近主板天线时,NFC允许处理器启动并开始读取数据。 它将读取的数据放入内存

然后,手机必须使用NFC(或者ISO 15693)从设备中获取这些数据

目前我们知道的唯一方法是将其写入标准NFC内存块

我们下载了一个名为NFC TagInfo的Android应用程序,这让我们可以扫描传感器并收集传感器内存中的所有数据,即所有数据块

我们正在将其写入芯片制造商所说的FRAM中的NDEF消息区域。我为另一个项目编写了一个读写器NFC应用程序,效果很好,但它拒绝读取这里的数据,尽管NFC TagInfo确实读取了数据

我们假设TI芯片是NDEF格式的,但我们找到的所有关于如何实现这一点的文档都非常不清楚。所以我们猜它不是

有人能解释一下如何正确准备存储内容,以便手机可以读取NDEF信息吗

补充资料 我们从块0开始将数据写入FRAM,并尝试模拟在包含非常简单NDEF消息的典型标记中看到的数据。例如,我们存储了消息“ABCD”,使用NFC标记信息,您可以在前几个块中看到:

04 5c d8 08 4a 62 3e 80 96 48 00 00 e1 10 12 00 01 03 a0 0c 34 03 21 d1 01 1d 54 02 65 6e 41 42 43 44 20 20 ... 然而,我似乎无法将TI芯片置于8字节块模式。似乎没有与此相关的控制寄存器

从我的低级观点来看,以4或8字节写入块不是问题,也就是说,我按字节顺序在FRAM内存中写入上述数据

当我运行NFC TagInfo时,它会执行两项操作,但不会检测到NDEF消息:

  • 它确实能正确地检测到油液,并且射频技术为5型(ISO 15693/附件)
  • 它也能正确读取块,在选择数据十六进制显示时,我能从块0开始精确地看到上面的数据
我已经参考了NFC标签类型5规范,我从

因此,我尝试从块0向标记中写入更多数据,以尝试模拟序列号、配置、应用程序区域颁发者块。然后我将NDEF消息ABCD放在以下部分之后:

01 02 03 04 05 06 07 08 //serial number 00 00 00 80 00 10 00 00 //configuration ... 01 02 03 04 05 06 07 08//序列号 00 00 80 00 10 00//配置 ... 我使用了NFC标记信息,但我也无法检测到NDEF消息。但是,使用数据十六进制显示,我可以验证数据是否如上所述正确读取

因此,我的问题是:

  • 是否配置了4字节或8字节块模式,以及该模式最有可能在何处定义?我可以在4字节块模式下工作吗
  • 标签5序列号是否相关?根据规范,似乎不会影响NDEF检查
  • TAG 5应用区域是否与发卡机构相关?似乎与NDEF验证无关
  • NDEF信息是否已放置在正确的区域
  • 对于16位值,是高字节低字节排序还是低字节高字节排序
  • 你知道怎么回事吗
补充资料3 事实证明,TI需要提供一个补丁,以使NDEF与该芯片(FRL152H)一起工作。基本上,该芯片设计用于通过NFC支持传感器功能的高级控制,使用内部固件应用程序。需要禁用此应用程序并更改某些设置

以下内存配置已证明有效:

Block 0: E1 40 79 00 Block 1: 03 0B D1 01 Block 2: 07 54 02 65 Block 3: 6e 41 42 43 Block 4: 44 FE 00 00 第0座:e1407900 第1区:03 0B D1 01 第二座:07540265 第3区:6e 41 42 43 第4区:44 FE 00 我们从另一个标记复制的NDEF格式是否对我们的标记无效? 这正是问题所在。查看内存转储的前12个字节,您显然从NXP NTAG203(或类似)复制了数据块,如制造商代码(字节0:
0x04
)和功能容器中的内存大小(字节13:
0x12
)所示。NXP的NTAG和MIFARE Ultralight系列遵循NFC Forum Type 2标签操作规范。但是,您的TI芯片(RF430FRL152H)基于ISO/IEC 15693,因此遵循NFC论坛类型5标签操作规范。标记操作规范定义了将NFC标记转换为NDEF标记的数据格式和命令集。由于NFC技术结合了几种不同的射频标准(ISO/IEC 14443、FeliCa、ISO/IEC 15693),并使用了NFC之前已经存在的标签硬件,因此有几种(目前有5种)不同的此类规范

为什么NFC TagInfo有时会看到块,然后在检测到NDEF时会看到页面?块和页是否相同? 在这种情况下,块和页是等效的。不同的措辞只是来自芯片制造商使用的术语。请注意,RF430FRL152H芯片使用术语“页面”对多个块进行分组,因此具有不同的含义

如果只是在正确的块中写入正确的字节,那么任何东西都可以作为NDEF提取,毕竟,在低级别上有什么区别? 区别在于您的TI RF430FRL152H标签芯片需要为NDEF内存区域使用与NXP标签不同的编码。这仅仅是因为它使用不同的低级通信技术(调制、编码、成帧、命令集),因此遵循不同的NFC论坛标签操作规范

为了使您的标签芯片成为NDEF标签,您需要从块0开始对NDEF内存区域使用以下编码:注意,功能容器中填充了假定块大小为8字节的值。您可以使用固件控制寄存器中的标志ISOBlockSize更改ISO块大小选项(请参阅中的第7.54节“固件系统控制寄存器”)< Block 0: E1 40 79 00 Block 1: 03 0B D1 01 Block 2: 07 54 02 65 Block 3: 6e 41 42 43 Block 4: 44 FE 00 00 E1 40 F2 09 03 0B D1 01 07 54 02 65 6E 41 42 43 44 FE 00 00 00 00 00 00
Tag tag = intent.getParcelableExtra(NfcAdapter.EXTRA_TAG);
NdefFormatable ndefFormatable = NdefFormatable.get(tag);

if (ndefFormatable != null) {
    try {
        ndefFormatable.connect();
        ndefFormatable.format(new NdefMessage(NdefRecord.createTextRecord("en", "ABCD")));
    } catch (Exception e) {
    } finally {
        try {
            ndefFormatable.close();
        } catch (Exception e) {
        }
    }
}
Tag tag = intent.getParcelableExtra(NfcAdapter.EXTRA_TAG);
NfcV nfcV = NfcV.get(tag);
nfcV.connect();
byte[] tagUid = tag.getId();  // store tag UID for use in addressed commands

int blockAddress = 0;
byte[] cmd = new byte[] {
    (byte)0x60,  // FLAGS
    (byte)0x20,  // READ_SINGLE_BLOCK
    0, 0, 0, 0, 0, 0, 0, 0,
    (byte)(blockAddress & 0x0ff)
};
System.arraycopy(tagUid, 0, cmd, 2, 8);

byte[] response = nfcV.transceive(cmd);

nfcV.close();