如何从OTP ROM获取BD地址

⚠️
嗨,...感谢您来论坛。令人兴奋的消息!我们现在正在迁至我们的新论坛平台,将提供更好的功能,并包含在主对话框网站中。所有帖子和帐户都已迁移。我们现在只接受新论坛上的流量 - 请发布任何新线程https://www.dialog-seminile.com/support.。我们将在未来几天修复错误/优化搜索和标记。
6个帖子/ 0新
最后一篇
尼格利
离线
最后一次露面:1个月3周前
加入:2018-03-20 08:24.
如何从OTP ROM获取BD地址

嗨对话框

如果我的代码存储在QSPI闪存中,但我通过PLT在OTP ROM中写了一个BD地址,如何使BLE堆栈在OTP ROM中使用BD地址而不是nvms或defaulble_static_address?此外,如何从OTP ROM读取BD地址?这个案例有任何示例代码anout吗?

谢谢

奈杰尔

设备:
PM_DIALOG.
离线
最后一次露面:1小时20分钟前
职员
加入:2018-02-08 11:03
嗨尼格尔,

嗨尼格尔,

在OPT标题中放置在特定地址(0x07F8EA58)中的BD地址。请尝试使用SmartSnippets Toolbox的OTP工具读取OPT标头。要从OTP标头读取BD地址,您应该按照以下步骤操作:

1.添加OTP控制器的LLD(低级驱动程序)

#include“hw_otpc.h”

2.添加从OTP内存读取的函数,命名为read_bd_address_from_otp()。源代码如下:

静态BOOL READ_BD_ADDRESS_FROM_OTP(UINT32_T OTP_CELL_OFFSET,UINT8_T * BD_ADDRESS,UINT32_T * PHY_OTP_ADDRESS){UINT32_T R_BUF [2];uint32_t num_words = 3;uint32_t * physical_otp_address;静态uint8_t bd_address_otp_final [8];bool is_correct = 0;physical_otp_address = hw_otpc_cell_to_mem(otp_cell_offset);phy_otp_address = physical_otp_address;hw_otpc_init();is_correct = hw_otpc_fifo_read((uint32_t *)r_buf,otp_cell_offset,hw_otpc_word_low,num_words,false);hw_otpc_disable(); bd_address_otp_final[0] = (r_buf[0] >> 0 ); bd_address_otp_final[1] = (r_buf[0] >> 8 ); bd_address_otp_final[2] = (r_buf[0] >> 16 ); bd_address_otp_final[3] = (r_buf[0] >> 24 ); bd_address_otp_final[4] = (r_buf[1] >> 0 ); bd_address_otp_final[5] = (r_buf[1] >> 8 ); bd_address_otp_final[6] = (r_buf[1] >> 16 ); bd_address_otp_final[7] = (r_buf[1] >> 24 ); memcpy(bd_address, bd_address_otp_final, 8); return is_correct; }

3.从OTP内存中检索BD地址

uint32_t * photical_otp_memory_cell;uint32_t cell_offset = 0x1d4b;静态UINT8_T BD_ADDRESS_FINAL [8];BOOL READ_SUCCESS;/ *从OTP内存中检索BD地址* / read_success = read_bd_address_from_otp(cell_offset,bd_address_final,pharesal_otp_memory_cell);os_assert(read_success);静态indow_address_t user_bd_address = {.addr_type = private_static_address,};memcpy(user_bd_address.addr,bd_address_final,6);//将BD地址设置为Prefere值。此函数以逆序列设置BD地址。 ble_gap_address_set(&user_bd_address, 0x00FF);

谢谢,PM_DIALOG.

尼格利
离线
最后一次露面:1个月3周前
加入:2018-03-20 08:24.
嗨对话框,

嗨对话框,

我的测试基于您的功能似乎不适用于DA14681。你能告诉我为什么“cell_offset”是0x1d4b?什么是与0x07f8ea58的关系(OTP中的BD地址)?我很奇怪“physical_otp_address = hw_otpc_cell_to_mem(otp_cell_offset)”,但是,hw_otpc_cell_to_mem()中的photical_otp_address = 0x7f80000 +(cell_offset << 3)。它不会是0x07f8ea58。

谢谢

奈杰尔

PM_DIALOG.
离线
最后一次露面:1小时20分钟前
职员
加入:2018-02-08 11:03
嗨nigelyang,

嗨nigelyang,

PARAM [in] OTP_CELL_OFFSET:OTP单元格的偏移量。计算物理内存地址的公式是(0x7F80000 +(OTP_CELL_OFFSET << 3))。例如。偏移0x1d4b对应于0x7f8ea58物理地址(BD地址的位置)

param [in] bd_address:单元格的内容在块中为1字节

param [in] phy_otp_address:OTP存储器单元的物理地址(用于验证目的)

Param [Out]:如果已成功执行读取请求,则为true,否则为false

正如我在我珍贵的答案中提到的那样,在opt标题中放置在特定地址(0x07f8ea58)中的BD地址。您是否使用SmartSnippets工具箱读取了OTP工具的Opt标题。是位于0x07f8ea58的BD地址?否则,在哪个OTP地址位于?

谢谢,PM_DIALOG.

尼格利
离线
最后一次露面:1个月3周前
加入:2018-03-20 08:24.
嗨对话框,

嗨对话框,

我发现我的问题来自使用CM_SYS_CLK_SET(SYSCLK_PLL48)进行SYSTME时钟设置。在CM_SYS_CLK_SET(SYSCLK_XXTAL16M)更改后,我在OTP后获得了正确的BD地址;一个问题,如果使用cm_sys_clk_set(sysclk_pll48),则阅读OTP BD地址的正确方法是什么?

谢谢

PM_DIALOG.
离线
最后一次露面:1小时20分钟前
职员
加入:2018-02-08 11:03
嗨nigelyang,

嗨nigelyang,

是的,您应该以相同的方式阅读BD地址。如果将时钟更改为PLL,您是否能够从工具箱访问Opt标题并读取包含?如果您发现以前的答案有用,请标记其中一个“被接受”。

谢谢,PM_DIALOG.