前言
工厂信息配置寄存器(FICR)是在工厂中预先编程的,不能被用户删除。这些寄存器包含芯片特定的信息和配置。实际上FICR是一个寄存器组,下面有很多个独立的寄存器,各个寄存器用来存放表征芯片特性的一些数据。例如芯片的硬件代码、固件代码、片上FLASH的大小、片上RAM有几块、每一块的容量是多少、蓝牙地址等等很重要的信息。而这些信息在芯片制造的过程被烧写进去。由于这些寄存器组是OTP,只能烧录一次,烧录完以后只能读取里面的值了。这些数据很有用,就算我们拿到一片被磨掉丝印的芯片,通过读取内部FICR相关寄存器的值,我们仍然可以知道它是什么版本的芯片,片上FLASH有多少,RAM有多少,等等。
FICR不只是一个寄存器,它是一个寄存器组。所以下面分别介绍一下各寄存器保存的一些信息。
其中DEVICEADDR[n],是48位的:
蓝牙地址有2种类型:
publicaddress:这种类型的地址一般由公司向蓝牙组织SIG申请,然后SIG分配给公司24位的公共地址,另外的24位是公司内部自由分配的,比如跟不同的产品,不同的型号分配不同的地址。这24位地址是唯一的,是属于公司的,看到这24位地址好像看到了公司一样。当然,这个是要花钱的。
Randomaddress:一般用的是这种类型的地址。所谓的静态随机,以nRF51为例,就是在芯片生产的过程中随机产生,然后烧录到FICR寄存器里面的值。当蓝牙协议栈初始化的时候把这个地址读取出来,广播出去。
本节介绍nRF51系列SOC的FICR模块中各寄存器的含义,并且以一个实例把各寄存器的值读出来,然后打印到串口。通过本节的学习,大家会知道如何获取这些跟IC身份相关的信息。
示例详解
基于硬件平台:nrf51822ek_tm开发板。
本示例所用的最小系统板原理图:
-
- 工程创建:
- 打开KEIL,新建一个空工程:Project->NewuVisionProject
- 工程创建:
工程名为nrfxx-ficr确认后按下图选择芯片为nrf51822_xxAA->ok
在弹出的对话框中勾选CMSIS中的CORE;Device中的Startup(后面有nrf51Series字样的);在nrf_device中勾选nrf_gpio, nrf_uart, nrf_delay,nrf_err并在nrf_Libraries中勾选app_error,nrf_assert模块。
OK之后工程自动生成如下代码:
新建一个空白文档,保存为main.c,并加入工程中:
配置工程,选择使用MicroLIB库,可以减小程序体积:
加入NRF51定义,并选择化等级3,可以减小程序体积,但仿真运行时可能会出现与代码顺序不一致现象:
调试工具选择J-LINK,并将接口设置为SW口勾选下载程序后自动复位及运行:
-
- 工程代码
- OK之后在man.c中加入如下代码:
- 工程代码
把程序编译,下载到开发板上可以看到开发板上的蓝灯实现了呼吸灯效果。对应的PWM变化如下图所示:
关于nrf51xx及FICR的更详细介绍可以参看《nRF51822_PS_v3.3.pdf》或https://infocenter.nordicsemi.com/index.jsp
。
OK,本期实验完成!下期见!同时如果大家有什么疑问或是有想了解的其它内容,也欢迎大家留言!!最后喜欢这个公众号的同学们记得加关注了,会有不定期技术干货推出!!
文中源码资料下载,在公众号里给十三发消息:
下载|一起学nRF51xx 11
关注十三公众号