一、簡(jiǎn)介
NFC英文全稱(chēng)Near Field Communication,近距離無(wú)線通信。是由飛利浦公司發(fā)起,由諾基亞、索尼等著名廠商聯(lián)合主推的一項(xiàng)無(wú)線技術(shù)。NFC由非接觸式射頻識(shí)別(RFID)及互聯(lián)互通技術(shù)整合演變而來(lái),在單一芯片上結(jié)合感應(yīng)式讀卡器、感應(yīng)式卡片和點(diǎn)對(duì)點(diǎn)的功能,能在短距離內(nèi)與兼容設(shè)備進(jìn)行識(shí)別和數(shù)據(jù)交換。這項(xiàng)技術(shù)最初只是RFID技術(shù)和網(wǎng)絡(luò)技術(shù)的簡(jiǎn)單合并,現(xiàn)在已經(jīng)演變成一種短距離無(wú)線通信技術(shù),發(fā)展態(tài)勢(shì)相當(dāng)迅速。與RFID不同的是,NFC具有雙向連接和識(shí)別的特點(diǎn),工作于13.56MHz頻率范圍,作用距離10厘米左右。NFC技術(shù)在ISO 18092、ECMA 340和ETSI TS 102 190框架下推動(dòng)標(biāo)準(zhǔn)化,同時(shí)也兼容應(yīng)用廣泛的ISO 14443 Type-A、B以及Felica標(biāo)準(zhǔn)非接觸式智能卡的基礎(chǔ)架構(gòu)。
NFC芯片裝在手機(jī)上,手機(jī)就可以實(shí)現(xiàn)小額電子支付和讀取其他NFC設(shè)備或標(biāo)簽的信息。NFC的短距離交互大大簡(jiǎn)化整個(gè)認(rèn)證識(shí)別過(guò)程,使電子設(shè)備間互相訪問(wèn)更直接、更安全和更清楚。通過(guò)NFC,電腦、數(shù)碼相機(jī)、手機(jī)、PDA等多個(gè)設(shè)備之間可以很方便快捷地進(jìn)行無(wú)線連接,進(jìn)而實(shí)現(xiàn)數(shù)據(jù)交換和服務(wù)。
本文基于瑞芯微RK2206芯片 + Harmony LiteOS操作系統(tǒng),通過(guò)i2c總線控制NFC,實(shí)現(xiàn)手機(jī)和開(kāi)發(fā)板的互相通信功能。
![4dcd2f28-c10b-11ec-bce3-dac502259ad0.png](https://file1.elecfans.com//web2/M00/95/36/wKgZomTm-QWAQB6WAA1vCvws4Aw574.png)
二、硬件電路設(shè)計(jì)
模塊整體硬件電路如下圖所示,電路中包含了NFC。電路比較簡(jiǎn)單,這邊不對(duì)電路進(jìn)行說(shuō)明。
![4e34570c-c10b-11ec-bce3-dac502259ad0.png](https://file1.elecfans.com//web2/M00/95/36/wKgZomTm-QaAN1XlAAB5fRA2brY972.png)
圖1硬件電路圖
三、程序設(shè)計(jì)
NFC是一種近距離無(wú)線通訊技術(shù),使用NFC技術(shù)的設(shè)備(如智能手機(jī))可以在彼此靠近的情況下進(jìn)行數(shù)據(jù)交換,是通過(guò)在單一芯片上集成感應(yīng)式讀卡器、感應(yīng)式卡片和點(diǎn)對(duì)點(diǎn)通信的功能,利用移動(dòng)終端實(shí)現(xiàn)移動(dòng)支付、門(mén)禁、移動(dòng)身份識(shí)別等。
與以往設(shè)備配網(wǎng)技術(shù)相比,NFC"碰一碰"方案可以支持NFC功能的安卓手機(jī)和iOS 13.0以上系統(tǒng)的iPhone使用,為消費(fèi)客戶(hù)提供高效便捷的智慧生活無(wú)縫體驗(yàn)。
1、主程序設(shè)計(jì)
如圖所示為NFC碰一碰主程序流程圖,開(kāi)機(jī)LiteOS系統(tǒng)初始化后,進(jìn)入主程序后先初始化I2C總線,然后控制I2C總線往NFC寫(xiě)入一段文本信息和一段網(wǎng)址信息,最后拿支持NFC功能的安卓手機(jī)或iOS 13.0以上系統(tǒng)的iPhone靠近小凌派-RK2206開(kāi)發(fā)板,就可以識(shí)別出一段文本信息和一個(gè)網(wǎng)址。
![4e4c3246-c10b-11ec-bce3-dac502259ad0.png](https://file1.elecfans.com//web2/M00/95/36/wKgZomTm-QaAcZE-AAAOcAUvErU505.png)
圖2主程序流程圖
void nfc_process(void)
{
unsigned int ret = 0;
/* 初始化NFC設(shè)備 */
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);
}
}
(左右移動(dòng)查看全部?jī)?nèi)容)
2、NFC初始化程序設(shè)計(jì)
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的時(shí)鐘頻率 */
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;
}
(左右移動(dòng)查看全部?jī)?nèi)容)
3、NFC寫(xiě)入信息程序設(shè)計(jì)
向NFC芯片寫(xiě)入數(shù)據(jù),但需要寫(xiě)入2個(gè)記錄時(shí),第2個(gè)記錄的位置需要用 NDEFLastPos 來(lái)定義;當(dāng)需要寫(xiě)入3個(gè)記錄時(shí),第2個(gè)和第3個(gè)記錄的位置分別需要用 NDEFMiddlePos 和 NDEFLastPos 來(lái)定義。
![4e60661c-c10b-11ec-bce3-dac502259ad0.png](https://file1.elecfans.com//web2/M00/95/36/wKgZomTm-QaAPjw9AADhi6HnG18971.png)
圖3NDEF協(xié)議格式圖
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);
}
(左右移動(dòng)查看全部?jī)?nèi)容)
其中,nfc_store_text()和nfc_store_uri_http()兩個(gè)函數(shù)首先按照rtdText.h和rtdUri.h中RTD協(xié)議進(jìn)行處理。然后與ndef.h中NT3HwriteRecord()進(jìn)行記錄寫(xiě)入。
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);
(左右移動(dòng)查看全部?jī)?nèi)容)
NT3HwriteRecord()則負(fù)責(zé)將需要下發(fā)的信息打包成NDEF協(xié)議報(bào)文,最后由I2C總線將NDEF協(xié)議報(bào)文發(fā)送給NFC設(shè)備。
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);
}
(左右移動(dòng)查看全部?jī)?nèi)容)
四、編譯過(guò)程
1、搭建和下載源代碼
我已將OpenHarmony源代碼上傳到Gitee社區(qū)中,大家可以根據(jù)以下網(wǎng)址下載。
https://gitee.com/Lockzhiner-Electronics/lockzhiner-rk2206-openharmony3.0lts
注意:編譯環(huán)境可根據(jù)以下網(wǎng)址來(lái)操作:
https://gitee.com/Lockzhiner-Electronics/lockzhiner-rk2206-openharmony3.0lts/blob/master/vendor/lockzhiner/rk2206/README_zh.md
2、打開(kāi)sdk下面路徑的文件
/vendor/lockzhiner/rk2206/samples/b2_nfc/nfc_example.c
注意:Gitee上的NFC控制案例為通用案例,請(qǐng)大家根據(jù)上述的需求修改相關(guān)源代碼。
3、修改編譯腳本
修改 vendor/lockzhiner/rk2206/sample 路徑下 BUILD.gn 文件,指定 nfc_example 參與編譯。
"./b2_nfc:nfc_example",
(左右移動(dòng)查看全部?jī)?nèi)容)
修改 device/lockzhiner/rk2206/sdk_liteos 路徑下 Makefile 文件,添加 -lnfc_example 參與編譯。
hardware_LIBS = -lhal_iothardware -lhardware -lnfc_example
(左右移動(dòng)查看全部?jī)?nèi)容)
4、編譯固件
hb set -root .
hb set
hb build -f
(左右移動(dòng)查看全部?jī)?nèi)容)
5、燒寫(xiě)固件
請(qǐng)參考Gitee網(wǎng)址的說(shuō)明手冊(cè)(“燒錄打印”章節(jié)):
https://gitee.com/Lockzhiner-Electronics/lockzhiner-rk2206-openharmony3.0lts/blob/master/device/rockchip/README_zh.md
五、實(shí)驗(yàn)結(jié)果
程序編譯燒寫(xiě)到開(kāi)發(fā)板后,按下開(kāi)發(fā)板的RESET按鍵,通過(guò)串口軟件查看日志如下:
==============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!
......
(左右移動(dòng)查看全部?jī)?nèi)容)
原文標(biāo)題:小凌派-RK2206開(kāi)發(fā)板:NFC控制案例
文章出處:【微信公眾號(hào):HarmonyOS官方合作社區(qū)】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。
-
操作系統(tǒng)
+關(guān)注
關(guān)注
37文章
6900瀏覽量
123810 -
nfc
+關(guān)注
關(guān)注
59文章
1633瀏覽量
181003 -
瑞芯微
+關(guān)注
關(guān)注
24文章
436瀏覽量
51566 -
RK2206
+關(guān)注
關(guān)注
0文章
34瀏覽量
1843
原文標(biāo)題:小凌派-RK2206開(kāi)發(fā)板:NFC控制案例
文章出處:【微信號(hào):HarmonyOS_Community,微信公眾號(hào):電子發(fā)燒友開(kāi)源社區(qū)】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
首發(fā)!成功移植OpenHarmony到瑞芯微RK2206開(kāi)發(fā)板,2022年2月即將開(kāi)源~
輕量系統(tǒng)開(kāi)發(fā)套件介紹:凌睿智捷 | 小凌派-RK2206 開(kāi)發(fā)板套件
RK2206開(kāi)發(fā)板搭載OpenHarmony操作系統(tǒng)簡(jiǎn)介
將OpenHarmony1.1.2版本移植到瑞芯微RK2206開(kāi)發(fā)板上介紹
基于RK2206開(kāi)發(fā)板實(shí)現(xiàn)一種智慧車(chē)載模塊的設(shè)計(jì)
RK2206開(kāi)發(fā)板搭載OpenHarmony操作系統(tǒng)
基于小凌派RK2206的智能電子寵物
【新書(shū)推薦】《OpenHarmony嵌入式系統(tǒng)原理與應(yīng)用--基于RK2206芯片(微課視頻版)》
已結(jié)束-【書(shū)籍評(píng)測(cè)活動(dòng)NO.12】 OpenHarmony嵌入式系統(tǒng)原理與應(yīng)用——基于RK2206芯片(微課視頻版)
《OpenHarmony嵌入式系統(tǒng)原理與應(yīng)用——基于RK2206芯片(微課視頻版)》學(xué)習(xí)記錄之一
首發(fā)!成功移植鴻蒙到瑞芯微RK2206開(kāi)發(fā)板,代碼即將開(kāi)源~
![首發(fā)!成功移植鴻蒙到<b class='flag-5'>瑞</b><b class='flag-5'>芯</b><b class='flag-5'>微</b><b class='flag-5'>RK2206</b>開(kāi)發(fā)板,代碼即將開(kāi)源~](https://file.elecfans.com/web2/M00/26/37/pYYBAGG5xumALekeAAVqf1_nqfU137.png)
基于小凌派RK2206開(kāi)發(fā)板所制作的簡(jiǎn)易示波器
![基于小凌派<b class='flag-5'>RK2206</b>開(kāi)發(fā)板所制作的簡(jiǎn)易示波器](https://file.elecfans.com//web2/M00/41/32/pYYBAGJ05dqAOJeBAAGBvZ-n1mA255.png)
首發(fā)!成功移植OpenHarmony到瑞芯微RK2206開(kāi)發(fā)板,2022年2月即將開(kāi)源~
![首發(fā)!成功移植OpenHarmony到<b class='flag-5'>瑞</b><b class='flag-5'>芯</b><b class='flag-5'>微</b><b class='flag-5'>RK2206</b>開(kāi)發(fā)板,2022年2月即將開(kāi)源~](https://file.elecfans.com/web2/M00/26/42/poYBAGG6oqmAb6VoAAFeEp4EtKg261.jpg)
小凌派-RK2206開(kāi)發(fā)板:UART控制案例
![小凌派-<b class='flag-5'>RK2206</b>開(kāi)發(fā)板:UART<b class='flag-5'>控制</b>案例](https://file.elecfans.com/web2/M00/26/21/pYYBAGG5jjSALfrEAAAwAa9Oig8799.png)
評(píng)論