亲爱的读者,
我已经根据外围设备示例代码为自己的BLE外围设备创建了自己的供应商定义的BLE配置文件。到目前为止,我已经成功地运行固件在一个独立版本运行从OTP内存。但是,现在我必须为每个设备更改固件中的设备名称,并在生产期间重新构建固件。我想在生产期间在OTP NVDS内存中刻录设备名称(NVDS_TAG_DEVICE_NAME)。然而,我没有做到;目前还不清楚如何正确地做到这一点,以及需要设置哪些值。你能帮我一下吗?
到目前为止,我得到了以下几点:
我未定义:CFG_INITIALIZE_NVDS_STRUCT;CFG_DEVELOPMENT_DEBUG
我定义:CFG_BOOT_FROM_OTP
当我使用SmartSnippets用正确的OTP头刻录二进制文件到OTP时,从0x40340开始的OTP NVDS内存块仍然是空的。当我填补这个领域创建一个nvd模板十六进制文件与另一个设备的OTP nvd内存运行固件CFG_INITIALIZE_NVDS_STRUCT还写代码中定义(nvd stuct nvds.c用于代替),然后该设备不会开始广告。
问候,
Wouter
设备:
亲爱的员工对话框,
你能回答一下吗?
问候,
Wouter
嗨Wouter Vos,
很抱歉回复晚了,有同事正在调查,我们会尽快给你答复。
由于MT_dialog
你好Wouter,
我为耽搁道歉。请查收我们对你方问题的分析
你不能将部分NVDS保存在OTP中,而将另一部分保存在你的代码中。当你烧代码在OTP没有CFG_INITILIALIZE_NVDS_STRUCT定义你离开整体。
在OTP图像中的NVDS区域为空,您可以使用NVDS OTP工具刻录。稍后,您必须使用OTP NVDS选项卡(内存偏移值为0 x340直到0 x440).所以你
必须要么在代码中刻录带有NVDS数据的图像,要么随后使用OTP NVDS工具刻录图像。
您提到的#define是为了在烧制过程中从OTP启动而定义/未定义的正确定义。确保应用程序在OTP头都烧国旗是为了引导装载程序实现OTP镜(你可以检查这仅仅通过检查如果引导装载程序执行打开UART港口和检查如果RX TX针连接)。
如果这帮助你解决了问题,请让我们知道,或者如果你有任何其他问题。
问候,
LC_Dialog
亲爱的对话框,
谢谢你的回答。我知道你在答复中指出的问题。不幸的是,它帮不了我。与
CFG_INITILIALIZE_NVDS_STRUCT
定义设备按照预期运行并从OTP正确启动。然而,当我把这个设备叫做A我烧录了另一个设备叫做BCFG_INITILIALIZE_NVDS_STRUCT
未定义的并使用OTP NVDS工具将设备A的NVDS内存拷贝到设备B的空NVDS内存中,设备B不开始发布。设备B的程序计数器似乎在内存位置0x805B4附近,而设备A的程序计数器在0x20000000以上。起初我以为广告数据可能不正确,因为
USER_ADVERTISE_DATA
定义为空字符串在user_config.h
.但是在筛选了代码之后,我注意到它被附加了NVDS_TAG_DEVICE_NAME
在函数app_easy_gap_undirected_advertise_start_create_msg
(app.c
)如果USER_CONFIG
定义在user_config.h
-我的代码就是这样。现在我开始怀疑是否有可能保留
CFG_INITILIALIZE_NVDS_STRUCT
定义的,但离开USER_DEVICE_NAME
空的user_config.h
和燃烧NVDS_TAG_DEVICE_NAME
以及它在OTP内存中的长度(因为它是OR内存,0可以被更改为1,但不能反过来)。我还有一些与上述问题没有直接关系的问题:
我们有设备运行作为一个SPI奴隶和发送数据从一个主机MCU。基于中断的通信已经实现并实现了功能。然而,目前我们必须将SPI主SPI时钟设置在1 MHz以下,并增加字节之间的延迟以确保正确的传输。
A) SPI模块的时钟速度是多少?时钟分频寄存器似乎被设置为零,但我不知道这代表什么时钟速度。
B)在结构中
nvds_data_storage
在nvds.c
睡眠(NVDS_TAG_SLEEP_ENABLE
),外部唤醒(NVDS_TAG_EXT_WAKEUP_ENABLE
)禁用(它们是固定的)。那么影响是什么呢CFG_EXTERNAL_WAKEUP
和CFG_MEM_MAP_DEEP_SLEEP
设备的睡眠和唤醒行为?我希望设备在SPI通信发生时唤醒。目前我有睡眠定义未定义。这是否意味着设备不会进入睡眠状态?问候,
Wouter
你能回答一下吗?
问候
你好Wouter Vos,
我正在努力解决你的问题。我会尽快回复你解决方案。
谢谢你!对你的耐心。
问候,
信用证
你好Wouter Vos,
首先,您可以使用设备A的NVDS数据并将其写入设备B,假设设备B配置为NVDS工具可编程(undefCFG_INITIALIZE_NVDS_STRUCT).并且,您将能够使用工具写入NVDSCFG_INITIALIZE_NVDS_STRUCT,填充可用的0。我们没有尝试过,也不建议这样做,因为你可能会在NVDS内存中有随机定义的数据。
A)主模式的默认时钟速度设置为2MHz。为了修改时钟速度,您需要更改CLK_PER_REG(它控制外围时钟)中SPI_DIV的值和spi_init()函数中SPI_XTAL_Freq_t的值(它控制SPI块时钟的频率)。
B)根据选择的类型,分别管理内存的on /OFF。如果睡眠定义未定义,设备将始终处于活动模式。为了使用SPI唤醒,您可以设置external_wakeup模式,并且您可以在收到外部中断时唤醒系统。
希望这能回答你的问题……
问候,
信用证
亲爱的信用证,
谢谢你的回答。我让它按我的计划运转了。(不幸的是,我在从NVDS内存中读取name标记的代码中犯了一个错误。)
关于一个)
代码中不清楚SPI_DIV的值是什么意思(没有可用的数据表)。你能告诉我吗?
关于B)
如果我没理解错的话。NVDS_TAG_SLEEP_ENABLE和NVDS_TAG_EXT_WAKEUP_ENABLE必须在NVDS内存中启用,并且必须定义CFG_MEM_MAP_EXT_SLEEP和CFG_EXTERNAL_WAKEUP,并且必须定义唤醒引脚
user_peripheral_setup.h
.中定义CFG_APP时,外部唤醒是否工作
da1458x_config_basic.h
?因为CFG_APP定义了BLE_APP_PRESENT,因此external_wakeup_enable ()
将不会在arch_main.c
.你好Wouter,
听说你能把它修好,我很高兴
A) SPI_DIV是CLK_PER_REG寄存器的一部分(Bits 8,9),它控制系统内不同外设的时钟。这将用XTAL时钟除以您提供给它的值。你可以提供4个不同的值,将时钟除以1/ 2/ 4/ 8。这在数据表14580(在我的案例中是第29页)中引用,你可以在支持网站下载。
B)关于这一点,我想知道,
您是否在14580 M0上使用任何外部处理器系统或主机应用程序?既然你提到了从SPI通信中醒来,它连接到什么?你能详细说明这个用例吗?
问候,
信用证
你好,信用证,
B) DA14580作为收发器,在通过SPI连接的本地MCU和远程的蓝牙平台之间交换数据包。因此DA14580一直处于空闲状态,直到本地MCU或远程平台需要发送数据。
问候,
Wouter
你好Wouter,
如果我理解正确的话,你正在使用外部MCU配置?你和MCU上的App是否通过GTL接口连接到外部MCU ?
我还建议大家看看ble_app_all_in_one或ble_app_sleepmode在SDK中提供的项目,因为他们展示了使用外部唤醒的睡眠模式唤醒的使用,这将给你一个选项从OTP可选运行,否则是强制性的启用deep_sleep_mode.
而且,我不建议你在arch_main文件。一般来说,您应该能够启用deep_sleep_mode通过在user_config.h通过设置所需的标志,在OTP内存中运行应用程序。这个简单的设置应该让您使用deep_sleep_mode.
问候,
信用证
你好,信用证,
我想我创造了一个混合版本;在蓝牙模块上,一个独立的应用程序正在运行,它管理连接和SPI接口。SPI接口仅用于发送和接收分别通过空中接收或需要发送的数据。这意味着CF_APP定义在
da1458x_config_basic.h
因此BLE_APP_PRESENT。我不清楚什么需要定义,什么需要定义。
问候,
Wouter
你好Wouter,
如果我理解正确的话,您只有一个单处理器系统。因此,在单个处理器系统中,您不必担心CFG_EXTERNAL_WAKEUP、NVDS_TAG_EXT_WAKEUP_ENABLE和ext_wakeup_enable()。这些仅用于外部处理器配置。
在单处理器配置中,你必须在config.h中启用睡眠模式的类型(deep_sleep或extended_sleep)。为按键按下的外部输入启用各自的gpio,并在检测到按键按下时设置回调功能。请参阅该支持门户上提供的项目ble_app_sleepmode和用户手册文档UM-B-006。该项目设置了几个回调函数,以检测按钮按下和当按钮被按下时必须做什么。如有任何问题,请与我联系。
问候,
信用证