static __inline void nvds_read_bdaddr(void) { #if defined(__DA14583__) && !(BDADDR_FROM_DA14583_FLASH_DISABLED) // First check and read BD address from DA14583's internal SPI flash // If no BD address was found in flash, then try to read BD address from OTP if( !nvds_read_bdaddr_from_da14583_flash() ) #endif { // Check and read BD address from OTP nvds_read_bdaddr_from_otp(); } }
Hi sir
你是想从flash 里面直接执行吗?这个对DA14580是不行的,必须copy到ram里面执行哦
可以的,可以查看函数nvds_read_bdaddr。如果是580,上来就会去OTP读。
如果是全0,在函数custom_nvds_get_func里,会去读tag- NVDS_TAG_BD_ADDRESS的内容
如果已经把蓝牙地址烧入OTP了,580读取OTP时就不会是全0了吧?
Hi Gongyu_Dialog,
DA14580 SDK 5.0.4里 nvds_read_bdaddr 函数是这样定义的:
static __inline void nvds_read_bdaddr(void)
{
#if defined(__DA14583__) && !(BDADDR_FROM_DA14583_FLASH_DISABLED)
// First check and read BD address from DA14583's internal SPI flash
// If no BD address was found in flash, then try to read BD address from OTP
if( !nvds_read_bdaddr_from_da14583_flash() )
#endif
{
// Check and read BD address from OTP
nvds_read_bdaddr_from_otp();
}
}
这里只有在定义了14583的时候才会从Flahs中读 ,不然的话就去OTP里读。
我没有看到custom读蓝牙地址的函数
问题1:
在产品开发中,我们用 const struct nvds_data_struct nvds_data_storage __attribute__((section("nvds_data_storage_area"))) 这个结构体来定义蓝牙地址
我看到这个变量实际上是直接被存储到了Sys RAM 中 0x2000,0340 这个地址上(根据scatter file),我想知道,代码是如何把这个内存地址上的蓝牙地址设置到寄存器里的。
问题2:
根据文档“使用SUOTA_0 - b - 010”的描述,在spi Flash中,地址0 x1F000这个位置上的Product header 也有BD_addr 的定义,我猜这个是在量产中不使用OTP时蓝牙地址的存放位置,
但是我没有看到代码和文档中有相关的介绍,应该如何使用product header 来设置蓝牙地址
问题3:
在实际的量产中,不需要再使用nvds_data_storage 这个变量定义的蓝牙地址,我是否需要把 da4580_config_advenced.h 文件中 CFG_INITIALIZE_NVDS_STRUCT 注释掉
thanks
是这样的