0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

基于瑞芯微RK2206芯片+Harmony LiteOS操作系统的NFC控制案例

电子发烧友开源社区 来源:HarmonyOS官方合作社区 作者:HarmonyOS官方合作社 2022-04-21 08:47 次阅读

一、简介

NFC英文全称Near Field Communication,近距离无线通信。是由飞利浦公司发起,由诺基亚、索尼等著名厂商联合主推的一项无线技术。NFC由非接触式射频识别(RFID)及互联互通技术整合演变而来,在单一芯片上结合感应式读卡器、感应式卡片和点对点的功能,能在短距离内与兼容设备进行识别和数据交换。这项技术最初只是RFID技术和网络技术的简单合并,现在已经演变成一种短距离无线通信技术,发展态势相当迅速。与RFID不同的是,NFC具有双向连接和识别的特点,工作于13.56MHz频率范围,作用距离10厘米左右。NFC技术在ISO 18092、ECMA 340和ETSI TS 102 190框架下推动标准化,同时也兼容应用广泛的ISO 14443 Type-A、B以及Felica标准非接触式智能卡的基础架构。

NFC芯片装在手机上,手机就可以实现小额电子支付和读取其他NFC设备或标签信息。NFC的短距离交互大大简化整个认证识别过程,使电子设备间互相访问更直接、更安全和更清楚。通过NFC,电脑数码相机、手机、PDA等多个设备之间可以很方便快捷地进行无线连接,进而实现数据交换和服务。

本文基于瑞芯微RK2206芯片 + Harmony LiteOS操作系统,通过i2c总线控制NFC,实现手机和开发板的互相通信功能。

4dcd2f28-c10b-11ec-bce3-dac502259ad0.png

二、硬件电路设计

模块整体硬件电路如下图所示,电路中包含了NFC。电路比较简单,这边不对电路进行说明。

4e34570c-c10b-11ec-bce3-dac502259ad0.png

图1硬件电路图

三、程序设计

NFC是一种近距离无线通讯技术,使用NFC技术的设备(如智能手机)可以在彼此靠近的情况下进行数据交换,是通过在单一芯片上集成感应式读卡器、感应式卡片和点对点通信的功能,利用移动终端实现移动支付、门禁、移动身份识别等。

与以往设备配网技术相比,NFC"碰一碰"方案可以支持NFC功能的安卓手机iOS 13.0以上系统的iPhone使用,为消费客户提供高效便捷的智慧生活无缝体验。

1、主程序设计

如图所示为NFC碰一碰主程序流程图,开机LiteOS系统初始化后,进入主程序后先初始化I2C总线,然后控制I2C总线往NFC写入一段文本信息和一段网址信息,最后拿支持NFC功能的安卓手机或iOS 13.0以上系统的iPhone靠近小凌派-RK2206开发板,就可以识别出一段文本信息和一个网址。

4e4c3246-c10b-11ec-bce3-dac502259ad0.png

图2主程序流程图

