板载NFC芯片采用意法半导体ST25DV04KC,如电路图所示
NFC天线接法图:
以下在Debian 10 固件版本下进行测试.
要驱动NFC,首先需要刷新的Debian 11 固件版本,编译时间为20240402开始的版本,若您手头开发板固件版本比这个新可不升级.
固件下载链接:
链接:https://pan.baidu.com/s/1iDUcwrOWTxjCYM8zfLLzXw?pwd=1111
下载:R1-Debian11-nfc-20240402.img
刷固件请参考烧录系统部分(以EMMC存储为例):
http://wiki.youyeetoo.cn/zh/r1/burnemmc
开发板端控制NFC对应源码和使用
开发板在Debian 系统下开发,采用C/C++开发,在开发板内,直接搭建编译环境,流程如下:
$ sudo apt update
$ sudo apt install -y gcc
$ sudo apt install -y g++
$ sudo apt install -y aptitude
$ sudo aptitude install -y build-essential
友情提示:以上每个命令执行完后,需要检测提示信息,若软件源不稳定,会出现下载失败的错误提示,重新输入该命令,重新安装,直到没有错误提示为止.
开发板端NFC测试源码下载:
http://dd.youyeetoo.cn:5000/sharing/TfnCNWSfw
源码编译流程如下
#解压源码
$ unzip R13588S-nfc-debian.zip
#进入文件夹
$ cd R13588S-nfc-debian
#编译源码
$ make
#务必使用sudo 权限来执行程序,需要输入密码 youyeetoo
$ sudo ./test_nfc
#以下都是运行过程提示
echo: write error: Device or resource busy
[NfcIOBasic.cpp:42->initAll] D NFC_LINUX:initAll() 0,i2c_no==6,gpo_pin=131,gpiochip=-1
[St25dv_Gpo.cpp:245->st25dv_GPO_Init_SysClass] D NFC_LINUX:Warning: interrupt pin seems already eported
[NfcIOBasic.cpp:44->initAll] D NFC_LINUX:initAll() 1 St25dv_Gpo_Init==0
[NfcIOBasic.cpp:48->initAll] D NFC_LINUX:initAll() 2 set_St25dv_Gpo_interrupt_init==0
[NfcIOBasic.cpp:52->initAll] D NFC_LINUX:initAll() 3 Open_I2C(6)==0
[NfcIOBasic.cpp:63->initAll] D NFC_LINUX:initAll() 4==0
[St25dv_Gpo.cpp:55->callback_st25dv_GPO_pthread_func_SysClass] D NFC_LINUX:start callback_st25dv_GPO_pthread_func_SysClass() poll_fd.fd=5
Get_IDs():Get_IC_REF() ret=0
Get_IDs():Get_UID() ret=0
getUid() ret=0
nfc Get_UID=B9 CE D4 15 67 50 02 E0
nfc IC=ST25DV04KC-XX
input key: 0)exit app 1)write tag youyeetoo.cn 2)write tag start android WeChat 3)Send FTM data 4)Set RF ON 5)Set RF OFF
根据提示,看到 nfc Get_UID= 获取成功,说明驱动NFC芯片是成功,
然后按照提示,输入如下数字,实现测试:
0)退出程序
1)把www.youyeetoo.cn写标签
2)写标签:实现手机刷一下开发板天线,手机自启微信APP.
3)开发板发数据给手机
4)启用RF无线通道
5)关闭RF无线通道
开发板和手机之间FTM传输数据流程和协议如下:
1 发端-->接收端 发询问包
FE FE FE FE FLG1 00 00 00 14 L1 L2 L3 L4 FF FF FF FF 45 4E 44
其中
FLG1:表示数据发送方向,02开发板->手机,03:手机->开发板
L1 L2 L3 L4 :表示要发送指定的数据总长度(长度包括询问包所有长度+业务数据长度):L1长度的高位,L4是长度最低位,L2,L3依次类推
2 接收端--->发端 回应应答包
FE FE FE FE 04 00 00 00 14 FLG2 00 00 00 FF FF FF FF 45 4E 44
其中
FLG2:表示是否允许接受数据.E7表示允许接受,E9表示繁忙拒绝接受.
发端发数据流程:
1 发端先发询问包,询问目标是否可以接受指定长度数数据
2 若目标回应允许发送,进行步骤3,否则退出发送
3 数据分割拆包发送,知道发送完成.
接收端接收数据流程:
1 收到询问是否可以接受指定长度数据包,若允许发允许应答包给发,进入步骤2,否则发繁忙拒绝接受应答包给发端并结束接受.
2 等待并依次接受数据,直到接受到指定长度数据,组合成完整包.
由于代码比较多,这里不做展示,请下载源码进行查看和验证.
手机端NFC对应APP
手机APP参考意法半导体提供的开发库进行二次封装开发.
清空日志:清空上部分日志
发送:手机端向开发板发数据
填充数据:填充要发送数据
清空数据:清空要发送的数据
开发板和手机之间FTM传输数据流程和协议和上面开发板端相同.
由于代码比较多,这里不做展示,请下载源码进行查看和验证.
手机端APP和源码下载:
编译好的APK:
http://dd.youyeetoo.cn:5000/sharing/CHmL7XtOo
源码:
http://dd.youyeetoo.cn:5000/sharing/41oF789Vh