参考文档:@@an - b - 020 - _v1.2_end产品测试和编程guidelines.pdf
使用的Jlink进行烧写:
总结整个烧写流程如下
1 .使用Jlink烧写cust_prod_test_ES5。十六进制(对话框原厂提供)。
2 .烧写完成即可通过串口进行晶振校准,射频测试功能。
3.以上测试完成得到晶振校准值,记录下来。
4 .使用jlink烧写programer_ES5.bin(对话框原厂提供)。
5.使用Jlink烧写自定义代码十六进制文件(即我们开发的应用程序)。
6 .烧写nvd(此步骤可选)可烧可不烧。
7.烧写OTP头。
整个流程都验证过,是可以的。但有如下几个问题。
1、在第三步,得到了晶振校准值,可以先加上6.8 v直接烧写如OTP吗?然后6.8 v一直不断开,直到烧写CustomCode。十六进制跟OTP头后才断开6.8 v。这样可以吗?
2, OTP的烧写区域是不是可以分开烧写吗?(意思是OTP中有很多参数,比如应用Flag1/2 IQ_Trim,惟一的ID等设备等,我可以第一次烧写设备惟一的ID之后,芯片完全断电,重新再烧写OTP头中的应用程序标记1吗?此时是不惟一的ID是设备的内容烧写是无效的,如果重复烧写是否会导致坏掉?)
3、如需要烧写,nvd是否要把源码中的nvd读取宏定义取消掉吗?
谢谢您的回答。
设备:
1.这样没问题。参见我们的回复:
实际上,高电压施加到芯片上的时间长短并不是很关键。VPP控制引脚只会在编程周期开始时打开VPP,然后禁用它。
建议是尽快切换VPP,但这不是ms的顺序。
2.应用程序标记没写仅是告诉引导装载程序不要从OTP那里去引导,之前写的内容已经生效。重复烧写应该不起作用了。
3.如需要烧写,nvd是否要把源码中的nvd读取宏定义取消掉吗?
//你说的是哪个宏?
嗨,Gongyu:
如下的定义:READ_NVDS_STRUCT_FROM_OTP,
# ifdef READ_NVDS_STRUCT_FROM_OTP
Const struct nvds_data_struct nvds_data_storage __attribute__(((section(“nvds_data_storage_area”)));
其他#
Const struct nvds_data_struct nvds_data_storage __attribute__(((section("nvds_data_storage_area"))) =
{
.NVDS_VALIDATION_FLAG = 0 x1ffff,
............
.NVDS_TAG_APP_BLE_ADV_DATA = " \ x1A \ xFF \ xD2 \ x00 \ x02 \ x15 \ x58 \ x5C \ xDE \ x93 \ x1B \ x01 \×\ xCC \ x9A \ * 13 \ 25 \ x00 \ x9B \中\ . xC6 \ x5E \ x00 \ x00 \ x00 \ x00 \ xC5”,
.NVDS_TAG_APP_BLE_SCAN_RESP_DATA = " \ x09 \ xFF \ x00 \ x60 \ x52 \ x57 \ x2D \×\ x4C \ x45”,
.NVDS_TAG_DEVICE_NAME
.NVDS_TAG_BD_ADDRESS
...............
.NVDS_TAG_BLE_CA_NB_BAD_PKT = 50,
};
有另一个问题:参照上述的参考文档中提到:
启用XTAL微调校准标志。
=> prodtest.exe -p 41 otp we_xtrim
将BD地址写入OTP报头。
=> prodtest.exe -p 41 otp wr_bdaddr 06:05:04:03:02:01
问:该命令烧写的位置是否为nvd里面的内容吗?
定义了READ_NVDS_STRUCT_FROM_OTP,说明这些参数都存放在OTP里,而不是外部flash里面。另外,你用的SDK版本是什么?
你可以导入prod_test的工程,在host_hci.c文件里查看hci_dialog_otp_wr_bdaddr函数。
在customer_prod.c里面找到函数hci_otp_rw_cmd,可以看到地址是写的0 x7fd4的地方(OTP里存放地址的地方),这并不是nvd里的内容
sdk: 3.0.6
另外问题:没定义READ_NVDS_STRUCT_FROM_OTP,那么蓝牙地址跟设备名称等信息都是定义在源码中常量struct nvds_data_struct nvds_data_storage __attribute__(((“nvds_data_storage_area部分 "))) = ...... 这个结构体中。
那么,源码中的地址是不能改变的(0 x112233445566,那么又往OTP写了如下参数,那最终蓝牙地址会是哪一个?
将BD地址写入OTP报头。
=> prodtest.exe -p 41 otp wr_bdaddr 06:05:04:03:02:01
首先设定宏NVDS_SUPPORT是定义的,上电之后在lld_init_func(罗里的代码)会调用nvds_get函数去获取蓝牙地址,并存放到0 x40000024和0 x40000028寄存器里面。后面组包都会从这两个寄存器里面拿地址。
再看nvds_get这个函数,罗里会调用Jump_table里的custom_nvds_get_func函数(这个函数SDK里可以看到)。
里面主要是从变量dev_bdaddr里获取蓝牙地址。而dev_bdaddr则是从之前nvds_read_bdaddr_from_otp里面拿到的。
里面涉及到几个宏,因为组合起来有几种情况,你可以自己看打开或者关闭对取地址的影响。