我正在使用SDK 3.0.6并尝试编写NVDS。但是,在启用读/写(#define nvds_read_write 1)时,尝试调用NVDS_put()导致链接器错误:“。\ out \ full_emb_sysram.axf:错误:l6218e:未定义的符号nvds_put(从nvds.o中引用)。“
如何写入NVDS?特别是我有兴趣配置设备的名称(NVDS_TAG_DEVICE_NAME)和BD地址(NVDS_TAG_BD_ADDRESS)。这两个都将通过来自主机MCU的外部命令配置为生产的一部分,并且对于制造的每个设备将是不同的。
你好Eli.iser,
我理解了
nvds_put.
未在代码中实现,因此链接器错误。不幸的是,我没有关于外部处理器的经验。要在广告数据包中更改设备名称,请参阅文件app_your_project_proj.c ..,特别是广告功能app_adv_func.
。您可以在其中找到结构Gapm_start_advertise_cmd * cmd作为参数。您可以使用此指针设置广告数据和设备名称。要设置设备名称:memcpy(&cmd-> info.host.addata [cmd-> info.host.add_data_len + 2],device_name_temp_buf,device_name_length);
也许这不是直接您的兴趣,但这是广告数据有效载荷的一个例子。您在那里找到您的设备名称。长度为0x08,类型为0x09(完整的本地名称)
0000 02 01 06 08 09 41 42 43 44 45 46 47 ...... ABCDEFG
对不起,我无法帮助你
bd_addr.
。地址不是广告数据的一部分感谢您的答复。
是的,我知道我可以每次启动时在运行时更改设备名称。这是一个可接受的解决方法 - 读取BT地址并将设备名称设置为包含它。
但是,我必须能够更改BT地址。从我所看到的,它可以存储在OTP或NVDS中。我们希望在生产过程中设置每个设备的BT地址。还有另一种方法吗?
你好Eli.iser,
希望有人知道比我好。
我猜打开的BD_ADDR不太容易。我只发现了HCI读取功能。这里是关于OTP设置地址,第9.1节和第18页。
文件Arch_main.c.呼叫
nvds_read_bdaddr_from_otp.
功能。该功能是实施的nvds.c.。该函数从OTP内存中读取BD_ADDR并将其存储到dev_bdaddr。我无法追踪此变量的实际用于最终设置地址的方式。我不知道是否是修改的好主意Arch_main.c.并使其从外部处理器读取BD_ADDR,而是从OTP读取(使其等待,例如,UART数据)。
我也发现这些寄存器datasheet.h.,但他们没有记录在实际数据表中:
#define ble_bdaddrl_reg(0x40000024)/ * ble device地址lsb寄存器* /
#define ble_bdaddru_reg(0x40000028)/ * BLE设备地址MSB寄存器* /
你好Eli,我要求团队联系你讨论:你的设置有几个因素,他们需要澄清。我已经把robert寄给了这个帖子的副本,并让他保持联系好像我没有弄错,他本周去过你了。
嗨Vesan,谢谢你的评论!
BR JE_DIALOG.
感谢您转发此问题以支持。事实上,罗伯特星期二访问过,但直到昨天我没有确定这个问题。
嗨,je_dialog,
我也对Wethe我可以通过修改NVDS_TAG_BD_ADDRESS在NVDS刻录后的NVDS_TAG_BD_ADDRESS来更改BD地址的问题感兴趣。
我们希望我们的设备的BD地址可以根据从UART收到的数据进行更改。
嗨祖马,
由BLE规范定义的BD地址有很少的选项,设备可以携带公共或随机地址,随机地址类型分为静态和私有,然后私有地址分为不可解析和可解析。我相信你想拥有的BD地址是公共场所(如果我错了,请纠正我)。设备在启动期间获得BD地址,在NVDS_READ_BDADDR()函数中(设备检查来自BD地址的NVDS结构或OTP的位置),并将获得的VED_BDDDR变量中的所获得的值放置在保存的地址中设备。
关于在运行时更改,如果您对随机的内容感兴趣,则随机地址模式可以为您做到这一点,但如果您想指定UART获得的确切地址,则必须在NVDS_READ_BDADDR之前提供BD地址()运行并将BD地址应用于堆栈,或者在设备运行时获取UART获取BD地址并将其复制到DEV_BDADDR变量,然后您将必须发送GAPM_RESET_CMD以便堆栈拍摄新BD地址。由于在规范中的BLE设备上的BD地址表示为固定或随机的BD地址,但是如果这是您想做的,因此,这是一种方法,因为这是一种方法,这是一种方法。
谢谢mt_dialog.