1. 环境简介

- MCU:					STM32F103C8T6
- NFC Reader IC:		CRLC663  
- 编译 IDE:				keil5
- Reader Library 版本号:	v05.22.00

2. NFC SDK 介绍

2.1 SDK 目录结构

NFC listen 与 poll 模式_单片机

2.2 NFC Reader Library 分层介绍

NXP SDK 主要由 DAL、NFC Reader Library、OSAL 以及通用组件组成。LayerModel 如下图所示。

  • DAL:Driver Abstraction Layer,驱动抽象层。细分为 DAL 和 BAL。

DAL:主要实现 GPIO 操作接口。设置 GPIO 方向、值、中断状态,读取 GPIO 电平,开启和停止定时器。需修改或实现。
BAL:Bus Abstraction Layer ,总线抽象层。主要实现 SPI 总线、I2C 总线的数据传输。需修改或实现。

  • OSAL:Operating System Abstraction Layer,操作系统抽象层。主要是线程、事件、调度器等接口。一般情况不用修改。
  • NFC Reader Library:NFC协议栈,提供寻卡、读卡、写卡等接口。一般情况不用修改。

NFC listen 与 poll 模式_宏定义_02

3. 建立 STM32 工程

建立STM32工程,按原理图配置好所需的 SPI 管脚和其他外设管脚。确保可烧录正常运行。可以使用 STM32CubeMX 创建工程。

4. 移植Reader Library

假设使用的协议是 15693 协议。在 NXP SDK 的示例中找到 NfcrdlibEx5_ISO15693 文件夹。

  1. 将 NfcrdlibEx5_ISO15693.c 导入工程。

把 NfcrdlibEx5_ISO15693.c 的main() 封装成接口,并在 STM32 工程的 main() 中调用。在 keil5 编译环境中添加宏:

  • PHDRIVER_PIRC663_BOARD
  • NXPBUILD__PHHAL_HW_RC663
  • PH_OSAL_NULLOS
  1. 编译。

会报缺少文件的错误。按错误提示导入 NxpNfcRdLib 文件夹的源代码,解决相关编译错误。

  1. 再导入 phOsal 文件夹的源代码,解决相关编译错误。
  2. 此时还有 phDriver 和 phbalReg 开头的函数找不到定义。
  3. 解决 phbalReg 相关编译问题

DAL文件夹下 的 src文件夹,包含有四款不同板子、不同系统的 DAL 接口。可以参考。
需要实现 phbalReg_Init() 和 phbalReg_Exchange() 。
phbalReg_Init() 主要实现 SPI 管脚初始化。phbalReg_Exchange() 实现 SPI 读写寄存器操作。

  1. 解决 phDriver 编译问题
phDriver 主要是 GPIO 配置、控制、读取、清除中断等操作。因为使用了 STM32,需要用 STM32 的接口实现 GPIO 控制。
phDriver_PinWrite():在 phhalHw_Rc663_WriteSSEL() 调用,SPI 总线通讯前后对片选CS管脚的控制
phDriver_PinConfig():在 phhalHw_Rc663_Init() 调用,配置 MCU 用的复位脚为输出模式
phDriver_TimerStart():在 phhalHw_Rc663_Reset() 调用,相当于 delay() 用法
phDriver_PinClearIntStatus():在 CLIF_IRQHandler() 调用,清除中断标志
phDriver_PinRead():在 CLIF_IRQHandler() 调用,为了清除中断标志

NFC listen 与 poll 模式_宏定义_03

  1. keil5 工程目录结构

5. 参考

宏定义参考了其他网友的经验:
1. RC663 基于NXP NFC reader 读取

6. 结语

刚接触 NXP NFC Reader Library ,看到那么多文件,头都晕了,不知道从哪下手。然后从 CSDN 上下载其他 CRLC663和STM32 的工程,对比工程,列出函数调用关系,梳理流程。慢慢发现 NFC Reader Library、OSAL 是公用代码,一般情况下不用修改,需要改动的是 DAL,不同的 MCU 实现的 DAL 不同。
而且 SDK 里面用不同的宏定义,区分不同操作系统和板子的实现流程,建议用keil5 浏览代码,了解哪些代码参与编译。
因为各种各样原因,没有完全解决编译问题,停在了 phDriver 编译问题上,至于解决了phDriver 编译问题后,还有没有其他编译问题,或者能否实现读卡操作,还不清楚,特写此文记录。