前面文章分析了OTA的实现架构、协议和存储问题,提到了一个细节,如果使用双程序更新模式,将Flash空间分成上下两部分,如下图所示,那么最后生成的BIN文件为了放在不同的位置,需要生成两份地址不同文件,然后根据芯片的实际使用情况,选择合适的文件进行烧写。

BLE OTA memory layout

偶然看到一个信息,Nordic做双程升级时候,只需要一个二进制文件,不需要提供两个BIN文件进行选择。Nordic是怎么办到的呢?

内存布局

Nordic芯片的Flash布局图如下:

Nordic_DFU_Memory_Layout

Flash地址从下向上增长,最底层的MBR(Master Boot Record)区域存放中断向量表的位置。芯片中的Bootloader、SoftDevice和Application都具有自己的向量表,MBR的寄存器UICR.NRFFW[1]指示系统该选择哪一个中断向量表。(参考

SoftDevice区域存放协议栈。

Application区域存放用户固件程序。

APP Data区域存放用户希望永久保存的数据,比如设备地址等。这块区域在升级过程中也可以保持不被擦写。

DFU Bootloader区域存放Bootloader程序,用以执行升级过程。

更新方案

Nordic提供了三种更新方案,分别是:(参考

  1. 双程DFU
  2. 单程DFU
  3. 更新BootLoader和SoftDevice

1. 双程DFU

双程DFU方案的操作流程如下:

Dual-Bank DFU memory layout

从左侧图中可以看到Application区域空间分成了两部分:Blank 0和Blank 1。

假如当前的程序放在Blank 0区域,那么新的程序将被复制到Blank 1区域,如中间的图。

大多数芯片厂的DFU过程到这里就结束了,只要通过Bootloader引导MCU进入到新的程序地址即可。这样必然会产生本文开头提到的问题,在升级程序的时候,需要确定旧的程序放置位置。由于生成的BIN文件包含了起始地址信息,这意味着要新的程序要准备两份功能相同、地址不同的BIN文件,按照实际情况选择合适的文件烧写空白区域。

Nordic使用了一个小技巧,即将新的程序(Blank 1)复制到旧的程序空间(Blank 0),这样就是的程序基地址永远在Blank 0,从而解决了上述困难。

由于Flash赋值是一个耗时操作,DFU做起来一定会很慢。仔细观察,会发现双程DFU至少需要执行两次擦除和两次烧写,分别是:

  • 烧写Blank 1
  • 擦除Blank 0
  • 烧写Blank 0
  • 擦除Blank 1

疑问:如果在执行右侧图的Flash赋值过程中途,发生了断电,该怎么办?

我猜测应该先将Blank 1的内容复制到Blank 0,当复制完毕校验通过,再擦除Blank 1,结束DFU过程。这样即使在复制中途断电,Blank 1的内容仍然有效,重启后可以重新进行复制操作。读源码应该可以确认这一点。

2. 单程DFU

单程DFU的操作流程如下:

Single-Blank DFU memory layout

单程DFU就是现将Application区域清空,再将新的程序写入到Application空间的基地址。

这种做法好处是充分利用Application的空间,而且只需要擦除一次,烧写一次,操作时间相对于双程DFU一定会有大幅度降低。

单程DFU的缺点是不能在线更新,因为用户程序需要被擦除,所以一定需要断开连接和重启。

3. BootLoader和SoftDevice

升级BootLoader和SoftDevice的操作流程如下:

BootLoader and SoftDevice DFU memory layout

这个图乍一看比较复杂。

(1)擦除旧用户程序

(2)将新的Bootloader和SoftDevice写入Application区域

(3)将新的Bootloader和SoftDevice复制到Bootloader和SoftDevice区域

So easy? ——不是的!

并不是每个厂商的芯片都能实现这个功能,因为第(2)步到第(3)步之间,MCU要擦除Bootloader区域,有些BLE厂商的MCU,Bootloader程序是唯一的启动器,Bootloader程序自身是不可以被擦除的,否则MCU无法正常启动。Nordic的芯片存在MBR,利用MBR引导MCU跳转到Bootloader或其他地方。

程序在第(2)步结束时设置MBR的寄存器,让MCU下次启动时候不直接跳转到Bootloader区域,而是跳转到Application区域,执行一个复制操作,将新Bootloader程序和SoftDevice程序复制到各自区域,然后再设置MBR寄存器,让MCU下次重启时候直接跳转到Bootloader区域。

虽然仅仅增加了几行Flash来存放MBR信息,但是对MCU的更新提供了极大的灵活性。

(完)

蓝牙产品做出来以后,需要做两件事情:

  • 资格认证(Qualification)和声明(Declaration)
  • 规范认证(Certification)

资格认证用于认证蓝牙技术,资格认证与声明是同一件事情的两个阶段。规范认证用于认证无线电标准。

1. 资格认证需求

哪些产品需要做资格认证?如果一款蓝牙产品设计和功能都很简单,是否也要获得蓝牙的资格认证?

SIG网站专门回答了这个问题,以下三种情况下一定要进行资格认证:

  • 设计、命名、生产任何蓝牙产品或以任何蓝牙产品代表您
  • 购买白标蓝牙音箱,然后贴其他品牌销售
  • 在产品中安设经过资格认证的蓝牙模块

第一条直观易懂,它衍生出来的结果是,这个产品做了资格认证,如果下个产品做了修改,仍然需要重新做资格认证。

第二条产生一个疑问,对于白牌蓝牙产品,销售方需要获得认证,那生产方呢?SIG卖了关子,建议去咨询自己公司的法务部门。

第三条比较苛刻,假如产品中使用一个蓝牙模块,即使产品本身只与蓝牙模块进行串口通信,这个产品也需要做蓝牙资格认证!

如果销售未经过资格认证的蓝牙产品,蓝牙SIG有权利追究法律责任。国内是有先例的。

2. 怎么做资格认证

做资格认证需要将公司注册成为SIG的会员(免费)。

基本流程如下:

  1. 开发生产蓝牙产品。
  2. 购买一个声明ID(DID),费用为八千美元
  3. 在官网用TPG创建一个测试计划,生成测试列表,用户需要通过全部测试项。此时生成一个QDID表明该设计是合规的。
  4. 列名(Listing)DID。
  5. 签署一致性声明DoC。

至此,该蓝牙产品就算通过了资格认证,可以在产品中使用蓝牙技术、名称和Logo。

TPG(Test Plan Generator)是蓝牙SIG提供的免费在线服务,用户输入产品相关信息,TPG生成一个测试列表,用户需要完成列表中的测试项,并将测试报告上传至TPG进行审核。

蓝牙芯片、天线电路设计和协议栈软件都需要进行资格认证,这些基础部件的QDID和DID信息可以被其他产品引用,简化终端产品的认证流程。BLE芯片厂商,都会提供芯片相关的QDID和DID,蓝牙产品在列名阶段需要提供相应的QDID和DID信息。

3. 去哪做资格认证

TPG生成的测试项目中,包括许多射频参数的认证需求,这些工作通常由专门的蓝牙认证机构完成,这类认证组织称为BQB,他们的专家称为BQE。由于在BQB中做测试拿报告是资格认证的主要部分,因此蓝牙资格认证也被称为BQB认证。

在BQB所做测试包括:

  • 射频(RF)一致性测试
  • 协议(Protocol)一致性测试
  • 配置文件(Profile)兼容性测试

通常协议和配置文件的测试可以直接引用芯片厂商提供的QDID,终端产品重点关注RF测试。

精简的RF测试项目如下:

  • Output Power
  • Modulation Characteristics
  • Power Control
  • Initial Carrier Frequency Tolerance
  • Carrier Frequency Drift
  • Sensitivity—single-slot packets
  • Sensitivity—multi-slot packets
  • Maximum Input Level
  • –20dB Bandwidth
  • Power Density
  • TX Output Spectrum-Frequency Range
  • TX Output Spectrum-ACP
  • C/I Performance
  • Blocking Performance
  • Inter-Modulation

虽然项目有许多,但是大多数都是芯片层面的事情,比如第一项输出功率,它取决于芯片的RF脚输出能力,只要PCB板上的天线部分设计合理,基本上都能够获得满足要求的输出功率。

4. 规范认证

下表为不同国家或地区的规范标准:

规范名字 全称 适用地区
FCC Federal Communications Commission 美国
CE/ETSI Conformité Européene/European Telecommunications Standards Institute 欧洲
IC Industry Canada 加拿大
KC Korea Certification 韩国
MIC Ministry of Internal Affairs and Communications 日本
NCC National Communications Commission 台湾
SRRC State Radio Regulation of China 大陆

对于BLE产品,这些标准大同小异,都是规定频率、功率、杂波等几项标准。

下面介绍FCC的几个测试用例

  • TX Continous Wave (CW), 2402 MHz, 0 dBm
  • TX Continous Wave (CW), 2440 MHz, 0 dBm
  • TX Continous Wave (CW), 2480 MHz, 0 dBm
  • TX Modulated, 2402 MHz 0 dBm
  • TX Modulated, 2440 MHz 0 dBm
  • TX Modulated, 2480 MHz 0 dBm
  • RX On, 2402 MHz Standard gain
  • RX On, 2440 MHz Standard gain
  • RX On, 2480 MHz Standard gain

以上共有三项测试,每项测试分别在前(2402MHz)、中(2440MHz)和后(2480MHz)三个频点进行测试。第一项测试非调制波的单频输出,第二项测试调制波的单频输出,第三项测试单频输入。

所以将设计好的产品拿去做FCC认证,只需要在程序中实现“单频 + 调制 + 输入输出”几个功能即可。

名词解释

缩写 全称 描述
SIG Special Interest Group 蓝牙技术联盟组织的执行结构
BQB Bluetooth Qualification Body 蓝牙资格认证组织
BQE Bluetooth Qualification Expert BQB里面的专家人员
BQTF Bluetooth Qualification Test Facilities 蓝牙资格认证的测试设备
QDID Qualified Design Identity 通过资格认证的设计ID
DID Declaration ID 声明ID
TPG Test Plan Generator 测试计划生成器
EPL End Product Listing 终端产品列名

参考

Bluetooth Qualification and Declaration

Process for Qualifying a Bluetooth Product

Declare Your Product

Bluetooth FAQ

(完)

查芯片手册时候会经常遇到LDO和DC-DC这两个概念,它们都属于电源管理模块,将高电压(向下)转换到目标电压。

LDO Regulator

LDO的基本原理图如下:(参考

LDO_Diagram

误差放大器(Error Amplifier)强迫两个输入端的电压相等,这样两个电阻之间的电压降趋于V_REF,于是得到V_OUT与V_REF的关系:(参考

V_out = V_ref × (1 + R1 / R2)

不考虑常数项,这可以看做是一个分压电路。

由于它实现起来很简单,几乎所有的芯片都会内置一个LDO,有些地方也称为线性稳压器(regulator)。

使用LDO无需额外的外围电路。

LDO的不足是,如果输入输出电压的压差大,那么许多功率都浪费在分压电阻上,不利于实现低功耗。

DC-DC Converter

DC-DC的基本原理图如下:(参考

DCDC_Diagram

当左侧开关打开,右边的电容开始充电,当左侧开关关闭,右边电容开始放电。

控制开关打开和关闭的频率,即可让右侧电容的电压维持在一个稳定数值。

开关的波动频率设为D,则有如下关系:

V_out = V_in × D

即输出电压与输入电压成正比例。如果比例系数小于1,为降压转换器,如果比例系数大于1,为升压转换器。

输出电压的波形如下图所示:(参考

DCDC_Output_Voltage

对输出电压进行滤波即可获得直流输出。

所以,使用DC-DC电压转换器,通常要额外加滤波电路。下面两个图为Silabs的BLE芯片EFR32BG12的参考连线图,上图为不使用内部DC-DC转换器,下图为使用了内部DC-DC转换器:

DCDC_Not_Used

DCDC_Used

比较两个电路,如果使用了DC-DC转换器,需要在VREGSW管脚外接一个LC滤波电路。

参考

DC to DC Converters

(完)