NXP JN5168/JN5169

JN5168/9是NXP推出的zigbee芯片,

EEPROM

片内EEPROM有4KB,并按64字节分段,共64段。擦除中按段擦除。每个bit擦除后数据为全零,可编程由0改写为1。EEPROM的API函数使用(参考JN-UG-3087 17.EEPROM):

  • 初始化:u16AHI_InitialiseEEP() 初始化时调用,必须在读写之前调用
  • 写操作:iAHI_WriteDataIntoEEPROMsegment(),可对随机地址进行写操作,但只能从0改写为1
  • 读操作:iAHI_ReadDataFromEEPROMsegment(),可随机读取,但是智能在段内读取,起始地址+长度超过段的总长时将会抱错。
  • 擦除段:iAHI_EraseEEPROMsegment()

除EEPROM直接读写外,NXP还提供了PDM支持,可像访问文件系统一样访问EEPROM,对存储空间的管理有PDM进行管理。用户层可只接进行简单的读、写、删除操作。

PDM(Persistent Data Manager)

NXP提供的PDM功能支持片外SPI Flash和片上EEPROM,此处说明的是片上的EEPROM。参考JN-UG-3075 第四章,第三章介绍片外Flash。
主要的API接口函数:

  • PDM_eInitialise():初始化函数,一般使用PDM_eInitialise(63);

初始化

  • CFLAGS += -DPDM_NO_RTOS:使用IEEE802.15.4 SDK(如JN-SW-4163)时,需要在Makefile中增加此宏定义。此模式下不支持互斥。
  • 使用JenNet-IP SDK(如JN-SW-41645)时,不需要修改Makefile,PDM默认的是此模式,此模式下支持互斥。初始化函数PDM_eInitialise需要增加互斥参数

数据管理

数据在EEPROM中的存储是按段为单位的,即最小的存储单元是64字节,即便只存储了1个字节,数据存储超出当前段,将使用另一个段。每个段中的64字节中有效存储空间为56字节,另外的8个字节由PDM使用。并且PDM中对每条记录的访问是按ID进行的,类似于文件名。

  • 按ID进行存储操作
  • 每条存储占用的空间为56字节的整数倍(实际上是64字节,有效字节数是56)
  • 参考DEMO中的ID定义在PDM_IDs.h中
    协议栈通PDM进行的数据存储由协议栈自动完成存储、更新。
    可存储内容包含,但不限于:

    • 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

存储

API: PDM_eSaveRecordData()
数据的存储过程是把待存储的数据先存储到空闲的空间中,然后再回收原来的存储空间,因此写数据之前最好检查当前空闲段是否够用。API函数为PDM_u8GetSegmentCapacity()

读取

API: PDM_eReadDataFromRecord()
读之前可判断数据是存在,API函数PDM_bDoesDataExist(),返回数据长度

删除

API: PDM_eDeleteData()

计数器

一个计数器占用1个段,即64字节。包含起始值(Start Value)和增量值(Incremental Value)。当前值=起始值+增量值。为了均衡EEPROM的擦除次数,段内的每个空余字节的每个位代表1,即每增加一次段中将会把下一个空闲位写1,当写到字段末尾时,将自动切换到下一个段重新开始,即起始值=上一段的起始值+增量值的和,增量值被重新赋值为0。旧的段内的数据会由PDM进行回收
API:

  • 创建:PDM_eCreateBitmap(),同样创建时需要一个16位的ID
  • 增加:PDM_eIncrementBitmap(),超出当前段时会自动切换到新的段中
  • 读值:PDM_eGetBitmap(),返回当前段的起始值与增量值的和
  • 删除:PDM_eDeleteBitmap(),会擦除当前段和历史段

关于PDM的自动回收问题并没有找到确切的说明,算是猜测。不过如果不回收,岂不是会很快就填满PDM,这样的bug就好呵呵了。

擦写均衡

每个段有个擦除次数记录,PDM使用时会优先找值低的段,以均衡各段的擦写次数。

最新文章

  1. 在freebsd下安装vim(Debian下类似)
  2. org.quartz.CronTrigger cannot be cast to org.springframework.scheduling.quartz.CronTriggerBean
  3. python与excel的应用-python基础之类与对象的应用-操作excel
  4. 哪吒之魔童降世视听语言影评_豆瓣评分8.7,这个“新哪吒”不一般|《哪吒之魔童降世》影评...
  5. 以太坊核心开发者计划为2.0制定“最小化合并”方案
  6. Ibatis SqlMapclient对象
  7. JavaScript模块知识理解
  8. 互联网公司客户如何选择短信平台或短信通道需要知道的基本知识
  9. 智能卡卡发卡流程(收藏3)
  10. 怎样查看苹果服务器验证关闭,iPhone小技巧:如何查询 iOS 系统是否已经关闭验证?...
  11. 计算机格式为gpt怎么更改,硬盘格式转换,手把手教你如何将硬盘mbr格式转换为gpt格式...
  12. 基于定位技术的位置服务
  13. Google drive下载失败,网络错误
  14. 不懂就问:PHP浮点数中的e和E分别表示什么?
  15. buildroot使用详解
  16. 记录一次oracle中count特别慢的解决方案
  17. 2022年驾驶员考试推土机司机考试模拟试题卷及答案
  18. 7-5 判断输入的字符是哪种类型
  19. linux脚本执行mysql命令
  20. 用友t3服务器系统管理显示类型不匹配,登录账套提示:“类型不匹配”

热门文章

  1. POJ 2387 Dijkstra
  2. 黎明前的黑夜如此漫长
  3. PPT全屏错误 显示不全
  4. PPT - 双屏幕情况下,如何设置 PPT 不在主屏幕显示问题?
  5. 【Code】numpy、pytorch实现全连接神经网络
  6. Qt for WebAssembly 环境配置 - 知其然并知其所以然
  7. 紫猫插件-网络共享数据(1-6)
  8. python 百度地图可视化_Python调用百度地图
  9. 判断字符串是否是邮箱或者手机号码格式
  10. 匹配代价函数之SAD