最美情侣中文字幕电影,在线麻豆精品传媒,在线网站高清黄,久久黄色视频

歡迎光臨散文網 會員登陸 & 注冊

收藏!10分鐘學會鴻蒙NFC控制,學會就賺大了!

2022-05-31 11:30 作者:SPOTO思博  | 我要投稿

今天分享一個設備開發(fā)案例,廢話不多說,上實驗。

一、簡介
NFC英文全稱Near Field Communication,近距離無線通信。是由飛利浦公司發(fā)起,由諾基亞、索尼等著名廠商聯合主推的一項無線技術。
NFC由非接觸式射頻識別(RFID)及互聯互通技術整合演變而來,在單一芯片上結合感應式讀卡器、感應式卡片和點對點的功能,能在短距離內與兼容設備進行識別和數據交換。
這項技術最初只是RFID技術和網絡技術的簡單合并,現在已經演變成一種短距離無線通信技術,發(fā)展態(tài)勢相當迅速。
與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芯片 + 鴻蒙LiteOS操作系統,通過i2c總線控制NFC,實現手機和開發(fā)板的互相通信功能。



二、硬件電路設計
模塊整體硬件電路如下圖所示,電路中包含了NFC。電路比較簡單,這邊不對電路進行說明。


圖1 硬件電路圖
三、程序設計
NFC是一種近距離無線通訊技術,使用NFC技術的設備(如智能手機)可以在彼此靠近的情況下進行數據交換,是通過在單一芯片上集成感應式讀卡器、感應式卡片和點對點通信的功能,利用移動終端實現移動支付、門禁、移動身份識別等。
與以往設備配網技術相比,NFC"碰一碰"方案可以支持NFC功能的安卓手機和iOS 13.0以上系統的iPhone使用,為消費客戶提供高效便捷的智慧生活無縫體驗。
1、主程序設計
如圖所示為NFC碰一碰主程序流程圖,開機LiteOS系統初始化后,進入主程序后先初始化I2C總線,然后控制I2C總線往NFC寫入一段文本信息和一段網址信息,最后拿支持NFC功能的安卓手機或iOS 13.0以上系統的iPhone靠近小凌派-RK2206開發(fā)板,就可以識別出一段文本信息和一個網址。


圖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\n", ret);
}

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

while (1) {
printf("==============NFC Example==============\r\n");
printf("Please use the mobile phone with NFC function close to the development board!\r\n");
printf("\n\n");
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\n", __func__, __LINE__, &pGrf[7], pGrf[7]);

if (I2cIoInit(m_i2c2m0) != LZ_HARDWARE_SUCCESS)
{
printf("%s, %s, %d: I2cIoInit failed!\n", __FILE__, __func__, __LINE__);
return __LINE__;
}
if (LzI2cInit(NFC_I2C_PORT, m_i2c2_freq) != LZ_HARDWARE_SUCCESS)
{
printf("%s, %s, %d: LzI2cInit failed!\n", __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!\n", __FILE__, __func__, __LINE__);
return __LINE__;
}

ret = NT3HI2cInit();
if (ret != 0)
{
printf("%s, %s, %d: NT3HI2cInit failed!\n", __FILE__, __func__, __LINE__);
return __LINE__;
}

m_nfc_is_init = 1;
return 0;
}


3、NFC寫入信息程序設計
向NFC芯片寫入數據,但需要寫入2個記錄時,第2個記錄的位置需要用 NDEFLastPos 來定義;當需要寫入3個記錄時,第2個和第3個記錄的位置分別需要用 NDEFMiddlePos 和 NDEFLastPos 來定義。


圖3 NDEF協議格式圖
其中,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!\n", __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!\n", __FILE__, __func__, __LINE__);
return 0;
}

prepareUrihttp(&data, position, http);
return NT3HwriteRecord(&data);


NT3HwriteRecord()則負責將需要下發(fā)的信息打包成NDEF協議報文,最后由I2C總線將NDEF協議報文發(fā)送給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社區(qū)中,大家可以根據以下網址下載。https://gitee.com/Lockzhiner-Electronics/lockzhiner-rk2206-openharmony3.0lts
注意:編譯環(huán)境可根據以下網址來操作: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 set
hb build -f

5、燒寫固件
請參考Gitee網址的說明手冊(“燒錄打印”章節(jié)):https://gitee.com/Lockzhiner-Electronics/lockzhiner-rk2206-openharmony3.0lts/blob/master/device/rockchip/README_zh.md

五、實驗結果
程序編譯燒寫到開發(fā)板后,按下開發(fā)板的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!......

文章來源:部分內容綜合自網絡,梳理成文。因覺優(yōu)質,特此分享。

收藏!10分鐘學會鴻蒙NFC控制,學會就賺大了!的評論 (共 條)

分享到微博請遵守國家法律
昭平县| 会宁县| 沐川县| 孝昌县| 许昌县| 涞源县| 柳林县| 珠海市| 浙江省| 张家港市| 丹凤县| 泸州市| 绵阳市| 漳浦县| 新野县| 信阳市| 旬邑县| 加查县| 平昌县| 凌云县| 内黄县| 开阳县| 东兰县| 齐齐哈尔市| 新密市| 邳州市| 九台市| 云浮市| 闵行区| 中西区| 青海省| 丹东市| 南华县| 吉水县| 承德县| 龙南县| 普兰店市| 谢通门县| 车险| 嘉鱼县| 浦县|