一、簡介
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,實現手機和開發板的互相通信功能。
模塊整體硬件電路如下圖所示,電路中包含了NFC。電路比較簡單,這邊不對電路進行說明。
圖1硬件電路圖
三、程序設計
NFC是一種近距離無線通訊技術,使用NFC技術的設備(如智能手機)可以在彼此靠近的情況下進行數據交換,是通過在單一芯片上集成感應式讀卡器、感應式卡片和點對點通信的功能,利用移動終端實現移動支付、門禁、移動身份識別等。
與以往設備配網技術相比,NFC"碰一碰"方案可以支持NFC功能的安卓手機和iOS 13.0以上系統的iPhone使用,為消費客戶提供高效便捷的智慧生活無縫體驗。
1、主程序設計
如圖所示為NFC碰一碰主程序流程圖,開機LiteOS系統初始化后,進入主程序后先初始化I2C總線,然后控制I2C總線往NFC寫入一段文本信息和一段網址信息,最后拿支持NFC功能的安卓手機或iOS 13.0以上系統的iPhone靠近小凌派-RK2206開發板,就可以識別出一段文本信息和一個網址。
圖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 來定義。
圖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 set
hb 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文章
6747瀏覽量
123201 -
nfc
+關注
關注
59文章
1617瀏覽量
180413 -
瑞芯微
+關注
關注
23文章
402瀏覽量
51263 -
RK2206
+關注
關注
0文章
34瀏覽量
1766
原文標題:小凌派-RK2206開發板:NFC控制案例
文章出處:【微信號:HarmonyOS_Community,微信公眾號:電子發燒友開源社區】歡迎添加關注!文章轉載請注明出處。
發布評論請先 登錄
相關推薦
評論