NXP JN5168/JN5169 JN5168/9是NXP推出的zigbee芯片, EEPROM片內(nèi)EEPROM有4KB,并按64字節(jié)分段,共64段。擦除中按段擦除。每個(gè)bit擦除后數(shù)據(jù)為全零,可編程由0改寫(xiě)為1。EEPROM的API函數(shù)使用(參考JN-UG-3087 17.EEPROM): - 初始化:u16AHI_InitialiseEEP() 初始化時(shí)調(diào)用,必須在讀寫(xiě)之前調(diào)用
- 寫(xiě)操作:iAHI_WriteDataIntoEEPROMsegment(),可對(duì)隨機(jī)地址進(jìn)行寫(xiě)操作,但只能從0改寫(xiě)為1
- 讀操作:iAHI_ReadDataFromEEPROMsegment(),可隨機(jī)讀取,但是智能在段內(nèi)讀取,起始地址+長(zhǎng)度超過(guò)段的總長(zhǎng)時(shí)將會(huì)抱錯(cuò)。
- 擦除段:iAHI_EraseEEPROMsegment()
除EEPROM直接讀寫(xiě)外,NXP還提供了PDM支持,可像訪問(wèn)文件系統(tǒng)一樣訪問(wèn)EEPROM,對(duì)存儲(chǔ)空間的管理有PDM進(jìn)行管理。用戶層可只接進(jìn)行簡(jiǎn)單的讀、寫(xiě)、刪除操作。 PDM(Persistent Data Manager)NXP提供的PDM功能支持片外SPI Flash和片上EEPROM,此處說(shuō)明的是片上的EEPROM。參考JN-UG-3075 第四章,第三章介紹片外Flash。
主要的API接口函數(shù): - PDM_eInitialise():初始化函數(shù),一般使用PDM_eInitialise(63);
初始化- CFLAGS += -DPDM_NO_RTOS:使用IEEE802.15.4 SDK(如JN-SW-4163)時(shí),需要在Makefile中增加此宏定義。此模式下不支持互斥。
- 使用JenNet-IP SDK(如JN-SW-41645)時(shí),不需要修改Makefile,PDM默認(rèn)的是此模式,此模式下支持互斥。初始化函數(shù)PDM_eInitialise需要增加互斥參數(shù)
數(shù)據(jù)管理數(shù)據(jù)在EEPROM中的存儲(chǔ)是按段為單位的,即最小的存儲(chǔ)單元是64字節(jié),即便只存儲(chǔ)了1個(gè)字節(jié),數(shù)據(jù)存儲(chǔ)超出當(dāng)前段,將使用另一個(gè)段。每個(gè)段中的64字節(jié)中有效存儲(chǔ)空間為56字節(jié),另外的8個(gè)字節(jié)由PDM使用。并且PDM中對(duì)每條記錄的訪問(wèn)是按ID進(jìn)行的,類(lèi)似于文件名。 - 按ID進(jìn)行存儲(chǔ)操作
- 每條存儲(chǔ)占用的空間為56字節(jié)的整數(shù)倍(實(shí)際上是64字節(jié),有效字節(jié)數(shù)是56)
- 參考DEMO中的ID定義在PDM_IDs.h中
協(xié)議棧通PDM進(jìn)行的數(shù)據(jù)存儲(chǔ)由協(xié)議棧自動(dòng)完成存儲(chǔ)、更新。
可存儲(chǔ)內(nèi)容包含,但不限于:- Application layer data:
AIB members, such as the EPID and ZDO state
Group Address table
Binding table
Application key-pair descriptor
Trust Centre device table - Network layer data:
NIB members, such as PAN ID and radio channel
Neighbour table
Network keys
Address Map table
存儲(chǔ)API: PDM_eSaveRecordData()
數(shù)據(jù)的存儲(chǔ)過(guò)程是把待存儲(chǔ)的數(shù)據(jù)先存儲(chǔ)到空閑的空間中,然后再回收原來(lái)的存儲(chǔ)空間,因此寫(xiě)數(shù)據(jù)之前最好檢查當(dāng)前空閑段是否夠用。API函數(shù)為PDM_u8GetSegmentCapacity() 讀取API: PDM_eReadDataFromRecord()
讀之前可判斷數(shù)據(jù)是存在,API函數(shù)PDM_bDoesDataExist(),返回?cái)?shù)據(jù)長(zhǎng)度 刪除API: PDM_eDeleteData() 計(jì)數(shù)器一個(gè)計(jì)數(shù)器占用1個(gè)段,即64字節(jié)。包含起始值(Start Value)和增量值(Incremental Value)。當(dāng)前值=起始值+增量值。為了均衡EEPROM的擦除次數(shù),段內(nèi)的每個(gè)空余字節(jié)的每個(gè)位代表1,即每增加一次段中將會(huì)把下一個(gè)空閑位寫(xiě)1,當(dāng)寫(xiě)到字段末尾時(shí),將自動(dòng)切換到下一個(gè)段重新開(kāi)始,即起始值=上一段的起始值+增量值的和,增量值被重新賦值為0。舊的段內(nèi)的數(shù)據(jù)會(huì)由PDM進(jìn)行回收
API: - 創(chuàng)建:PDM_eCreateBitmap(),同樣創(chuàng)建時(shí)需要一個(gè)16位的ID
- 增加:PDM_eIncrementBitmap(),超出當(dāng)前段時(shí)會(huì)自動(dòng)切換到新的段中
- 讀值:PDM_eGetBitmap(),返回當(dāng)前段的起始值與增量值的和
- 刪除:PDM_eDeleteBitmap(),會(huì)擦除當(dāng)前段和歷史段
關(guān)于PDM的自動(dòng)回收問(wèn)題并沒(méi)有找到確切的說(shuō)明,算是猜測(cè)。不過(guò)如果不回收,豈不是會(huì)很快就填滿PDM,這樣的bug就好呵呵了。 擦寫(xiě)均衡每個(gè)段有個(gè)擦除次數(shù)記錄,PDM使用時(shí)會(huì)優(yōu)先找值低的段,以均衡各段的擦寫(xiě)次數(shù)。 現(xiàn)貨供應(yīng) 馬工 13823683914 qq 2355573217
|