void nfc_process(void){  unsigned int ret = 0;
  /* 初始化NFC设备 */nfc_init();
  ret = nfc_store_text(NDEFFirstPos, (uint8_t *)TEXT);  if (ret != 1) {    printf("NFC Write Text Failed: %d
", ret);}
  ret = nfc_store_uri_http(NDEFLastPos, (uint8_t *)WEB);  if (ret != 1) {    printf("NFC Write Url Failed: %d
", ret);  }    while (1) {    printf("==============NFC Example==============
");    printf("Please use the mobile phone with NFC function close to the development board!
");    printf("

");    LOS_Msleep(1000);  }}

(左右移动查看全部内容)

2、NFC初始化程序设计

NFC碰一碰初始化主要包括I2C总线初始化。

/* NFC使用i2c的总线ID */static unsigned int NFC_I2C_PORT = 2;
/* i2c配置 */static I2cBusIo m_i2c2m0 ={  .scl = {.gpio = GPIO0_PD6, .func = MUX_FUNC1, .type = PULL_NONE, .drv = DRIVE_KEEP, .dir = LZGPIO_DIR_KEEP, .val = LZGPIO_LEVEL_KEEP},  .sda = {.gpio = GPIO0_PD5, .func = MUX_FUNC1, .type = PULL_NONE, .drv = DRIVE_KEEP, .dir = LZGPIO_DIR_KEEP, .val = LZGPIO_LEVEL_KEEP},  .id = FUNC_ID_I2C2,  .mode = FUNC_MODE_M0,};/* i2c的时钟频率 */static unsigned int m_i2c2_freq = 400000;
unsigned int NT3HI2cInit(){  uint32_t *pGrf = (uint32_t *)0x41050000U;  uint32_t ulValue;    ulValue = pGrf[7];  ulValue &= ~((0x7 << 8) | (0x7 << 4));  ulValue |= ((0x1 << 8) | (0x1 << 4));  pGrf[7] = ulValue | (0xFFFF << 16);  printf("%s, %d: GRF_GPIO0D_IOMUX_H(0x%x) = 0x%x
", __func__, __LINE__, &pGrf[7], pGrf[7]);    if (I2cIoInit(m_i2c2m0) != LZ_HARDWARE_SUCCESS)  {    printf("%s, %s, %d: I2cIoInit failed!
", __FILE__, __func__, __LINE__);    return __LINE__;  }  if (LzI2cInit(NFC_I2C_PORT, m_i2c2_freq) != LZ_HARDWARE_SUCCESS)  {    printf("%s, %s, %d: LzI2cInit failed!
", __FILE__, __func__, __LINE__);    return __LINE__;  }    return 0;}
unsigned int nfc_init(void){  unsigned int ret = 0;  uint32_t *pGrf = (uint32_t *)0x41050000U;  uint32_t ulValue;    if (m_nfc_is_init == 1)  {    printf("%s, %s, %d: Nfc readly init!
", __FILE__, __func__, __LINE__);    return __LINE__;  }    ret = NT3HI2cInit();  if (ret != 0)  {    printf("%s, %s, %d: NT3HI2cInit failed!
", __FILE__, __func__, __LINE__);    return __LINE__;  }    m_nfc_is_init = 1;  return 0;}

(左右移动查看全部内容)

3、NFC写入信息程序设计

向NFC芯片写入数据,但需要写入2个记录时,第2个记录的位置需要用 NDEFLastPos 来定义;当需要写入3个记录时,第2个和第3个记录的位置分别需要用 NDEFMiddlePos 和 NDEFLastPos 来定义。

4e60661c-c10b-11ec-bce3-dac502259ad0.png

图3NDEF协议格式图

ret = nfc_store_text(NDEFFirstPos, (uint8_t *)TEXT);if (ret != 1) {   printf("NFC Write Text Failed: %d
", ret);}
ret = nfc_store_uri_http(NDEFLastPos, (uint8_t *)WEB);if (ret != 1) {  printf("NFC Write Url Failed: %d
", ret);}

(左右移动查看全部内容)

其中,nfc_store_text()和nfc_store_uri_http()两个函数首先按照rtdText.h和rtdUri.h中RTD协议进行处理。然后与ndef.h中NT3HwriteRecord()进行记录写入。

bool nfc_store_text(RecordPosEnu position, uint8_t *text){  NDEFDataStr data;    if (m_nfc_is_init == 0)  {    printf("%s, %s, %d: NFC is not init!
", __FILE__, __func__, __LINE__);    return 0;  }    prepareText(&data, position, text);  return NT3HwriteRecord(&data);}
bool nfc_store_uri_http(RecordPosEnu position, uint8_t *http){  NDEFDataStr data;    if (m_nfc_is_init == 0)  {    printf("%s, %s, %d: NFC is not init!
", __FILE__, __func__, __LINE__);    return 0;  }    prepareUrihttp(&data, position, http);  return NT3HwriteRecord(&data);

(左右移动查看全部内容)

NT3HwriteRecord()则负责将需要下发的信息打包成NDEF协议报文,最后由I2C总线将NDEF协议报文发送给NFC设备。

bool NT3HwriteRecord(const NDEFDataStr *data){  uint8_t recordLength = 0, mbMe;  UncompletePageStr addPage;  addPage.page = 0;    // calculate the last used page  if (data->ndefPosition != NDEFFirstPos )  {    NT3HReadHeaderNfc(&recordLength, &mbMe);    addPage.page = (recordLength + sizeof(NDEFHeaderStr) + 1) / NFC_PAGE_SIZE;        //remove the NDEF_END_BYTE byte because it will overwrite by the new Record    addPage.usedBytes = (recordLength + sizeof(NDEFHeaderStr) + 1) % NFC_PAGE_SIZE - 1;  }    // call the appropriate function and consider the pointer  // within the NFC_PAGE_SIZE that need to be used  int16_t payloadPtr = addFunct[data->ndefPosition](&addPage, data, data->ndefPosition);  if (payloadPtr == -1)  {    errNo = NT3HERROR_TYPE_NOT_SUPPORTED;    return false;  }    return writeUserPayload(payloadPtr, data, &addPage);}

(左右移动查看全部内容)

四、编译过程

1、搭建和下载源代码

我已将OpenHarmony源代码上传到Gitee社区中,大家可以根据以下网址下载。

https://gitee.com/Lockzhiner-Electronics/lockzhiner-rk2206-openharmony3.0lts

注意:编译环境可根据以下网址来操作:

https://gitee.com/Lockzhiner-Electronics/lockzhiner-rk2206-openharmony3.0lts/blob/master/vendor/lockzhiner/rk2206/README_zh.md

2、打开sdk下面路径的文件

/vendor/lockzhiner/rk2206/samples/b2_nfc/nfc_example.c

注意:Gitee上的NFC控制案例为通用案例,请大家根据上述的需求修改相关源代码。

3、修改编译脚本

修改 vendor/lockzhiner/rk2206/sample 路径下 BUILD.gn 文件,指定 nfc_example 参与编译。

"./b2_nfc:nfc_example",

(左右移动查看全部内容)

修改 device/lockzhiner/rk2206/sdk_liteos 路径下 Makefile 文件,添加 -lnfc_example 参与编译。

hardware_LIBS = -lhal_iothardware -lhardware -lnfc_example

(左右移动查看全部内容)

4、编译固件

hb set -root .hb sethb build -f

(左右移动查看全部内容)

5、烧写固件

请参考Gitee网址的说明手册(“烧录打印”章节):

https://gitee.com/Lockzhiner-Electronics/lockzhiner-rk2206-openharmony3.0lts/blob/master/device/rockchip/README_zh.md

五、实验结果

程序编译烧写到开发板后,按下开发板的RESET按键,通过串口软件查看日志如下:

==============NFC Example==============Please use the mobile phone with NFC function close to the development board!==============NFC Example==============Please use the mobile phone with NFC function close to the development board!......

(左右移动查看全部内容)

原文标题:小凌派-RK2206开发板:NFC控制案例

文章出处:【微信公众号:HarmonyOS官方合作社区】欢迎添加关注!文章转载请注明出处。

审核编辑:汤梓红
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 操作系统
    +关注

    关注

    37

    文章

    6672

    浏览量

    123125
  • nfc
    nfc
    +关注

    关注

    59

    文章

    1616

    浏览量

    180282
  • 瑞芯微
    +关注

    关注

    23

    文章

    393

    浏览量

    51190
  • RK2206
    +关注

    关注

    0

    文章

    34

    浏览量

    1755

原文标题:小凌派-RK2206开发板:NFC控制案例

文章出处:【微信号:HarmonyOS_Community,微信公众号:电子发烧友开源社区】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    首发!成功移植OpenHarmony到RK2206开发板,2022年2月即将开源~

    【直播报名】移植OpenHarmony轻量系统到龙芯1c300芯片经过三周的时间,我们成功将OpenHarmony 1.1.2版本移植到
    发表于 12-15 18:30

    小凌派-RK2206开发板:NFC控制案例

    数据交换和服务。本文基于RK2206芯片 + 鸿蒙LiteOS
    发表于 04-19 15:52

    轻量系统开发套件介绍:凌睿智捷 | 小凌派-RK2206 开发板套件

    凌睿智捷 | 小凌派-RK2206 开发板套件是由福州市凌睿智捷电子有限公司出品,主控器为高性能、高性价比的RK2206
    发表于 04-21 13:39

    RK2206开发板搭载OpenHarmony操作系统简介

    1、小凌派-RK2206开发板简介小凌派-RK2206开发板主控器为高性能、高性价比的RK2206
    发表于 07-28 17:28

    将OpenHarmony1.1.2版本移植到RK2206开发板上介绍

    芯片推出的一种低功耗、高集成的MCU无线局域网处理器,它可以应用在不同的应用领域,如物联网、可穿戴设备、家庭自动化、云连接等。RK2206
    发表于 08-23 18:11

    基于RK2206开发板实现一种智慧车载模块的设计

    警示系统(LWDS)、前方碰撞预警系统(FCWS)及后方碰撞预警系统等智慧车(Smart Car)相关应用。  本文基于
    发表于 09-06 18:13

    RK2206开发板搭载OpenHarmony操作系统

    凌智RK2206开发板简介凌智RK2206开发板是由福州市凌睿智捷电子有限公司出品,主控器为高性能、高性价比的
    发表于 09-07 17:15

    基于小凌派RK2206的智能电子宠物

    、项目总结和展望 本项目设计硬件选用小凌派开发板搭载低功耗、高集成的无线局域网处理器RK2206,搭载OpenHarmony操作系统
    发表于 01-19 12:48

    【新书推荐】《OpenHarmony嵌入式系统原理与应用--基于RK2206芯片(课视频版)》

    。OpenHarmony可以基于同-·套系统能力,适配多种终端形态,是一款面向未来、面向全场景的分布式操作系统。本书以 OpenHarmony 为主题,详细讲解了基于
    发表于 03-23 18:30

    已结束-【书籍评测活动NO.12】 OpenHarmony嵌入式系统原理与应用——基于RK2206芯片课视频版)

    。OpenHarmony可以基于同一套系统,适配多种终端形态,是一款面向未来、面向全场景的分布式操作系统,未来前景可期。本书选择OpenHarmony为主题,详细讲解基于
    发表于 05-08 15:51

    《OpenHarmony嵌入式系统原理与应用——基于RK2206芯片课视频版)》学习记录之一

    非常感谢电子发烧友论坛提供这次《《OpenHarmony嵌入式系统原理与应用——基于RK2206芯片课视频版)》学习机会。 下面记录一下书中实验需要注意的一些细节。 1、安装hb后
    发表于 06-15 14:10

    首发!成功移植鸿蒙到RK2206开发板,代码即将开源~

    经过三周的时间,我们成功将OpenHarmony 1.1.2版本移植到RK2206开发板上,板载芯片
    发表于 12-15 18:21 3959次阅读
    首发!成功移植鸿蒙到<b class='flag-5'>瑞</b><b class='flag-5'>芯</b><b class='flag-5'>微</b><b class='flag-5'>RK2206</b>开发板,代码即将开源~

    基于小凌派RK2206开发板所制作的简易示波器

    RK2206开发板而做的简易示波器开发。 本开发以RK2206芯片 + OpenHarmo
    的头像 发表于 05-06 17:09 1726次阅读
    基于小凌派<b class='flag-5'>RK2206</b>开发板所制作的简易示波器

    首发!成功移植OpenHarmony到RK2206开发板,2022年2月即将开源~

    经过三周的时间,我们成功将OpenHarmony 1.1.2版本移植到RK2206开发板上,板载芯片
    的头像 发表于 04-11 14:05 2198次阅读
    首发!成功移植OpenHarmony到<b class='flag-5'>瑞</b><b class='flag-5'>芯</b><b class='flag-5'>微</b><b class='flag-5'>RK2206</b>开发板,2022年2月即将开源~

    小凌派-RK2206开发板:UART控制案例

    通信与并行通信之间加以转换。作为把并行输入信号转成串行输出信号的芯片,UART通常被集成于其他通讯接口的连结上。本文基于RK2206
    的头像 发表于 06-14 11:12 960次阅读
    小凌派-<b class='flag-5'>RK2206</b>开发板:UART<b class='flag-5'>控制</b>案例