亲爱的读者,
根据外围示例代码,我为自己的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,
我为耽搁道歉。请查收我们对你方问题的分析
您无法在OTP中保留部分NVDS和代码中的另一个部分。当您在没有的情况下刻录OTP中的代码CFG_INITILIALIZE_NVDS_STRUCT定义你离开整体。
在OTP图像中的NVDS区域为空,您可以使用NVDS OTP工具刻录。稍后,您必须使用OTP NVDS选项卡(内存偏移值为0 x340直到0x440).那么你
必须要么在代码中刻录带有NVDS数据的图像,要么随后使用OTP NVDS工具刻录图像。
您提到的#defines是用于定义/ undefine的合适文件,以便在刻录过程中从OTP引导。确保OTP标题中的应用程序标志均刻录为“是”,以便为引导加载程序使OTP镜像发生(您可以通过选中引导加载程序是否正在通过打开UART端口来检查并检查RX TX引脚是否执行此操作切换)。
如果这帮助你解决了问题,请让我们知道,或者如果你有任何其他问题。
问候,
lc_dialog.
亲爱的对话框,
谢谢你的回答。我知道你在答复中指出的问题。不幸的是,它帮不了我。与
CFG_INITILIALIZE_NVDS_STRUCT
定义该设备按照OTP正确按计划运行和靴子。但是,当我称之为这个设备A并且我刻录一个名为B的第二个设备CFG_INITILIALIZE_NVDS_STRUCT
未定义的并使用OTP NVDS工具将NVDS内存从设备A复制到设备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模式,并且您可以在收到外部中断时唤醒系统。
希望这能回答你的问题……
问候,
信用证
亲爱的LC,
谢谢你的回答。我打算它的工作。(不幸的是,我在从NVDS内存中读取名称标记的代码中遇到了错误。)
关于一个)
从代码中尚不清楚spi_div的值(无数据表提供)。你能告诉我吗?
关于B)
所以,如果我理解正确。必须在NVDS内存中启用NVDS_TAG_SLEEP_ENABLE和NVDS_TAG_EXT_WAKEUP_ENABLES,并且必须定义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寄存器的零件(位8,9),其将时钟控制到系统内的不同外围设备。这将通过为其提供的值划分XTAL时钟。并且您可以提供4个不同的值来将时钟划分为1/2 / 4/8次。这是在14580的数据表中引用(在我的情况下第29页),您可以在支持网站中下载。
B)关于这一点,我想知道,
您是否在14580 M0上使用任何外部处理器系统或主机应用程序?既然你提到了从SPI通信中醒来,它连接到什么?你能详细说明这个用例吗?
问候,
信用证
你好LC,
B) DA14580作为收发器,在通过SPI连接的本地MCU和远程的蓝牙平台之间交换数据包。因此DA14580一直处于空闲状态,直到本地MCU或远程平台需要发送数据。
问候,
Wouter
你好Wouter,
如果我理解正确的话,你正在使用外部MCU配置?你和MCU上的App是否通过GTL接口连接到外部MCU ?
我还建议大家看看ble_app_all_in_one或者ble_app_sleepmodeSDK中提供的项目在SDK中展示使用外部唤醒使用SleepMode唤醒,这将为您提供从OTP可选的选项,否则必须强制启用deep_sleep_mode..
而且,我不建议你在arch_main文件。一般来说,你应该是albe启用deep_sleep_mode.通过配置user_config.h.通过设置所需的标志,在OTP内存中运行应用程序。这个简单的设置应该让您使用deep_sleep_mode..
问候,
信用证
你好LC,
我想我创造了一个混合版本;在蓝牙模块上,一个独立的应用程序正在运行,它管理连接和SPI接口。SPI接口仅用于发送和接收分别通过空中接收或需要发送的数据。这意味着CF_APP定义在
da1458x_config_basic.h
因此ble_app_present。我不清楚什么需要定义,什么需要定义。
问候,
Wouter
你好Wouter,
如果我理解正确的话,您只有一个单处理器系统。因此,在单个处理器系统中,您不必担心CFG_EXTERNAL_WAKEUP、NVDS_TAG_EXT_WAKEUP_ENABLE和ext_wakeup_enable()。这些仅用于外部处理器配置。
在您的单个处理器Configuratoin中,您必须在Config.h中启用睡眠模式类型(Deep_sleep或Extended_sleep)。为按钮进行按钮启用extrnal输入的相应GPIO,然后在检测按钮按下时设置回调函数。请参阅此支持门户网站上的项目BLE_APP_SLEEPMODE和用户手册文档UM-B-006。该项目设置了几个回拨功能,以检测按钮按下,并按下该按钮必须完成的内容。如果您在这方面有其他问题,请告诉我。
问候,
信用证