嗨对话框
如果我的代码存储在QSPI闪存中,但我通过PLT在OTP ROM中写了一个BD地址,如何使BLE堆栈在OTP ROM中使用BD地址而不是nvms或defaulble_static_address?此外,如何从OTP ROM读取BD地址?这个案例有任何示例代码anout吗?
谢谢
奈杰尔
嗨尼格尔,
在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.
嗨对话框,
我的测试基于您的功能似乎不适用于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。
嗨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地址位于?
我发现我的问题来自使用CM_SYS_CLK_SET(SYSCLK_PLL48)进行SYSTME时钟设置。在CM_SYS_CLK_SET(SYSCLK_XXTAL16M)更改后,我在OTP后获得了正确的BD地址;一个问题,如果使用cm_sys_clk_set(sysclk_pll48),则阅读OTP BD地址的正确方法是什么?
是的,您应该以相同的方式阅读BD地址。如果将时钟更改为PLL,您是否能够从工具箱访问Opt标题并读取包含?如果您发现以前的答案有用,请标记其中一个“被接受”。
嗨尼格尔,
在OPT标题中放置在特定地址(0x07F8EA58)中的BD地址。请尝试使用SmartSnippets Toolbox的OTP工具读取OPT标头。要从OTP标头读取BD地址,您应该按照以下步骤操作:
1.添加OTP控制器的LLD(低级驱动程序)
2.添加从OTP内存读取的函数,命名为read_bd_address_from_otp()。源代码如下:
3.从OTP内存中检索BD地址
谢谢,PM_DIALOG.
嗨对话框,
我的测试基于您的功能似乎不适用于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。
谢谢
奈杰尔
嗨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.
嗨对话框,
我发现我的问题来自使用CM_SYS_CLK_SET(SYSCLK_PLL48)进行SYSTME时钟设置。在CM_SYS_CLK_SET(SYSCLK_XXTAL16M)更改后,我在OTP后获得了正确的BD地址;一个问题,如果使用cm_sys_clk_set(sysclk_pll48),则阅读OTP BD地址的正确方法是什么?
谢谢
嗨nigelyang,
是的,您应该以相同的方式阅读BD地址。如果将时钟更改为PLL,您是否能够从工具箱访问Opt标题并读取包含?如果您发现以前的答案有用,请标记其中一个“被接受”。
谢谢,PM_DIALOG.