在线时间543 小时
UID1650185
注册时间2017-4-19
NXP金币98
TA的每日心情 | 怒 2021-1-28 20:09 |
|---|
签到天数: 317 天 连续签到: 1 天 [LV.8]以坛为家I
金牌会员
 
- 积分
- 9709
- 最后登录
- 2022-5-12
|
本帖最后由 小马哥-1650185 于 2018-7-2 18:04 编辑
这个帖子主要测试NFC 功能的读写数据。注本帖仅测试 NDEFT2T_RECORD_TYPE_TEXT 类型,其他类型方法一样。
测试APP为nxp官方的LPC8N04 NFC Demo:
com.nxp.lpc8nxxnfcdemo-v2.0.zip
(1.42 MB, 下载次数: 126)
下图是通过app写入一个字符串“大豆包吃了肚子疼。”
可以看到数据写入成功,这个字符串在lpc8n04里面存入eeprom。
然后通过NFC读取测试,首先要知道一点,lpc8n04初始化时候是先读取eeprom里面的字符串,然后在后面追加一个现显示温度的字符串。
demo里面显示的是华氏度,这里我转换成了摄氏度。读取信息如下图
后面为了方便测试,都是用英文字符串,中文字符在MDK的watch窗口里面显示乱码,不知道怎么调,试了gb2312,utf-8, ANsi 等 都是乱码,囧。。。。
首先来大概你分析下demo的代码吧,说实话 这个demo的代码风格写的很乱,看起来你很不舒服。。。
工程中有两个模块:
tmeas.c------是温度驱动
ndeft2t.c-----是nfc驱动
。。。。。。。。。。。。。。。
系统上电后先进性一系列的初始化,即Init();函数。
初始化时钟为2Mhz
- Chip_Clock_System_SetClockFreq(2 * 1000 * 1000);
复制代码
然后初始化 board,温度模块,nfc模块,eeprom模块,rtc的timer模块
- Board_Init();
- TMeas_Measure(TSEN_10BITS, TMEAS_FORMAT_FAHRENHEIT, false, 0 /* Value used in pp_TmeasCb*/);
- Chip_NFC_Init(LPC_NFC);
- NDEFT2T_Init();
- Chip_EEPROM_Init(LPC_EEPROM);
- Timer_Init();
复制代码
然后Creates an NDEF message. & Commits message by finalising the message header.
- NDEFT2T_CreateMessage(sNdefInstance, sData, sizeof(sData), true);
- NDEFT2T_CommitMessage(sNdefInstance);
复制代码
最后初始化led的io
- Chip_IOCON_SetPinConfig(LPC_IOCON, (IOCON_PIN_T)0, IOCON_FUNC_0 | IOCON_RMODE_INACT);
- Chip_IOCON_SetPinConfig(LPC_IOCON, (IOCON_PIN_T)1, IOCON_FUNC_0 | IOCON_RMODE_INACT);
- Chip_IOCON_SetPinConfig(LPC_IOCON, (IOCON_PIN_T)2, IOCON_FUNC_0 | IOCON_RMODE_INACT);
- Chip_IOCON_SetPinConfig(LPC_IOCON, (IOCON_PIN_T)3, IOCON_FUNC_0 | IOCON_RMODE_INACT);
- Chip_IOCON_SetPinConfig(LPC_IOCON, (IOCON_PIN_T)4, IOCON_FUNC_0 | IOCON_RMODE_INACT);
- Chip_IOCON_SetPinConfig(LPC_IOCON, (IOCON_PIN_T)5, IOCON_FUNC_0 | IOCON_RMODE_INACT);
- Chip_IOCON_SetPinConfig(LPC_IOCON, (IOCON_PIN_T)6, IOCON_FUNC_0 | IOCON_RMODE_INACT);
- Chip_IOCON_SetPinConfig(LPC_IOCON, (IOCON_PIN_T)7, IOCON_FUNC_0 | IOCON_RMODE_INACT);
- Chip_IOCON_SetPinConfig(LPC_IOCON, (IOCON_PIN_T)8, IOCON_FUNC_0 | IOCON_RMODE_INACT);
- Chip_IOCON_SetPinConfig(LPC_IOCON, (IOCON_PIN_T)9, IOCON_FUNC_0 | IOCON_RMODE_INACT);
- Chip_IOCON_SetPinConfig(LPC_IOCON, (IOCON_PIN_T)10, IOCON_FUNC_2 | IOCON_RMODE_PULLDOWN);
- Chip_IOCON_SetPinConfig(LPC_IOCON, (IOCON_PIN_T)11, IOCON_FUNC_2 | IOCON_RMODE_PULLDOWN);
- LPC_GPIO->DATA[0xFFF] = 0;
- LPC_GPIO->DIR = (LPC_GPIO->DIR & 0xFFF) | 0x3FF;
复制代码
static void DeInit(void)函数主要是 反初始化,用于系统进入sleep模式是 销毁之前初始化的的外设,节能。
初始化完成后,读取eeprom里面的数据到g_displayText 中,如果eeprom中没有数据,系统自动写入"The LPC Experience; Your World Reimagined"
由于之前通过NFC向板卡写入了Hello,world. 这里可以读出来。
然后初始化timer32_0,
然后到while循环,这个核我们之前见到的不一样- while (hostTicks < hostTimeout)
复制代码 系统设置100s 超时后,进入sleep模式。
未用手机NFC和 板卡交互之前,while里面的函数都是不执行的,此时程序在timer32_0的中断函数中执行流水灯和S2按键任务
- void CT32B0_IRQHandler(void)
复制代码
当手机NFC和 板卡交互时,触发NFC中断函数void NFC_IRQHandler(void);
在nfc中断函数中 有调用
- NDEFT2T_FIELD_STATUS_CB(true);
复制代码 通过以下宏关联到NDEFT2T_FieldStatus_Cb中
- #define NDEFT2T_FIELD_STATUS_CB NDEFT2T_FieldStatus_Cb
复制代码
在函数 void NDEFT2T_FieldStatus_Cb(bool status) 中nfcOn = true;
使while函数中的第一个if条件满足
- if(nfcOn && !displayInProgress)
复制代码 在这个函数里面执行eeprom读取,P7,P8,P9的io初始化,这里注意下,如果调试模式下,测试nfc,程序走到这里debug就会断掉,因为swd的 两个io口在这里被初始化为了普通的io口,所以建议调试时 关掉io初始化,如下图
在函数 startLEDDisplay(true);中刷新温度
并且让标志位displayInProgress 置true
- if(!displayInProgress) {
- displayInProgress = true;
复制代码
是while中的 if(displayInProgress && g_updateTemp) 条件满足,刷新温度,并把温度字符串保存到eeprom读取字符串的后面。
同时 static bool takeMemSemaphore(void) 获取信号ok
使下条件满足
- if(displayInProgress && !sTargetWritten && updateNFC && takeMemSemaphore())
复制代码
通过接口 static bool writeNFCDisplayMsg(char *str, uint32_t len),把g_displayText中的数据 通过nfc传输到手机。
仿真如下
手机收到的显示数据
读测试ok。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。
写数据:
nfc链接手机触发板卡的nfc中断,
在函数void NDEFT2T_MsgAvailable_Cb(void) 中 使能写标志
触发while的的条件
- if ((sTargetWritten) && takeMemSemaphore())
复制代码
写入数据Hello,world.,并保存到eeprom中。
手机端也提示 写入成功
恩,到这里基本上测试完了,最后再说一点,就是关于while的循环条件。
- while (hostTicks < hostTimeout)
复制代码 其中hostTimeout 初始化为0x64。
- <div>hostTimeout = FIRST_HOST_TIMEOUT;</div><div>#define FIRST_HOST_TIMEOUT 100</div>
复制代码
- <div> hostTimeout = HOST_TIMEOUT;</div><div>#define HOST_TIMEOUT 100</div>
复制代码
hostTicks 在rtc时钟计数下一秒累加
当hostTicks 加到100时,系统进入sleep模式。
然而没当有nfc交互是,这个计数是清零的,既能保证系统正常工作,又能达到节能的目的
Over。。。。。
|
评分
-
查看全部评分
|