ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

STM32 玩转 NT3H2211 NFC 标签|I2C 驱动 + NDEF 文本 / URI 记录完整实践

STM32 玩转 NT3H2211 NFC 标签|I2C 驱动 + NDEF 文本 / URI 记录完整实践 前言最近做了基于 STM32L431VC NT3H2211 的 NFC 近场通信实验踩了 I2C 时序、NDEF 数据格式、中文 UTF‑8 编码不少坑。NT3H2211 是一枚很有意思的 Type‑2 类型 NFC 标签芯片具备I2C、RF 射频双访问接口单片机可以通过 I2C 读写标签内存手机可以通过 13.56MHz 射频无线读写两套接口访问同一片存储区域。本篇把完整调试过程、原理、代码关键点、问题排查整理出来方便大家快速上手。硬件环境主控STM32L431VCNFC 芯片NT3H2211 扩展板通信接口硬件 I2C1PB6 (SCL)、PB7 (SDA)调试工具串口助手 SSCOM波特率 115200NFC 伴侣 APP一、NT3H2211 核心原理NT3H2211 内存按照16 字节一页进行管理主要分为制造数据区、用户数据区、配置区。I2C 从机地址固定为0x55。双界面机制STM32 通过 I2C 改写标签内容手机靠近产生 13.56MHz 射频场既可以给无源标签供电也能读写数据。两边可以修改同一套存储这也是本次实验一个很有意思的现象手机 APP 写入数据会覆盖单片机 I2C 写入的内容。NDEF 格式NFC 数据交换标准格式。一条 NDEF 消息由多条记录组成每条记录包含消息标志位、类型、负载长度、负载数据。常见两种记录Text 文本记录、URI 链接记录。Text 文本记录负载结构状态字节 语言码 实际文本状态字节标记编码方式UTF‑8/UTF‑16以及语言码的字节长度。中文必须使用 UTF‑8 编码一个汉字占 3 字节。二、硬件 I2C 引脚配置要点PB6、PB7 复用为 I2C1这里是很多人踩坑的地方。GPIO_InitStruct.Pin GPIO_PIN_6|GPIO_PIN_7; GPIO_InitStruct.Mode GPIO_MODE_AF_OD; // 复用开漏I2C必须开漏输出 GPIO_InitStruct.Pull GPIO_PULLUP; // 上拉电阻保证总线电平 GPIO_InitStruct.Alternate GPIO_AF4_I2C1; HAL_GPIO_Init(GPIOB, GPIO_InitStruct);⚠️重点I2C 要使用开漏模式不能推挽输出。开漏搭配上拉电阻实现 I2C 总线 “线与” 逻辑。本实验时序配置0x10909CEC对应标准 100kHz I2C 速率。三、软件实现流程整体业务流程I2C初始化 → 读取芯片制造数据 → 配置CC容器初始化标签 → 写入NDEF文本记录 → 写入NDEF URI记录 → I2C读取用户区数据串口打印 → 等待手机NFC读取1、标签初始化初始化 I2C 之后读取制造页修改 CCCapability Container容器参数标记这是一块支持 NDEF 的 NFC 标签写完之后回读校验保证配置生效。void NFC_Init(void) { uint8_t buf[NFC_PAGE_SIZE] {0}; MX_I2C1_Init(); NT3HReaddManufactoringData(buf); buf[0] 0xAA; buf[12] 0xE1; // NDEF标签标识 buf[13] 0x10; // 版本1.0 buf[14] 0x6D; // 内存页数 buf[15] 0x00; NT3HWriteInitData(buf); NT3HReaddManufactoringData(buf); //回读验证 }2、写入 NDEF 文本、URI 记录封装好storeText()写入文本记录storeUrihttp()写入 URI 链接记录。第一条文本记录设置 MB1消息开始最后一条 URI 记录设置 ME1消息结束ret storeText(NDEFFirstPos, (uint8_t *)Hello NFC); ret storeUrihttp(NDEFLastPos, (uint8_t *)123.com);文本记录内部会设置状态字节0x02代表 UTF‑8 编码语言码长度 2 字节语言码en。3、读取标签数据串口输出循环读取多页用户区内存拼接缓冲区后串口输出。这里会出现一个现象串口打印出现大量乱码。NT3HReadUserpages(15, data_buf); printf(\r\nreaddata:%s, data_buf);乱码原因NDEF 原始是二进制数据包含消息头、记录头这些非 ASCII 不可打印字节直接用%s字符串打印就会乱码。数据本身没有损坏改用十六进制打印%02X就可以看到完整原始字节流。4、手机端验证两种验证手段直接手机 NFC 感应标签读取 NDEF 文本使用 NFC 伴侣 APP通过射频接口直接向标签写入中文姓名。实验中发现手机 APP 写入的中文 “尹强” 直接覆盖掉 STM32 通过 I2C 写入的 Hello NFC完美印证 NT3H2211 双界面共享存储的特性。解析数据包可以看到中文每个汉字占 3 字节 UTF‑8 编码。四、踩坑问题记录I2C 连续读写出错NT3H2211 芯片对时序有要求连续 I2C 读写之间必须加 1ms 延时。代码读写函数加入HAL_Delay(1)解决连续访问异常。手机 NFC 识别不到标签NFC 有效距离很短一般 1‑4cm手机 NFC 感应区域要紧贴天线位置屏蔽罩附近感应效果最好。中文显示乱码NDEF 文本记录状态字节必须指明 UTF‑8 编码如果设置错误中文就会解析乱码。不要用推挽模式配置 I2C 引脚会造成总线冲突通信完全失败。五、拓展脑洞基于这套硬件还可以做很多有意思项目NFC 电子名片写入 vCard 格式手机一碰添加联系人NFC 配网把 WiFi 账号密码写入标签手机一碰完成配网简易 NFC 门禁将学号身份信息存入标签传感器数据实时写入 NFC手机靠近读取温湿度等环境数据。小结这次实验把 I2C 外设驱动、NDEF 协议栈、NFC 芯片双界面特性完整跑通。NFC 底层不复杂但协议细节很多尤其 NDEF 各个字段、文本负载格式很容易忽略。遇到串口乱码不要第一时间认为硬件读写失败优先打印十六进制原始数据排查。
返回列表