基于FPAG的NFC Reader端(二)——ISO15693

协议简介

        ISO15693协议和ISO14443A/B协议是常见的三种通信协议,其中ISO15693协议的理论读写距离≤1m,ISO14443A/B协议的理论读写距≤10cm。当然,读写远距离换来的就是私密性的丧失和通信速率的降低。ISO15693协议的中文文档我放在文章最后。

Reader To Rag

1、调制方式

        调制频率:13.56MHZ

        采用 ASK 的调制原理,在 Reader   Tag 之间产生通信。使用两个调制指数, 10% 100% Tag 应对两者都能够解码。Reader  决定使用何种调制指数

2、数据编码方式

         ISO15693的数据编码方式的核心是位置编码,也就是“暂停”的位置。一个“暂停”利用100%的ASK调制的表示方式如下图:

        简单的看,就是一个持续时长为256/fC/2(约 9.44μs)的低脉冲。

(1)256取1

        一个单字节的值可以由一个“暂停"的位置表示。在256/fC(约18.88μs)的连续时间内256取1的“暂停”决定了字节的值。如果以一个低脉冲的持续时间(9.44us)为基本单位,则可以等效看作512个位置中一个低电平所在位置蕴涵着一个单字节信息。这种方式是以字节为单位进行传输的。例如:低电平出现在第一个位置传输8'b0000_0000;第三个位置传输8'b0000_0001,第五个位置传输8'b0000_0010.....依此类推。

        传输一个字节需要4.833ms(9.44*512),传输一个bit需要0.604125us(4.833us/8)数据速率是1.54 kbits/s。

        帧起始(SOF)表示如图:

        帧结束(EOF)表示如图:

(2)4取1

        使用4取1脉冲位置调制模式,“暂停”位置一次决定2个bit。4个连续的“位对”构成1个字节。

        对于一个字节,想先传输低位,再传输高位,例如传输8'b1110_0001:

         传输一个字节需要302.08(75.52us*4),一个bit需要37.76us(75.52us/2),传输速率26.48 kbits/s。

        帧(SOF)表示如图:

        帧结束(EOF)表示如图:

3、数据传输格式 

         通用请求格式:

Tag To Reader 

1、调制方式

        Tag端到Reader的调制采样副载波调制方式,所谓的副载波调制类似于二次调制。根据副载波的频率可以分为两类。

(1)单副载波频率fc/32(432.75kHZ)

        逻辑0:

        逻辑1:

        SOF: 

        EOF:

(2)双副载波调制频率fs1应为f/32(约423.75kH),频率fs2应为f/28(约484.28kHz)。

        逻辑0:

        逻辑1:

        SOF:

        EOF:

 2、数据传输格式

附件: 

        资源中

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
Android系统中可以使用NFC功能读取15693协议的标签数据,需要使用Android的NFC框架API。具体实现步骤如下: 1. 在AndroidManifest.xml文件中添加NFC权限声明: ``` <uses-permission android:name="android.permission.NFC" /> ``` 2. 在需要使用NFC功能的Activity中注册NFC事件: ``` private NfcAdapter nfcAdapter; private PendingIntent pendingIntent; private IntentFilter[] intentFiltersArray; private String[][] techListsArray; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); // 获取NFC适配器实例 nfcAdapter = NfcAdapter.getDefaultAdapter(this); // 创建PendingIntent对象,用于在标签靠近时启动Activity pendingIntent = PendingIntent.getActivity(this, 0, new Intent(this, getClass()).addFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP), 0); // 创建IntentFilter对象,用于过滤标签类型 IntentFilter ndefFilter = new IntentFilter(NfcAdapter.ACTION_TECH_DISCOVERED); try { ndefFilter.addDataType("*/*"); } catch (IntentFilter.MalformedMimeTypeException e) { throw new RuntimeException("MalformedMimeTypeException", e); } intentFiltersArray = new IntentFilter[] { ndefFilter }; // 创建TechLists对象,用于过滤标签协议 techListsArray = new String[][] { { NfcV.class.getName() } }; } @Override protected void onResume() { super.onResume(); if (nfcAdapter != null) { // 启用前台调度系统 nfcAdapter.enableForegroundDispatch(this, pendingIntent, intentFiltersArray, techListsArray); } } @Override protected void onPause() { super.onPause(); if (nfcAdapter != null) { // 停用前台调度系统 nfcAdapter.disableForegroundDispatch(this); } } @Override protected void onNewIntent(Intent intent) { super.onNewIntent(intent); if (NfcAdapter.ACTION_TECH_DISCOVERED.equals(intent.getAction())) { // 获取标签对象 Tag tag = intent.getParcelableExtra(NfcAdapter.EXTRA_TAG); if (tag != null) { // 获取NfcV标签对象 NfcV nfcvTag = NfcV.get(tag); if (nfcvTag != null) { try { // 连接NfcV标签 nfcvTag.connect(); byte[] cmd = new byte[] { (byte) 0x00, (byte) 0x20, (byte) 0x00, (byte) 0x00 }; byte[] response = nfcvTag.transceive(cmd); // 发送读取命令 // 处理读取到的数据 // ... } catch (IOException e) { e.printStackTrace(); } finally { try { // 断开NfcV标签连接 nfcvTag.close(); } catch (IOException e) { e.printStackTrace(); } } } } } } ``` 在onNewIntent()方法中,可以使用NfcV类的connect()方法连接15693协议标签,并使用transceive()方法发送读取命令,获取标签数据。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Crystal(mercy)

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值